powerpc/mm: Add memory barrier in __hugepte_alloc()
authorSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Thu, 24 Mar 2016 06:07:57 +0000 (02:07 -0400)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 21 Jul 2016 10:13:28 +0000 (20:13 +1000)
__hugepte_alloc() uses kmem_cache_zalloc() to allocate a zeroed PTE
and proceeds to use the newly allocated PTE. Add a memory barrier to
make sure that the other CPUs see a properly initialized PTE.

Based on a fix suggested by James Dykman.

Reported-by: James Dykman <jdykman@us.ibm.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Tested-by: James Dykman <jdykman@us.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/hugetlbpage.c

index 5aac1a3..6be21e0 100644 (file)
@@ -81,6 +81,13 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp,
        if (! new)
                return -ENOMEM;
 
+       /*
+        * Make sure other cpus find the hugepd set only after a
+        * properly initialized page table is visible to them.
+        * For more details look for comment in __pte_alloc().
+        */
+       smp_wmb();
+
        spin_lock(&mm->page_table_lock);
 #ifdef CONFIG_PPC_FSL_BOOK3E
        /*