aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2021-01-20 14:35:31 -0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2021-01-20 14:35:31 -0300
commitcd07e536b0201fceffd90a701bfb1e1fc07fcd34 (patch)
tree4777d4b2f749b279fc07bd41f11b88c9e4578afe /mm/memory.c
parentperf tools: Add 'ping' control command (diff)
parentMerge tag 'task_work-2021-01-19' of git://git.kernel.dk/linux-block (diff)
downloadlinux-cd07e536b0201fceffd90a701bfb1e1fc07fcd34.tar.gz
linux-cd07e536b0201fceffd90a701bfb1e1fc07fcd34.zip
Merge remote-tracking branch 'torvalds/master' into perf/core
To pick up fixes. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 7d608765932b..feff48e1465a 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2892,11 +2892,13 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf)
entry = mk_pte(new_page, vma->vm_page_prot);
entry = pte_sw_mkyoung(entry);
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
+
/*
* Clear the pte entry and flush it first, before updating the
- * pte with the new entry. This will avoid a race condition
- * seen in the presence of one thread doing SMC and another
- * thread doing COW.
+ * pte with the new entry, to keep TLBs on different CPUs in
+ * sync. This code used to set the new PTE then flush TLBs, but
+ * that left a window where the new PTE could be loaded into
+ * some TLBs while the old PTE remains in others.
*/
ptep_clear_flush_notify(vma, vmf->address, vmf->pte);
page_add_new_anon_rmap(new_page, vma, vmf->address, false);