Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] Define vsyscall cache as blob to make clearer that user space shouldn't use it

Signed-off-by: Andi Kleen <ak@suse.de>

authored by

Andi Kleen and committed by
Andi Kleen
34596dc9 120b1142

+15 -13
+4 -4
arch/x86_64/kernel/vsyscall.c
··· 155 155 We do this here because otherwise user space would do it on 156 156 its own in a likely inferior way (no access to jiffies). 157 157 If you don't like it pass NULL. */ 158 - if (tcache && tcache->t0 == (j = __jiffies)) { 159 - p = tcache->t1; 158 + if (tcache && tcache->blob[0] == (j = __jiffies)) { 159 + p = tcache->blob[1]; 160 160 } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { 161 161 /* Load per CPU data from RDTSCP */ 162 162 rdtscp(dummy, dummy, p); ··· 165 165 asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); 166 166 } 167 167 if (tcache) { 168 - tcache->t0 = j; 169 - tcache->t1 = p; 168 + tcache->blob[0] = j; 169 + tcache->blob[1] = p; 170 170 } 171 171 if (cpu) 172 172 *cpu = p & 0xfff;
+7 -5
include/linux/getcpu.h
··· 1 1 #ifndef _LINUX_GETCPU_H 2 2 #define _LINUX_GETCPU_H 1 3 3 4 - /* Cache for getcpu() to speed it up. Results might be upto a jiffie 4 + /* Cache for getcpu() to speed it up. Results might be a short time 5 5 out of date, but will be faster. 6 + 6 7 User programs should not refer to the contents of this structure. 7 - It is only a cache for vgetcpu(). It might change in future kernels. 8 + I repeat they should not refer to it. If they do they will break 9 + in future kernels. 10 + 11 + It is only a private cache for vgetcpu(). It will change in future kernels. 8 12 The user program must store this information per thread (__thread) 9 13 If you want 100% accurate information pass NULL instead. */ 10 14 struct getcpu_cache { 11 - unsigned long t0; 12 - unsigned long t1; 13 - unsigned long res[4]; 15 + unsigned long blob[128 / sizeof(long)]; 14 16 }; 15 17 16 18 #endif
+4 -4
kernel/sys.c
··· 2083 2083 * padding 2084 2084 */ 2085 2085 unsigned long t0, t1; 2086 - get_user(t0, &cache->t0); 2087 - get_user(t1, &cache->t1); 2086 + get_user(t0, &cache->blob[0]); 2087 + get_user(t1, &cache->blob[1]); 2088 2088 t0++; 2089 2089 t1++; 2090 - put_user(t0, &cache->t0); 2091 - put_user(t1, &cache->t1); 2090 + put_user(t0, &cache->blob[0]); 2091 + put_user(t1, &cache->blob[1]); 2092 2092 } 2093 2093 return err ? -EFAULT : 0; 2094 2094 }