mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 11:13:58 +08:00
x86/segments: Introduce the 'CPUNODE' naming to better document the segment limit CPU/node NR trick
We have a special segment descriptor entry in the GDT, whose sole purpose is to encode the CPU and node numbers in its limit (size) field. There are user-space instructions that allow the reading of the limit field, which gives us a really fast way to read the CPU and node IDs from the vDSO for example. But the naming of related functionality does not make this clear, at all: VDSO_CPU_SIZE VDSO_CPU_MASK __CPU_NUMBER_SEG GDT_ENTRY_CPU_NUMBER vdso_encode_cpu_node vdso_read_cpu_node There's a number of problems: - The 'VDSO_CPU_SIZE' doesn't really make it clear that these are number of bits, nor does it make it clear which 'CPU' this refers to, i.e. that this is about a GDT entry whose limit encodes the CPU and node number. - Furthermore, the 'CPU_NUMBER' naming is actively misleading as well, because the segment limit encodes not just the CPU number but the node ID as well ... So use a better nomenclature all around: name everything related to this trick as 'CPUNODE', to make it clear that this is something special, and add _BITS to make it clear that these are number of bits, and propagate this to every affected name: VDSO_CPU_SIZE => VDSO_CPUNODE_BITS VDSO_CPU_MASK => VDSO_CPUNODE_MASK __CPU_NUMBER_SEG => __CPUNODE_SEG GDT_ENTRY_CPU_NUMBER => GDT_ENTRY_CPUNODE vdso_encode_cpu_node => vdso_encode_cpunode vdso_read_cpu_node => vdso_read_cpunode This, beyond being less confusing, also makes it easier to grep for all related functionality: $ git grep -i cpunode arch/x86 Also, while at it, fix "return is not a function" style sloppiness in vdso_encode_cpunode(). Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Chang S. Bae <chang.seok.bae@intel.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Markus T Metzger <markus.t.metzger@intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Shankar <ravi.v.shankar@intel.com> Cc: Rik van Riel <riel@surriel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/1537312139-5580-2-git-send-email-chang.seok.bae@intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
b2e2ba578e
commit
22245bdf0a
@ -13,7 +13,7 @@
|
||||
notrace long
|
||||
__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
|
||||
{
|
||||
vdso_read_cpu_node(cpu, node);
|
||||
vdso_read_cpunode(cpu, node);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -186,7 +186,7 @@
|
||||
#define GDT_ENTRY_TLS_MIN 12
|
||||
#define GDT_ENTRY_TLS_MAX 14
|
||||
|
||||
#define GDT_ENTRY_CPU_NUMBER 15
|
||||
#define GDT_ENTRY_CPUNODE 15
|
||||
|
||||
/*
|
||||
* Number of entries in the GDT table:
|
||||
@ -206,7 +206,7 @@
|
||||
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3)
|
||||
#define __USER32_DS __USER_DS
|
||||
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
|
||||
#define __CPU_NUMBER_SEG (GDT_ENTRY_CPU_NUMBER*8 + 3)
|
||||
#define __CPUNODE_SEG (GDT_ENTRY_CPUNODE*8 + 3)
|
||||
|
||||
#endif
|
||||
|
||||
@ -227,24 +227,24 @@
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
/* Bit size and mask of CPU number stored in the per CPU data (and TSC_AUX) */
|
||||
#define VDSO_CPU_SIZE 12
|
||||
#define VDSO_CPU_MASK 0xfff
|
||||
#define VDSO_CPUNODE_BITS 12
|
||||
#define VDSO_CPUNODE_MASK 0xfff
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Helper functions to store/load CPU and node numbers */
|
||||
|
||||
static inline unsigned long vdso_encode_cpu_node(int cpu, unsigned long node)
|
||||
static inline unsigned long vdso_encode_cpunode(int cpu, unsigned long node)
|
||||
{
|
||||
return ((node << VDSO_CPU_SIZE) | cpu);
|
||||
return (node << VDSO_CPUNODE_BITS) | cpu;
|
||||
}
|
||||
|
||||
static inline void vdso_read_cpu_node(unsigned *cpu, unsigned *node)
|
||||
static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
|
||||
{
|
||||
unsigned int p;
|
||||
|
||||
/*
|
||||
* Load CPU and node number from GDT. LSL is faster than RDTSCP
|
||||
* Load CPU and node number from the GDT. LSL is faster than RDTSCP
|
||||
* and works on all CPUs. This is volatile so that it orders
|
||||
* correctly with respect to barrier() and to keep GCC from cleverly
|
||||
* hoisting it out of the calling function.
|
||||
@ -254,12 +254,12 @@ static inline void vdso_read_cpu_node(unsigned *cpu, unsigned *node)
|
||||
alternative_io ("lsl %[seg],%[p]",
|
||||
".byte 0xf3,0x0f,0xc7,0xf8", /* RDPID %eax/rax */
|
||||
X86_FEATURE_RDPID,
|
||||
[p] "=a" (p), [seg] "r" (__CPU_NUMBER_SEG));
|
||||
[p] "=a" (p), [seg] "r" (__CPUNODE_SEG));
|
||||
|
||||
if (cpu)
|
||||
*cpu = (p & VDSO_CPU_MASK);
|
||||
*cpu = (p & VDSO_CPUNODE_MASK);
|
||||
if (node)
|
||||
*node = (p >> VDSO_CPU_SIZE);
|
||||
*node = (p >> VDSO_CPUNODE_BITS);
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
@ -1672,7 +1672,7 @@ static void wait_for_master_cpu(int cpu)
|
||||
#ifdef CONFIG_X86_64
|
||||
static void setup_getcpu(int cpu)
|
||||
{
|
||||
unsigned long cpudata = vdso_encode_cpu_node(cpu, early_cpu_to_node(cpu));
|
||||
unsigned long cpudata = vdso_encode_cpunode(cpu, early_cpu_to_node(cpu));
|
||||
struct desc_struct d = { };
|
||||
|
||||
if (static_cpu_has(X86_FEATURE_RDTSCP))
|
||||
@ -1688,7 +1688,7 @@ static void setup_getcpu(int cpu)
|
||||
d.p = 1; /* Present */
|
||||
d.d = 1; /* 32-bit */
|
||||
|
||||
write_gdt_entry(get_cpu_gdt_rw(cpu), GDT_ENTRY_CPU_NUMBER, &d, DESCTYPE_S);
|
||||
write_gdt_entry(get_cpu_gdt_rw(cpu), GDT_ENTRY_CPUNODE, &d, DESCTYPE_S);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user