+++ /dev/null
-From 6438a6013b9df7304281cf33953e8c7166e18fc2 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 14 Aug 2020 21:30:41 -0700
-Subject: mm/memory.c: skip spurious TLB flush for retried page fault
-
-From: Yang Shi <shy828301@gmail.com>
-
-[ Upstream commit b7333b58f358f38d90d78e00c1ee5dec82df10ad ]
-
-Recently we found regression when running will_it_scale/page_fault3 test
-on ARM64. Over 70% down for the multi processes cases and over 20% down
-for the multi threads cases. It turns out the regression is caused by
-commit 89b15332af7c ("mm: drop mmap_sem before calling
-balance_dirty_pages() in write fault").
-
-The test mmaps a memory size file then write to the mapping, this would
-make all memory dirty and trigger dirty pages throttle, that upstream
-commit would release mmap_sem then retry the page fault. The retried
-page fault would see correct PTEs installed then just fall through to
-spurious TLB flush. The regression is caused by the excessive spurious
-TLB flush. It is fine on x86 since x86's spurious TLB flush is no-op.
-
-We could just skip the spurious TLB flush to mitigate the regression.
-
-Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
-Reported-by: Xu Yu <xuyu@linux.alibaba.com>
-Debugged-by: Xu Yu <xuyu@linux.alibaba.com>
-Tested-by: Xu Yu <xuyu@linux.alibaba.com>
-Cc: Johannes Weiner <hannes@cmpxchg.org>
-Cc: Catalin Marinas <catalin.marinas@arm.com>
-Cc: Will Deacon <will.deacon@arm.com>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Yang Shi <shy828301@gmail.com>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- mm/memory.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/mm/memory.c b/mm/memory.c
-index cb7c940cf800c..4d4c4d6782a22 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -3886,6 +3886,9 @@ static vm_fault_t handle_pte_fault(struct vm_fault *vmf)
- vmf->flags & FAULT_FLAG_WRITE)) {
- update_mmu_cache(vmf->vma, vmf->address, vmf->pte);
- } else {
-+ /* Skip spurious TLB flush for retried page fault */
-+ if (vmf->flags & FAULT_FLAG_TRIED)
-+ goto unlock;
- /*
- * This is needed only for protection faults but the arch code
- * is not yet telling us if this is a protection fault or not.
---
-2.25.1
-