.. SPDX-License-Identifier: GPL-2.0 ======= Reclaim ======= Another way CXL memory can be utilized *indirectly* is via the reclaim system in :code:`mm/vmscan.c`. Reclaim is engaged when memory capacity on the system becomes pressured based on global and cgroup-local `watermark` settings. In this section we won't discuss the `watermark` configurations, just how CXL memory can be consumed by various pieces of reclaim system. Demotion ======== By default, the reclaim system will prefer swap (or zswap) when reclaiming memory. Enabling :code:`kernel/mm/numa/demotion_enabled` will cause vmscan to opportunistically prefer distant NUMA nodes to swap or zswap, if capacity is available. Demotion engages the :code:`mm/memory_tier.c` component to determine the next demotion node. The next demotion node is based on the :code:`HMAT` or :code:`CDAT` performance data. cpusets.mems_allowed quirk -------------------------- In Linux v6.15 and below, demotion does not respect :code:`cpusets.mems_allowed` when migrating pages. As a result, if demotion is enabled, vmscan cannot guarantee isolation of a container's memory from nodes not set in mems_allowed. In Linux v6.XX and up, demotion does attempt to respect :code:`cpusets.mems_allowed`; however, certain classes of shared memory originally instantiated by another cgroup (such as common libraries - e.g. libc) may still be demoted. As a result, the mems_allowed interface still cannot provide perfect isolation from the remote nodes. ZSwap and Node Preference ========================= In Linux v6.15 and below, ZSwap allocates memory from the local node of the processor for the new pages being compressed. Since pages being compressed are typically cold, the result is a cold page becomes promoted - only to be later demoted as it ages off the LRU. In Linux v6.XX, ZSwap tries to prefer the node of the page being compressed as the allocation target for the compression page. This helps prevent thrashing. Demotion with ZSwap =================== When enabling both Demotion and ZSwap, you create a situation where ZSwap will prefer the slowest form of CXL memory by default until that tier of memory is exhausted.