powerpc/mm: Add radix__tlb_flush_pte_p9_dd1()
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Mon, 28 Nov 2016 06:17:01 +0000 (11:47 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 28 Nov 2016 11:43:45 +0000 (22:43 +1100)
Now that we have page size details encoded in pte using software pte
bits, use that to find the page size needed for tlb flush.

This function should only be used on P9 DD1, so give it a horrible name
to make that clear.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/book3s/64/tlbflush-radix.h
arch/powerpc/mm/tlb-radix.c

index a9e19cb2f7c559621cc870d49d25c5e36b062463..cc7fbde4f53cac09b257f9a7ff4f1202af7c3c98 100644 (file)
@@ -42,4 +42,6 @@ extern void radix__flush_tlb_lpid_va(unsigned long lpid, unsigned long gpa,
                                     unsigned long page_size);
 extern void radix__flush_tlb_lpid(unsigned long lpid);
 extern void radix__flush_tlb_all(void);
+extern void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm,
+                                       unsigned long address);
 #endif
index bda8c43be78a4df85d067bc4a7759c63c388d29b..2822a8277f0bdda1beca60b605912af90857881a 100644 (file)
@@ -424,3 +424,21 @@ void radix__flush_tlb_all(void)
                     : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(0) : "memory");
        asm volatile("eieio; tlbsync; ptesync": : :"memory");
 }
+
+void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm,
+                                unsigned long address)
+{
+       /*
+        * We track page size in pte only for DD1, So we can
+        * call this only on DD1.
+        */
+       if (!cpu_has_feature(CPU_FTR_POWER9_DD1)) {
+               VM_WARN_ON(1);
+               return;
+       }
+
+       if (old_pte & _PAGE_LARGE)
+               radix__flush_tlb_page_psize(mm, address, MMU_PAGE_2M);
+       else
+               radix__flush_tlb_page_psize(mm, address, mmu_virtual_psize);
+}