Commit f033d659 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Benjamin Herrenschmidt

powerpc/mm: Update VSID allocation documentation

This update the proto-VSID and VSID scramble related information
to be more generic by using names instead of current values.
Reviewed-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 048ee099
...@@ -324,27 +324,26 @@ extern void slb_set_size(u16 size); ...@@ -324,27 +324,26 @@ extern void slb_set_size(u16 size);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
/* /*
* VSID allocation * VSID allocation (256MB segment)
* *
* We first generate a 36-bit "proto-VSID". For kernel addresses this * We first generate a 38-bit "proto-VSID". For kernel addresses this
* is equal to the ESID, for user addresses it is: * is equal to the ESID | 1 << 37, for user addresses it is:
* (context << 15) | (esid & 0x7fff) * (context << USER_ESID_BITS) | (esid & ((1U << USER_ESID_BITS) - 1)
* *
* The two forms are distinguishable because the top bit is 0 for user * This splits the proto-VSID into the below range
* addresses, whereas the top two bits are 1 for kernel addresses. * 0 - (2^(CONTEXT_BITS + USER_ESID_BITS) - 1) : User proto-VSID range
* Proto-VSIDs with the top two bits equal to 0b10 are reserved for * 2^(CONTEXT_BITS + USER_ESID_BITS) - 2^(VSID_BITS) : Kernel proto-VSID range
* now. *
* We also have CONTEXT_BITS + USER_ESID_BITS = VSID_BITS - 1
* That is, we assign half of the space to user processes and half
* to the kernel.
* *
* The proto-VSIDs are then scrambled into real VSIDs with the * The proto-VSIDs are then scrambled into real VSIDs with the
* multiplicative hash: * multiplicative hash:
* *
* VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS * VSID = (proto-VSID * VSID_MULTIPLIER) % VSID_MODULUS
* where VSID_MULTIPLIER = 268435399 = 0xFFFFFC7
* VSID_MODULUS = 2^36-1 = 0xFFFFFFFFF
* *
* This scramble is only well defined for proto-VSIDs below * VSID_MULTIPLIER is prime, so in particular it is
* 0xFFFFFFFFF, so both proto-VSID and actual VSID 0xFFFFFFFFF are
* reserved. VSID_MULTIPLIER is prime, so in particular it is
* co-prime to VSID_MODULUS, making this a 1:1 scrambling function. * co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
* Because the modulus is 2^n-1 we can compute it efficiently without * Because the modulus is 2^n-1 we can compute it efficiently without
* a divide or extra multiply (see below). * a divide or extra multiply (see below).
...@@ -355,20 +354,15 @@ extern void slb_set_size(u16 size); ...@@ -355,20 +354,15 @@ extern void slb_set_size(u16 size);
* (i.e. everything above 0xC000000000000000), except the very top * (i.e. everything above 0xC000000000000000), except the very top
* segment, which simplifies several things. * segment, which simplifies several things.
* *
* - We allow for 16 significant bits of ESID and 19 bits of * - We allow for USER_ESID_BITS significant bits of ESID and
* context for user addresses. i.e. 16T (44 bits) of address space for * CONTEXT_BITS bits of context for user addresses.
* up to half a million contexts. * i.e. 64T (46 bits) of address space for up to half a million contexts.
* *
* - The scramble function gives robust scattering in the hash * - The scramble function gives robust scattering in the hash
* table (at least based on some initial results). The previous * table (at least based on some initial results). The previous
* method was more susceptible to pathological cases giving excessive * method was more susceptible to pathological cases giving excessive
* hash collisions. * hash collisions.
*/ */
/*
* WARNING - If you change these you must make sure the asm
* implementations in slb_allocate (slb_low.S), do_stab_bolted
* (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
*/
/* /*
* This should be computed such that protovosid * vsid_mulitplier * This should be computed such that protovosid * vsid_mulitplier
......
...@@ -30,9 +30,11 @@ static DEFINE_SPINLOCK(mmu_context_lock); ...@@ -30,9 +30,11 @@ static DEFINE_SPINLOCK(mmu_context_lock);
static DEFINE_IDA(mmu_context_ida); static DEFINE_IDA(mmu_context_ida);
/* /*
* The proto-VSID space has 2^35 - 1 segments available for user mappings. * 256MB segment
* Each segment contains 2^28 bytes. Each context maps 2^44 bytes, * The proto-VSID space has 2^(CONTEX_BITS + USER_ESID_BITS) - 1 segments
* so we can support 2^19-1 contexts (19 == 35 + 28 - 44). * available for user mappings. Each segment contains 2^28 bytes. Each
* context maps 2^46 bytes (64TB) so we can support 2^19-1 contexts
* (19 == 37 + 28 - 46).
*/ */
#define MAX_CONTEXT ((1UL << CONTEXT_BITS) - 1) #define MAX_CONTEXT ((1UL << CONTEXT_BITS) - 1)
......
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