Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -13,12 +13,14 @@
 */
#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,
 * each MAP area is limited to 16 TB.
 * 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
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
 * is handled in the hotpath.
 */
#define MAX_EA_BITS_PER_CONTEXT		49
#define REGION_SHIFT		MAX_EA_BITS_PER_CONTEXT

/*
 * We use one context for each MAP area.
+15 −16
Original line number Diff line number Diff line
@@ -83,26 +83,26 @@
#define H_VMEMMAP_SIZE		H_KERN_MAP_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
 */
#define USER_REGION_ID		1
#define KERNEL_REGION_ID	2
#define VMALLOC_REGION_ID	3
#define IO_REGION_ID		4
#define VMEMMAP_REGION_ID	5
#define USER_REGION_ID		0
#define KERNEL_REGION_ID	1
#define VMALLOC_REGION_ID	NON_LINEAR_REGION_ID(H_VMALLOC_START)
#define IO_REGION_ID		NON_LINEAR_REGION_ID(H_KERN_IO_START)
#define VMEMMAP_REGION_ID	NON_LINEAR_REGION_ID(H_VMEMMAP_START)

/*
 * Defines the address of the vmemap area, in its own region on
 * hash table CPUs.
 */

#ifdef CONFIG_PPC_MM_SLICES
#define HAVE_ARCH_UNMAPPED_AREA
#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
#endif /* CONFIG_PPC_MM_SLICES */


/* PTEIDX nibble */
#define _PTEIDX_SECONDARY	0x8
#define _PTEIDX_GROUP_IX	0x7
@@ -113,22 +113,21 @@
#ifndef __ASSEMBLY__
static inline int get_region_id(unsigned long ea)
{
	int region_id;
	int id = (ea >> 60UL);

	if (id == 0)
		return USER_REGION_ID;

	VM_BUG_ON(id != 0xc);
	VM_BUG_ON(ea >= H_VMEMMAP_END);
	if (ea < H_KERN_VIRT_START)
		return KERNEL_REGION_ID;

	if (ea >= H_VMEMMAP_START)
		return VMEMMAP_REGION_ID;
	else if (ea >= H_KERN_IO_START)
		return IO_REGION_ID;
	else if (ea >= H_VMALLOC_START)
		return VMALLOC_REGION_ID;
	VM_BUG_ON(id != 0xc);
	BUILD_BUG_ON(NON_LINEAR_REGION_ID(H_VMALLOC_START) != 2);

	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)
+1 −1
Original line number Diff line number Diff line
@@ -823,7 +823,7 @@ static inline unsigned long get_kernel_context(unsigned long ea)
		 */
		ctx =  1 + ((ea & EA_MASK) >> MAX_EA_BITS_PER_CONTEXT);
	} else
		ctx = region_id + MAX_KERNEL_CTX_CNT - 2;
		ctx = region_id + MAX_KERNEL_CTX_CNT - 1;
	return ctx;
}