Commit 1c946c1b authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/mm/hash: Simplify the region id calculation.

This reduces multiple comparisons in get_region_id to a bit shift operation.
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 53ed7a59
...@@ -13,12 +13,14 @@ ...@@ -13,12 +13,14 @@
*/ */
#define MAX_EA_BITS_PER_CONTEXT 46 #define MAX_EA_BITS_PER_CONTEXT 46
#define REGION_SHIFT (MAX_EA_BITS_PER_CONTEXT - 2)
/* /*
* Our page table limit us to 64TB. Hence for the kernel mapping, * Our page table limit us to 64TB. Hence for the kernel mapping,
* each MAP area is limited to 16 TB. * each MAP area is limited to 16 TB.
* The four map areas are: linear mapping, vmap, IO and vmemmap * The four map areas are: linear mapping, vmap, IO and vmemmap
*/ */
#define H_KERN_MAP_SIZE (ASM_CONST(1) << (MAX_EA_BITS_PER_CONTEXT - 2)) #define H_KERN_MAP_SIZE (ASM_CONST(1) << REGION_SHIFT)
/* /*
* Define the address range of the kernel non-linear virtual area * Define the address range of the kernel non-linear virtual area
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
* is handled in the hotpath. * is handled in the hotpath.
*/ */
#define MAX_EA_BITS_PER_CONTEXT 49 #define MAX_EA_BITS_PER_CONTEXT 49
#define REGION_SHIFT MAX_EA_BITS_PER_CONTEXT
/* /*
* We use one context for each MAP area. * We use one context for each MAP area.
......
...@@ -83,26 +83,26 @@ ...@@ -83,26 +83,26 @@
#define H_VMEMMAP_SIZE H_KERN_MAP_SIZE #define H_VMEMMAP_SIZE H_KERN_MAP_SIZE
#define H_VMEMMAP_END (H_VMEMMAP_START + H_VMEMMAP_SIZE) #define H_VMEMMAP_END (H_VMEMMAP_START + H_VMEMMAP_SIZE)
#define NON_LINEAR_REGION_ID(ea) ((((unsigned long)ea - H_KERN_VIRT_START) >> REGION_SHIFT) + 2)
/* /*
* Region IDs * Region IDs
*/ */
#define USER_REGION_ID 1 #define USER_REGION_ID 0
#define KERNEL_REGION_ID 2 #define KERNEL_REGION_ID 1
#define VMALLOC_REGION_ID 3 #define VMALLOC_REGION_ID NON_LINEAR_REGION_ID(H_VMALLOC_START)
#define IO_REGION_ID 4 #define IO_REGION_ID NON_LINEAR_REGION_ID(H_KERN_IO_START)
#define VMEMMAP_REGION_ID 5 #define VMEMMAP_REGION_ID NON_LINEAR_REGION_ID(H_VMEMMAP_START)
/* /*
* Defines the address of the vmemap area, in its own region on * Defines the address of the vmemap area, in its own region on
* hash table CPUs. * hash table CPUs.
*/ */
#ifdef CONFIG_PPC_MM_SLICES #ifdef CONFIG_PPC_MM_SLICES
#define HAVE_ARCH_UNMAPPED_AREA #define HAVE_ARCH_UNMAPPED_AREA
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
#endif /* CONFIG_PPC_MM_SLICES */ #endif /* CONFIG_PPC_MM_SLICES */
/* PTEIDX nibble */ /* PTEIDX nibble */
#define _PTEIDX_SECONDARY 0x8 #define _PTEIDX_SECONDARY 0x8
#define _PTEIDX_GROUP_IX 0x7 #define _PTEIDX_GROUP_IX 0x7
...@@ -113,22 +113,21 @@ ...@@ -113,22 +113,21 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
static inline int get_region_id(unsigned long ea) static inline int get_region_id(unsigned long ea)
{ {
int region_id;
int id = (ea >> 60UL); int id = (ea >> 60UL);
if (id == 0) if (id == 0)
return USER_REGION_ID; return USER_REGION_ID;
VM_BUG_ON(id != 0xc); if (ea < H_KERN_VIRT_START)
VM_BUG_ON(ea >= H_VMEMMAP_END); return KERNEL_REGION_ID;
if (ea >= H_VMEMMAP_START) VM_BUG_ON(id != 0xc);
return VMEMMAP_REGION_ID; BUILD_BUG_ON(NON_LINEAR_REGION_ID(H_VMALLOC_START) != 2);
else if (ea >= H_KERN_IO_START)
return IO_REGION_ID;
else if (ea >= H_VMALLOC_START)
return VMALLOC_REGION_ID;
return KERNEL_REGION_ID; region_id = NON_LINEAR_REGION_ID(ea);
VM_BUG_ON(region_id > VMEMMAP_REGION_ID);
return region_id;
} }
#define hash__pmd_bad(pmd) (pmd_val(pmd) & H_PMD_BAD_BITS) #define hash__pmd_bad(pmd) (pmd_val(pmd) & H_PMD_BAD_BITS)
......
...@@ -823,7 +823,7 @@ static inline unsigned long get_kernel_context(unsigned long ea) ...@@ -823,7 +823,7 @@ static inline unsigned long get_kernel_context(unsigned long ea)
*/ */
ctx = 1 + ((ea & EA_MASK) >> MAX_EA_BITS_PER_CONTEXT); ctx = 1 + ((ea & EA_MASK) >> MAX_EA_BITS_PER_CONTEXT);
} else } else
ctx = region_id + MAX_KERNEL_CTX_CNT - 2; ctx = region_id + MAX_KERNEL_CTX_CNT - 1;
return ctx; return ctx;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment