powerpc/mm/cxl: Add the fault handling cpu to mm cpumask
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Thu, 27 Jul 2017 06:24:55 +0000 (11:54 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 17 Aug 2017 13:31:52 +0000 (23:31 +1000)
We use mm cpumask for serializing against lockless page table walk.
Anybody who is doing a lockless page table walk is expected to disable
irq and only cpus in mm cpumask is expected do the lockless walk. This
ensure that a THP split can send IPI to only cpus in the mm cpumask,
to make sure there are no parallel lockless page table walk.

Add the CAPI fault handling cpu to the mm cpumask so that we can do
the lockless page table walk while inserting hash page table entries.

Reviewed-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/pgtable-book3s64.c
drivers/misc/cxl/fault.c

index 57b947cde2bf771bc3446d946cc8eba8c9c2943b..3b65917785a5789a771e6befc1c09d4c03d876de 100644 (file)
@@ -83,15 +83,7 @@ static void do_nothing(void *unused)
 void serialize_against_pte_lookup(struct mm_struct *mm)
 {
        smp_mb();
-       /*
-        * Cxl fault handling requires us to do a lockless page table
-        * walk while inserting hash page table entry with mm tracked
-        * in cxl context. Hence we need to do a global flush.
-        */
-       if (cxl_ctx_in_use())
-               smp_call_function(do_nothing, NULL, 1);
-       else
-               smp_call_function_many(mm_cpumask(mm), do_nothing, NULL, 1);
+       smp_call_function_many(mm_cpumask(mm), do_nothing, NULL, 1);
 }
 
 /*
index 6eed7d03e2b528e06c3361a869ddbf598f1b6177..ab507e4ed69b073317b035638b6a7236cfce87fb 100644 (file)
@@ -138,6 +138,12 @@ int cxl_handle_mm_fault(struct mm_struct *mm, u64 dsisr, u64 dar)
        int result;
        unsigned long access, flags, inv_flags = 0;
 
+       /*
+        * 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.
+        */
+       cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
        if ((result = copro_handle_mm_fault(mm, dar, dsisr, &flt))) {
                pr_devel("copro_handle_mm_fault failed: %#x\n", result);
                return result;