Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 73893
b: refs/heads/master
c: 4307d1e
h: refs/heads/master
i:
  73891: 908bca5
v: v3
  • Loading branch information
Ingo Molnar authored and Thomas Gleixner committed Nov 17, 2007
1 parent 549a3cc commit 5a2bc9c
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 37 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 434b3d3209a8d8dcda63c3b14815659f4671b0a8
refs/heads/master: 4307d1e5ada595c87f9a4d16db16ba5edb70dcb1
19 changes: 2 additions & 17 deletions trunk/arch/x86/vdso/vgetcpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,17 @@
#include <asm/vgtod.h>
#include "vextern.h"

long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache)
long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
{
unsigned int dummy, p;
unsigned long j = 0;

/* Fast cache - only recompute value once per jiffies and avoid
relatively costly rdtscp/cpuid otherwise.
This works because the scheduler usually keeps the process
on the same CPU and this syscall doesn't guarantee its
results anyways.
We do this here because otherwise user space would do it on
its own in a likely inferior way (no access to jiffies).
If you don't like it pass NULL. */
if (tcache && tcache->blob[0] == (j = *vdso_jiffies)) {
p = tcache->blob[1];
} else if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) {
if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) {
/* Load per CPU data from RDTSCP */
rdtscp(dummy, dummy, p);
} else {
/* Load per CPU data from GDT */
asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
}
if (tcache) {
tcache->blob[0] = j;
tcache->blob[1] = p;
}
if (cpu)
*cpu = p & 0xfff;
if (node)
Expand Down
20 changes: 1 addition & 19 deletions trunk/kernel/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -1750,32 +1750,14 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
}

asmlinkage long sys_getcpu(unsigned __user *cpup, unsigned __user *nodep,
struct getcpu_cache __user *cache)
struct getcpu_cache __user *unused)
{
int err = 0;
int cpu = raw_smp_processor_id();
if (cpup)
err |= put_user(cpu, cpup);
if (nodep)
err |= put_user(cpu_to_node(cpu), nodep);
if (cache) {
/*
* The cache is not needed for this implementation,
* but make sure user programs pass something
* valid. vsyscall implementations can instead make
* good use of the cache. Only use t0 and t1 because
* these are available in both 32bit and 64bit ABI (no
* need for a compat_getcpu). 32bit has enough
* padding
*/
unsigned long t0, t1;
get_user(t0, &cache->blob[0]);
get_user(t1, &cache->blob[1]);
t0++;
t1++;
put_user(t0, &cache->blob[0]);
put_user(t1, &cache->blob[1]);
}
return err ? -EFAULT : 0;
}

Expand Down

0 comments on commit 5a2bc9c

Please sign in to comment.