Re: [PATCH 8/9] powerpc/mm: Wire up hpte_removebolted for powernv
From: Anton Blanchard <hidden>
Date: 2017-04-11 22:51:12
Also in:
nvdimm
Hi Oliver,
From: Rashmica Gupta <redacted> 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. Cc: Rashmica Gupta <redacted> Cc: Anton Blanchard <redacted> Signed-off-by: Oliver O'Halloran <oohall@gmail.com> --- Could the original author of this add their S-o-b? I pulled it out of Rashmica's memtrace patch, but I remember someone saying Anton wrote it originally.
I did. Signed-off-by: Anton Blanchard <redacted> Anton
quoted hunk ↗ jump to hunk
--- arch/powerpc/mm/hash_native_64.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)diff --git a/arch/powerpc/mm/hash_native_64.cb/arch/powerpc/mm/hash_native_64.c index 65bb8f33b399..9ba91d4905a4 100644 --- a/arch/powerpc/mm/hash_native_64.c+++ b/arch/powerpc/mm/hash_native_64.c@@ -407,6 +407,36 @@ static void native_hpte_updateboltedpp(unsignedlong 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; + + /* 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) {@@ -725,6 +755,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;