All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH stable 4.9,4.14 1/2] mm/khugepaged: fix GUP-fast interaction by sending IPI
@ 2022-12-06 17:16 Jann Horn
  2022-12-06 17:16 ` [PATCH stable 4.9,4.14 2/2] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
                   ` (12 more replies)
  0 siblings, 13 replies; 15+ messages in thread
From: Jann Horn @ 2022-12-06 17:16 UTC (permalink / raw)
  To: stable

commit 2ba99c5e08812494bc57f319fb562f527d9bacd8 upstream.

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.

Link: https://lkml.kernel.org/r/20221129154730.2274278-2-jannh@google.com
Link: https://lkml.kernel.org/r/20221128180252.1684965-2-jannh@google.com
Link: https://lkml.kernel.org/r/20221125213714.4115729-2-jannh@google.com
Fixes: ba76149f47d8 ("thp: khugepaged")
Signed-off-by: Jann Horn <jannh@google.com>
Reviewed-by: Yang Shi <shy828301@gmail.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
[manual backport: two of the three places in khugepaged that can free
ptes were refactored into a common helper between 5.15 and 6.0;
TLB flushing was refactored between 5.4 and 5.10;
TLB flushing was refactored between 4.19 and 5.4;
pmd collapse for PTE-mapped THP was only added in 5.4]
Signed-off-by: Jann Horn <jannh@google.com>
---
 include/asm-generic/tlb.h | 6 ++++++
 mm/khugepaged.c           | 2 ++
 mm/memory.c               | 5 +++++
 3 files changed, 13 insertions(+)

diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
index 5e7e4aaf36c5..43409a047480 100644
--- a/include/asm-generic/tlb.h
+++ b/include/asm-generic/tlb.h
@@ -60,6 +60,12 @@ struct mmu_table_batch {
 extern void tlb_table_flush(struct mmu_gather *tlb);
 extern void tlb_remove_table(struct mmu_gather *tlb, void *table);
 
+void tlb_remove_table_sync_one(void);
+
+#else
+
+static inline void tlb_remove_table_sync_one(void) { }
+
 #endif
 
 /*
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index f426d42d629d..f67c02010add 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1046,6 +1046,7 @@ static void collapse_huge_page(struct mm_struct *mm,
 	_pmd = pmdp_collapse_flush(vma, address, pmd);
 	spin_unlock(pmd_ptl);
 	mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
+	tlb_remove_table_sync_one();
 
 	spin_lock(pte_ptl);
 	isolated = __collapse_huge_page_isolate(vma, address, pte);
@@ -1295,6 +1296,7 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
 				_pmd = pmdp_collapse_flush(vma, addr, pmd);
 				spin_unlock(ptl);
 				atomic_long_dec(&mm->nr_ptes);
+				tlb_remove_table_sync_one();
 				pte_free(mm, pmd_pgtable(_pmd));
 			}
 			up_write(&mm->mmap_sem);
diff --git a/mm/memory.c b/mm/memory.c
index 615cb3fe763d..0136af15ba18 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -373,6 +373,11 @@ static void tlb_remove_table_smp_sync(void *arg)
 	/* Simply deliver the interrupt */
 }
 
+void tlb_remove_table_sync_one(void)
+{
+	smp_call_function(tlb_remove_table_smp_sync, NULL, 1);
+}
+
 static void tlb_remove_table_one(void *table)
 {
 	/*

base-commit: 179ef7fe86775fe32bd1bfe791887d1994ddcfb0
-- 
2.39.0.rc0.267.gcb52ba06e7-goog


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-12-12  3:04 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-06 17:16 [PATCH stable 4.9,4.14 1/2] mm/khugepaged: fix GUP-fast interaction by sending IPI Jann Horn
2022-12-06 17:16 ` [PATCH stable 4.9,4.14 2/2] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.10,5.15 2/3] mm/khugepaged: fix GUP-fast interaction by sending IPI Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.10,5.15 3/3] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.10,5.15 1/3] mm/khugepaged: take the right locks for page table retraction Jann Horn
2022-12-06 17:16 ` [PATCH stable 4.19 1/2] mm/khugepaged: fix GUP-fast interaction by sending IPI Jann Horn
2022-12-12  3:04   ` Sasha Levin
2022-12-06 17:16 ` [PATCH stable 4.19 2/2] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.4 2/3] mm/khugepaged: fix GUP-fast interaction by sending IPI Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.4 3/3] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
2022-12-06 17:16 ` [PATCH stable 5.4 1/3] mm/khugepaged: take the right locks for page table retraction Jann Horn
2022-12-06 17:16 ` [PATCH stable 6.0 2/3] mm/khugepaged: fix GUP-fast interaction by sending IPI Jann Horn
2022-12-06 17:16 ` [PATCH stable 6.0 3/3] mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths Jann Horn
2022-12-06 17:16 ` [PATCH stable 6.0 1/3] mm/khugepaged: take the right locks for page table retraction Jann Horn
2022-12-08 13:54 ` [PATCH stable 4.9,4.14 1/2] mm/khugepaged: fix GUP-fast interaction by sending IPI Sasha Levin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.