FAILED: patch "[PATCH] mm/khugepaged: fix GUP-fast interaction by sending IPI" failed to apply to 4.9-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
2ba99c5e0881 ("mm/khugepaged: fix GUP-fast interaction by sending IPI") 8d3c106e19e8 ("mm/khugepaged: take the right locks for page table retraction") 34488399fa08 ("mm/madvise: add file and shmem support to MADV_COLLAPSE") 58ac9a8993a1 ("mm/khugepaged: attempt to map file/shmem-backed pte-mapped THPs by pmds") 780a4b6fb865 ("mm/khugepaged: check compound_order() in collapse_pte_mapped_thp()") b26e27015ec9 ("mm: thp: convert to use common struct mm_slot")685405020b9f ("mm/khugepaged: stop using vma linked list")7d2c4385c341 ("mm/khugepaged: rename prefix of shared collapse functions") 7d8faaf15545 ("mm/madvise: introduce MADV_COLLAPSE sync hugepage collapse") 507228044236 ("mm/khugepaged: record SCAN_PMD_MAPPED when scan_pmd() finds hugepage") a7f4e6e4c47c ("mm/thp: add flag to enforce sysfs THP in hugepage_vma_check()") 50ad2f24b3b4 ("mm/khugepaged: propagate enum scan_result codes back to callers") 9710a78ab2ae ("mm/khugepaged: dedup and simplify hugepage alloc and charging") 34d6b470ab9c ("mm/khugepaged: add struct collapse_control")c6a7f445a272 ("mm: khugepaged: don't carry huge page to the next loop for !CONFIG_NUMA") 1064026bab9f ("mm: khugepaged: reorg some khugepaged helpers")7da4e2cb8b1f ("mm: thp: kill __transhuge_page_enabled()")9fec51689ff6 ("mm: thp: kill transparent_hugepage_active()")f707fa493784 ("mm: khugepaged: better comments for anon vma check in hugepage_vma_revalidate") 4fa6893faeaa ("mm: thp: consolidate vma size check to transhuge_vma_suitable")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2ba99c5e08812494bc57f319fb562f527d9bacd8 Mon Sep 17 00:00:00 2001
From: Jann Horn <[email protected]>
Date: Fri, 25 Nov 2022 22:37:13 +0100
Subject: [PATCH] mm/khugepaged: fix GUP-fast interaction by sending IPI
Since commit 70cbc3cc78a99 ("mm: gup: fix the fast GUP race against THP collapse"), the lockless_pages_from_mm() fastpath rechecks the pmd_t to ensure that the page table was not removed by khugepaged in between.
However, lockless_pages_from_mm() still requires that the page table is not concurrently freed. Fix it by sending IPIs (if the architecture uses semi-RCU-style page table freeing) before freeing/reusing page tables.
include/asm-generic/tlb.h +4 -0
@@ -222,12 +222,16 @@ extern void tlb_remove_table(struct mmu_gather *tlb, void *table);#define tlb_needs_table_invalidate () (true)#endif +void tlb_remove_table_sync_one (void ); +#else #ifdef tlb_needs_table_invalidate#error tlb_needs_table_invalidate() requires MMU_GATHER_RCU_TABLE_FREE#endif +static inline void tlb_remove_table_sync_one (void ) { } +#endif /* CONFIG_MMU_GATHER_RCU_TABLE_FREE */
mm/khugepaged.c +2 -0
@@ -1051,6 +1051,7 @@ static int collapse_huge_page(struct mm_struct *mm, unsigned long address, _pmd =pmdp_collapse_flush (vma, address, pmd);spin_unlock (pmd_ptl);mmu_notifier_invalidate_range_end (&range); +tlb_remove_table_sync_one ();spin_lock (pte_ptl); result = __collapse_huge_page_isolate(vma, address, pte, cc,
@@ -1410,6 +1411,7 @@ static void collapse_and_free_pmd(struct mm_struct *mm, struct vm_area_struct *vlockdep_assert_held_write (&vma->anon_vma->root->rwsem); pmd =pmdp_collapse_flush (vma, addr, pmdp); +tlb_remove_table_sync_one ();mm_dec_nr_ptes (mm);page_table_check_pte_clear_range (mm, addr, pmd);pte_free (mm,pmd_pgtable (pmd));
mm/mmu_gather.c +1 -3
@@ -153,7 +153,7 @@ static void tlb_remove_table_smp_sync(void *arg)/* Simply deliver the interrupt */ } -static void tlb_remove_table_sync_one (void ) +void tlb_remove_table_sync_one (void ) {/* * This isn't an RCU grace period and hence the page-tables cannot be
@@ -177,8 +177,6 @@ static void tlb_remove_table_free(struct mmu_table_batch *batch)#else /* !CONFIG_MMU_GATHER_RCU_TABLE_FREE */ -static void tlb_remove_table_sync_one (void ) { } -static void tlb_remove_table_free (struct mmu_table_batch *batch) {__tlb_remove_table_free (batch);