sched/numa: Move up the access pid reset logic

[ Upstream commit 2e2675db19 ]

Recent NUMA hinting faulting activity is reset approximately every
VMA_PID_RESET_PERIOD milliseconds. However, if the current task has not
accessed a VMA then the reset check is missed and the reset is potentially
deferred forever. Check if the PID activity information should be reset
before checking if the current task recently trapped a NUMA hinting fault.

[ mgorman@techsingularity.net: Rewrite changelog ]

Suggested-by: Mel Gorman <mgorman@techsingularity.net>
Signed-off-by: Raghavendra K T <raghavendra.kt@amd.com>
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20231010083143.19593-5-mgorman@techsingularity.net
Stable-dep-of: f22cde4371 ("sched/numa: Fix the vma scan starving issue")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Raghavendra K T 2023-10-10 09:31:41 +01:00 committed by Greg Kroah-Hartman
parent 6654e54ae7
commit 7f01977665

View File

@ -3335,16 +3335,7 @@ static void task_numa_work(struct callback_head *work)
continue; continue;
} }
/* Do not scan the VMA if task has not accessed */ /* RESET access PIDs regularly for old VMAs. */
if (!vma_is_accessed(vma)) {
trace_sched_skip_vma_numa(mm, vma, NUMAB_SKIP_PID_INACTIVE);
continue;
}
/*
* RESET access PIDs regularly for old VMAs. Resetting after checking
* vma for recent access to avoid clearing PID info before access..
*/
if (mm->numa_scan_seq && if (mm->numa_scan_seq &&
time_after(jiffies, vma->numab_state->pids_active_reset)) { time_after(jiffies, vma->numab_state->pids_active_reset)) {
vma->numab_state->pids_active_reset = vma->numab_state->pids_active_reset + vma->numab_state->pids_active_reset = vma->numab_state->pids_active_reset +
@ -3353,6 +3344,12 @@ static void task_numa_work(struct callback_head *work)
vma->numab_state->pids_active[1] = 0; vma->numab_state->pids_active[1] = 0;
} }
/* Do not scan the VMA if task has not accessed */
if (!vma_is_accessed(vma)) {
trace_sched_skip_vma_numa(mm, vma, NUMAB_SKIP_PID_INACTIVE);
continue;
}
do { do {
start = max(start, vma->vm_start); start = max(start, vma->vm_start);
end = ALIGN(start + (pages << PAGE_SHIFT), HPAGE_SIZE); end = ALIGN(start + (pages << PAGE_SHIFT), HPAGE_SIZE);