powerpc/mm: Wire up hpte_removebolted for powernv
authorAnton Blanchard <anton@samba.org>
Wed, 28 Jun 2017 01:32:35 +0000 (11:32 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 2 Jul 2017 10:40:28 +0000 (20:40 +1000)
Adds support for removing bolted (i.e kernel linear mapping) mappings on
powernv. This is needed to support memory hot unplug operations which
are required for the teardown of DAX/PMEM devices.

Reviewed-by: Balbir Singh <bsingharora@gmail.com>
Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/hash_native_64.c

index fbd1acc3b8d91f88006c09c233402f5151f90866..3848af167df9de4b183d7cb8472b5d20ce97d0a4 100644 (file)
@@ -413,6 +413,38 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
        tlbie(vpn, psize, psize, ssize, 0);
 }
 
+/*
+ * Remove a bolted kernel entry. Memory hotplug uses this.
+ *
+ * No need to lock here because we should be the only user.
+ */
+static int native_hpte_removebolted(unsigned long ea, int psize, int ssize)
+{
+       unsigned long vpn;
+       unsigned long vsid;
+       long slot;
+       struct hash_pte *hptep;
+
+       vsid = get_kernel_vsid(ea, ssize);
+       vpn = hpt_vpn(ea, vsid, ssize);
+
+       slot = native_hpte_find(vpn, psize, ssize);
+       if (slot == -1)
+               return -ENOENT;
+
+       hptep = htab_address + slot;
+
+       VM_WARN_ON(!(be64_to_cpu(hptep->v) & HPTE_V_BOLTED));
+
+       /* Invalidate the hpte */
+       hptep->v = 0;
+
+       /* Invalidate the TLB */
+       tlbie(vpn, psize, psize, ssize, 0);
+       return 0;
+}
+
+
 static void native_hpte_invalidate(unsigned long slot, unsigned long vpn,
                                   int bpsize, int apsize, int ssize, int local)
 {
@@ -731,6 +763,7 @@ void __init hpte_init_native(void)
        mmu_hash_ops.hpte_invalidate    = native_hpte_invalidate;
        mmu_hash_ops.hpte_updatepp      = native_hpte_updatepp;
        mmu_hash_ops.hpte_updateboltedpp = native_hpte_updateboltedpp;
+       mmu_hash_ops.hpte_removebolted = native_hpte_removebolted;
        mmu_hash_ops.hpte_insert        = native_hpte_insert;
        mmu_hash_ops.hpte_remove        = native_hpte_remove;
        mmu_hash_ops.hpte_clear_all     = native_hpte_clear;