powerpc: Add VDSO version of getcpu
We have a request for a fast method of getting CPU and NUMA node IDs from userspace. This patch implements a getcpu VDSO function, similar to x86. Ben suggested we use SPRG3 which is userspace readable. SPRG3 can be modified by a KVM guest, so we save the SPRG3 value in the paca and restore it when transitioning from the guest to the host. I have a glibc patch that implements sched_getcpu on top of this. Testing on a POWER7: baseline: 538 cycles vdso: 30 cycles Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:

committed by
Benjamin Herrenschmidt

parent
e6a74c6ea3
commit
18ad51dd34
@@ -706,6 +706,34 @@ static void __init vdso_setup_syscall_map(void)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
int __cpuinit vdso_getcpu_init(void)
|
||||
{
|
||||
unsigned long cpu, node, val;
|
||||
|
||||
/*
|
||||
* SPRG3 contains the CPU in the bottom 16 bits and the NUMA node in
|
||||
* the next 16 bits. The VDSO uses this to implement getcpu().
|
||||
*/
|
||||
cpu = get_cpu();
|
||||
WARN_ON_ONCE(cpu > 0xffff);
|
||||
|
||||
node = cpu_to_node(cpu);
|
||||
WARN_ON_ONCE(node > 0xffff);
|
||||
|
||||
val = (cpu & 0xfff) | ((node & 0xffff) << 16);
|
||||
mtspr(SPRN_SPRG3, val);
|
||||
#ifdef CONFIG_KVM_BOOK3S_HANDLER
|
||||
get_paca()->kvm_hstate.sprg3 = val;
|
||||
#endif
|
||||
|
||||
put_cpu();
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* We need to call this before SMP init */
|
||||
early_initcall(vdso_getcpu_init);
|
||||
#endif
|
||||
|
||||
static int __init vdso_init(void)
|
||||
{
|
||||
|
Reference in New Issue
Block a user