mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 12:52:29 -04:00
mm/ksm: avoid missing ksmd wakeups in ksm_enter
__ksm_enter() decides whether ksmd needs a wakeup by checking if the mm
slot list is empty before inserting the new slot.
The empty check is currently outside ksm_mmlist_lock. Another CPU can
remove the last slot and let ksmd go back to sleep after the unlocked
check, while this CPU inserts a new slot and skips the wakeup based on the
stale result.
Take ksm_mmlist_lock before checking the list so the empty-to-nonempty
transition and the insertion are observed as one critical section.
Link: https://lore.kernel.org/20260805132736.1063408-1-xialonglong2025@163.com
Fixes: 6e15838425 ("ksm: keep quiet while list empty")
Signed-off-by: Longlong Xia <xialonglong@kylinos.cn>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Chengming Zhou <chengming.zhou@linux.dev>
Cc: Izik Eidus <ieidus@redhat.com>
Cc: xu xin <xu.xin16@zte.com.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
2bee308f3a
commit
3c37cac718
3
mm/ksm.c
3
mm/ksm.c
@@ -3060,10 +3060,9 @@ int __ksm_enter(struct mm_struct *mm)
|
||||
|
||||
slot = &mm_slot->slot;
|
||||
|
||||
spin_lock(&ksm_mmlist_lock);
|
||||
/* Check ksm_run too? Would need tighter locking */
|
||||
needs_wakeup = list_empty(&ksm_mm_head.slot.mm_node);
|
||||
|
||||
spin_lock(&ksm_mmlist_lock);
|
||||
mm_slot_insert(mm_slots_hash, mm, slot);
|
||||
/*
|
||||
* When KSM_RUN_MERGE (or KSM_RUN_STOP),
|
||||
|
||||
Reference in New Issue
Block a user