mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
mm/khugepaged: always recheck the pmd in try_collapse_pte_mapped_thp()
try_collapse_pte_mapped_thp() drops the PTE lock after it has cleared the
page table, and takes the PMD lock and the PTE lock to remove it.
In between, MADV_DONTNEED with CONFIG_PT_RECLAIM can reclaim the
page table. The pmd_same() check is supposed to handle this, but it is
only done with CONFIG_SPLIT_PTE_PTLOCKS.
Fix it by performing the check unconditionally.
Fix generated by an LLM and sent by Josef Bacik in private.
Fixes: 6375e95f38 ("mm: pgtable: reclaim empty PTE page in madvise(MADV_DONTNEED)")
Cc: stable@vger.kernel.org
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
[ david: adjust description ]
Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
Tested-by: Gregory Price (Meta) <gourry@gourry.net>
Tested-by: Muhammad Usama Anjum <usama.anjum@arm.com>
Link: https://patch.msgid.link/20261031-fixes_core-v3-15-d6437171ecc3@kernel.org
Reviewed-by: Lance Yang <lance.yang@linux.dev>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
This commit is contained in:
parent
63a9405413
commit
aa72cf34d9
|
|
@ -2013,12 +2013,11 @@ static enum scan_result try_collapse_pte_mapped_thp(struct mm_struct *mm, unsign
|
|||
/* step 4: remove empty page table */
|
||||
if (!pml) {
|
||||
pml = pmd_lock(mm, pmd);
|
||||
if (ptl != pml) {
|
||||
if (ptl != pml)
|
||||
spin_lock_nested(ptl, SINGLE_DEPTH_NESTING);
|
||||
if (unlikely(!pmd_same(pgt_pmd, pmdp_get_lockless(pmd)))) {
|
||||
flush_tlb_mm(mm);
|
||||
goto unlock;
|
||||
}
|
||||
if (unlikely(!pmd_same(pgt_pmd, pmdp_get_lockless(pmd)))) {
|
||||
flush_tlb_mm(mm);
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
pgt_pmd = pmdp_collapse_flush(vma, haddr, pmd);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user