[PATCH] Define vsyscall cache as blob to make clearer that user space shouldn't use it
Signed-off-by: Andi Kleen <ak@suse.de>
This commit is contained in:
parent
120b114237
commit
34596dc9e5
3 changed files with 15 additions and 13 deletions
|
@ -155,8 +155,8 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache)
|
|||
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->t0 == (j = __jiffies)) {
|
||||
p = tcache->t1;
|
||||
if (tcache && tcache->blob[0] == (j = __jiffies)) {
|
||||
p = tcache->blob[1];
|
||||
} else if (__vgetcpu_mode == VGETCPU_RDTSCP) {
|
||||
/* Load per CPU data from RDTSCP */
|
||||
rdtscp(dummy, dummy, p);
|
||||
|
@ -165,8 +165,8 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache)
|
|||
asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
|
||||
}
|
||||
if (tcache) {
|
||||
tcache->t0 = j;
|
||||
tcache->t1 = p;
|
||||
tcache->blob[0] = j;
|
||||
tcache->blob[1] = p;
|
||||
}
|
||||
if (cpu)
|
||||
*cpu = p & 0xfff;
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
#ifndef _LINUX_GETCPU_H
|
||||
#define _LINUX_GETCPU_H 1
|
||||
|
||||
/* Cache for getcpu() to speed it up. Results might be upto a jiffie
|
||||
/* Cache for getcpu() to speed it up. Results might be a short time
|
||||
out of date, but will be faster.
|
||||
|
||||
User programs should not refer to the contents of this structure.
|
||||
It is only a cache for vgetcpu(). It might change in future kernels.
|
||||
I repeat they should not refer to it. If they do they will break
|
||||
in future kernels.
|
||||
|
||||
It is only a private cache for vgetcpu(). It will change in future kernels.
|
||||
The user program must store this information per thread (__thread)
|
||||
If you want 100% accurate information pass NULL instead. */
|
||||
struct getcpu_cache {
|
||||
unsigned long t0;
|
||||
unsigned long t1;
|
||||
unsigned long res[4];
|
||||
unsigned long blob[128 / sizeof(long)];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2083,12 +2083,12 @@ asmlinkage long sys_getcpu(unsigned __user *cpup, unsigned __user *nodep,
|
|||
* padding
|
||||
*/
|
||||
unsigned long t0, t1;
|
||||
get_user(t0, &cache->t0);
|
||||
get_user(t1, &cache->t1);
|
||||
get_user(t0, &cache->blob[0]);
|
||||
get_user(t1, &cache->blob[1]);
|
||||
t0++;
|
||||
t1++;
|
||||
put_user(t0, &cache->t0);
|
||||
put_user(t1, &cache->t1);
|
||||
put_user(t0, &cache->blob[0]);
|
||||
put_user(t1, &cache->blob[1]);
|
||||
}
|
||||
return err ? -EFAULT : 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue