mm: add an explicit smp_wmb() to UFFDIO_CONTINUE
[sfrench/cifs-2.6.git] / mm / hugetlb.c
index bb17e5c22759bb770f403a4d72cb8b76ca00b548..23ef240ba48a60a77102f7bf1beb2e76a987486d 100644 (file)
@@ -6780,11 +6780,20 @@ int hugetlb_mfill_atomic_pte(pte_t *dst_pte,
        }
 
        /*
-        * The memory barrier inside __folio_mark_uptodate makes sure that
-        * preceding stores to the page contents become visible before
-        * the set_pte_at() write.
+        * If we just allocated a new page, we need a memory barrier to ensure
+        * that preceding stores to the page become visible before the
+        * set_pte_at() write. The memory barrier inside __folio_mark_uptodate
+        * is what we need.
+        *
+        * In the case where we have not allocated a new page (is_continue),
+        * the page must already be uptodate. UFFDIO_CONTINUE already includes
+        * an earlier smp_wmb() to ensure that prior stores will be visible
+        * before the set_pte_at() write.
         */
-       __folio_mark_uptodate(folio);
+       if (!is_continue)
+               __folio_mark_uptodate(folio);
+       else
+               WARN_ON_ONCE(!folio_test_uptodate(folio));
 
        /* Add shared, newly allocated pages to the page cache. */
        if (vm_shared && !is_continue) {