--- v1
+++ v8
@@ -1,61 +1,26 @@
-From: Peter Zijlstra <peterz@infradead.org>
+This configuration variable will be used to build the code needed to
+handle speculative page fault.
-One of the side effects of speculating on faults (without holding
-mmap_sem) is that we can race with free_pgtables() and therefore we
-cannot assume the page-tables will stick around.
+By default it is turned off, and activated depending on architecture
+support.
-Remove the reliance on the pte pointer.
+Suggested-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
+---
+ mm/Kconfig | 3 +++
+ 1 file changed, 3 insertions(+)
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
----
- mm/memory.c | 27 ---------------------------
- 1 file changed, 27 deletions(-)
-
-diff --git a/mm/memory.c b/mm/memory.c
-index f65beaad319b..d08f494f1b37 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -2103,30 +2103,6 @@ int apply_to_page_range(struct mm_struct *mm, unsigned long addr,
- }
- EXPORT_SYMBOL_GPL(apply_to_page_range);
+diff --git a/mm/Kconfig b/mm/Kconfig
+index c782e8fb7235..42be0d92336e 100644
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -760,3 +760,6 @@ config GUP_BENCHMARK
+ performance of get_user_pages_fast().
--/*
-- * handle_pte_fault chooses page fault handler according to an entry which was
-- * read non-atomically. Before making any commitment, on those architectures
-- * or configurations (e.g. i386 with PAE) which might give a mix of unmatched
-- * parts, do_swap_page must check under lock before unmapping the pte and
-- * proceeding (but do_wp_page is only called after already making such a check;
-- * and do_anonymous_page can safely check later on).
-- */
--static inline int pte_unmap_same(struct mm_struct *mm, pmd_t *pmd,
-- pte_t *page_table, pte_t orig_pte)
--{
-- int same = 1;
--#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)
-- if (sizeof(pte_t) > sizeof(unsigned long)) {
-- spinlock_t *ptl = pte_lockptr(mm, pmd);
-- spin_lock(ptl);
-- same = pte_same(*page_table, orig_pte);
-- spin_unlock(ptl);
-- }
--#endif
-- pte_unmap(page_table);
-- return same;
--}
--
- static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va, struct vm_area_struct *vma)
- {
- debug_dma_assert_idle(src);
-@@ -2683,9 +2659,6 @@ int do_swap_page(struct vm_fault *vmf)
- int exclusive = 0;
- int ret = 0;
-
-- if (!pte_unmap_same(vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte))
-- goto out;
--
- entry = pte_to_swp_entry(vmf->orig_pte);
- if (unlikely(non_swap_entry(entry))) {
- if (is_migration_entry(entry)) {
+ See tools/testing/selftests/vm/gup_benchmark.c
++
++config SPECULATIVE_PAGE_FAULT
++ bool
--
2.7.4