[PATCH 0/2] sched/numa: stop VMA scan filters from gating promotion

From: Gregory Price

Date: Fri Sep 04 2026 - 15:00:54 EST


task_numa_work() applies a series of VMA-level filters before it will mark
a VMA for hint faults. Those filters were written when the hint fault was
a socket-residency signal. Skipping a VMA only cost some resolution.

Under memory tiering the hint fault is not a signal, it is the mechanism.
A folio on the slow tier is considered for promotion only because the scan
marked it and something then touched it. A VMA excluded from the scan is
excluded from promotion, and stays excluded, because the filters take
their input from faults the scan itself produces.

Patch 1 covers the per-VMA PID filter, which is self-referential: a VMA
needs a hint fault to earn a scan, and a scan to produce a hint fault.

Patch 2 covers the read-only file mapping exclusion, whose premise:
"if we are never going to migrate the page, it is overhead for no gain"
only applies to socket-residency, not tier-residency.

Neither patch removes a filter.

Patch 1 adds vma->numab_state->slow_only, which restricts one scan of one
VMA to folios on non-toptier nodes, and scans the rejected VMAs under it.

Patch 2 reuses it. A toptier folio is never marked anywhere the filters
would not already have marked it, in any mode, so placement behaviour is
unchanged and only promotion candidates are added.

On a 768G DRAM + 256G CXL host running two ~430G database services:

before - DRAM bandwidth decayed from 200GB/s to 150GB/s, CXL climbed
from 5GB/s to 45GB/s and capped, request latency went from
800us to 5ms and tracked CXL bandwidth

after - DRAM holds 200-250GB/s, CXL holds 7-10GB/s, request latency
sits at 800us-2ms and tracks request load

Gregory Price (2):
sched/numa: do not let the per-VMA PID filter gate promotion
sched/numa: scan read-only file mappings in tiering mode

include/linux/mm_types.h | 7 +++++++
kernel/sched/fair.c | 41 ++++++++++++++++++++++++++++++++++------
mm/mempolicy.c | 9 +++++----
3 files changed, 47 insertions(+), 10 deletions(-)

--
2.55.0