Re: [stable-6.6.y] mm: khugepaged refuses to freeze
From: Baolin Wang
Date: Fri Feb 06 2026 - 03:57:54 EST
On 2/6/26 4:36 PM, David Hildenbrand (Arm) wrote:
On 2/6/26 06:12, Baolin Wang wrote:
On 2/6/26 12:31 PM, Sergey Senozhatsky wrote:
On (26/02/06 12:38), Sergey Senozhatsky wrote:
[..]
Right, I thought about it but wasn't sure. Could the inner loop (e.g.
collapse_file() in this particular case) loop long enough to fail suspend
w/o ever giving the outer loop (khugepaged_do_scan()) a chance to freeze?
Yes, that’s possible. However, if we add a try_to_freeze() check in the inner loop, we need to consider various scenarios (such as anonymous folio swap-in and other potential cases?), which feels too hacky to me.
For inner loops I wondered if cond_resched() could be an indicator of
where try_to_freeze() should be placed. Those cond_resched() calls
are there for a reason, after all. E.g. something like:
---
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index fa6a018b20a8..cee08466a069 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -2431,6 +2431,9 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, enum scan_result
unsigned long hstart, hend;
cond_resched();
+ if (try_to_freeze())
+ break;
+
if (unlikely(hpage_collapse_test_exit_or_disable(mm))) {
progress++;
break;
@@ -2453,6 +2456,9 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, enum scan_result
bool mmap_locked = true;
cond_resched();
+ if (try_to_freeze())
+ goto breakouterloop;
+
if (unlikely(hpage_collapse_test_exit_or_disable(mm)))
goto breakouterloop;
This looks better than the previous version. Let’s also wait to see if others have any better suggestions.
What prevents other callpaths (faults, read(), write(), etc) from similarly triggering swapin?
Usually it’s just a userspace process triggering one page fault to swap a page in, then will return to userspace. There aren’t other kernel threads like khugepaged continuously do swap-in in a loop.
I recall that there is a notifier when the system is preparing to sleep (pm notifier or something). Could we simply hook into that to tell khugepaged to suspend+resume?
Do you mean “struct dev_pm_ops”, which is used to register PM callbacks for devices? However, I don’t know how to use it with a kernel thread.
Also look at how kswapd does it, kswapd also uses kthread_freezable_should_stop() to check the freeze state.
Essentially, making hpage_collapse_test_exit_or_disable() break our for us.
Ah, yes, even better:)