powerpc: introduce pte_get_hash_gslot() helper
authorRam Pai <linuxram@us.ibm.com>
Mon, 6 Nov 2017 08:50:46 +0000 (00:50 -0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 20 Dec 2017 07:57:19 +0000 (18:57 +1100)
Introduce pte_get_hash_gslot()() which returns the global slot number of
the HPTE in the global hash table.

This function will come in handy as we work towards re-arranging the PTE
bits in the later patches.

Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/book3s/64/hash.h
arch/powerpc/mm/hash_utils_64.c

index ecb1239d74f4bb4ee7c04f51a362b2be76588dfe..9099c1f3a54efd2a70aac179721ec329e9120bcb 100644 (file)
@@ -167,6 +167,9 @@ static inline int hash__pte_none(pte_t pte)
        return (pte_val(pte) & ~H_PTE_NONE_MASK) == 0;
 }
 
+unsigned long pte_get_hash_gslot(unsigned long vpn, unsigned long shift,
+               int ssize, real_pte_t rpte, unsigned int subpg_index);
+
 /* This low level function performs the actual PTE insertion
  * Setting the PTE depends on the MMU type and other factors. It's
  * an horrible mess that I'm not going to try to clean up now but
index 655a5a9a183d732dc332b2c926a87c8a4f714efa..b35bd02029348aeee2edd68a7bf9325d0bc884bb 100644 (file)
@@ -1592,6 +1592,24 @@ static inline void tm_flush_hash_page(int local)
 }
 #endif
 
+/*
+ * Return the global hash slot, corresponding to the given PTE, which contains
+ * the HPTE.
+ */
+unsigned long pte_get_hash_gslot(unsigned long vpn, unsigned long shift,
+               int ssize, real_pte_t rpte, unsigned int subpg_index)
+{
+       unsigned long hash, gslot, hidx;
+
+       hash = hpt_hash(vpn, shift, ssize);
+       hidx = __rpte_to_hidx(rpte, subpg_index);
+       if (hidx & _PTEIDX_SECONDARY)
+               hash = ~hash;
+       gslot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
+       gslot += hidx & _PTEIDX_GROUP_IX;
+       return gslot;
+}
+
 /* WARNING: This is called from hash_low_64.S, if you change this prototype,
  *          do not forget to update the assembly call site !
  */