powerpc/mm/cxl: Add barrier when setting mm cpumask
[linux-2.6-block.git] / drivers / misc / cxl / fault.c
index ab507e4ed69b073317b035638b6a7236cfce87fb..f17f72ea054554386e7cabe406cf386d31cee74c 100644 (file)
@@ -141,9 +141,19 @@ int cxl_handle_mm_fault(struct mm_struct *mm, u64 dsisr, u64 dar)
        /*
         * Add the fault handling cpu to task mm cpumask so that we
         * can do a safe lockless page table walk when inserting the
-        * hash page table entry.
+        * hash page table entry. This function get called with a
+        * valid mm for user space addresses. Hence using the if (mm)
+        * check is sufficient here.
         */
-       cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
+       if (mm && !cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) {
+               cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
+               /*
+                * We need to make sure we walk the table only after
+                * we update the cpumask. The other side of the barrier
+                * is explained in serialize_against_pte_lookup()
+                */
+               smp_mb();
+       }
        if ((result = copro_handle_mm_fault(mm, dar, dsisr, &flt))) {
                pr_devel("copro_handle_mm_fault failed: %#x\n", result);
                return result;