--- arch/x86/include/asm/percpu.h | 61 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) Index: linux-2.6/arch/x86/include/asm/percpu.h =================================================================== --- linux-2.6.orig/arch/x86/include/asm/percpu.h 2009-09-15 13:47:14.000000000 -0500 +++ linux-2.6/arch/x86/include/asm/percpu.h 2009-09-15 13:58:50.000000000 -0500 @@ -72,6 +72,7 @@ * don't give an lvalue though). */ extern void __bad_percpu_size(void); +#ifdef CONFIG_X86_64 #define percpu_to_op(op, var, val) \ do { \ typedef typeof(var) T__; \ @@ -132,6 +133,64 @@ do { \ } \ ret__; \ }) +#else +#define percpu_to_op(op, var, val) \ +do { \ + typedef typeof(var) T__; \ + if (0) { \ + T__ tmp__; \ + tmp__ = (val); \ + } \ + switch (sizeof(var)) { \ + case 1: \ + asm(op "b %1,"__percpu_arg(0) \ + : "+m" (var) \ + : "qi" ((T__)(val))); \ + break; \ + case 2: \ + asm(op "w %1,"__percpu_arg(0) \ + : "+m" (var) \ + : "ri" ((T__)(val))); \ + break; \ + case 4: \ + asm(op "l %1,"__percpu_arg(0) \ + : "+m" (var) \ + : "ri" ((T__)(val))); \ + break; \ + case 8: \ + percpu_generic_to_op(var, val, op); \ + break; \ + default: __bad_percpu_size(); \ + } \ +} while (0) + +#define percpu_from_op(op, var) \ +({ \ + typeof(var) ret__; \ + switch (sizeof(var)) { \ + case 1: \ + asm(op "b "__percpu_arg(1)",%0" \ + : "=q" (ret__) \ + : "m" (var)); \ + break; \ + case 2: \ + asm(op "w "__percpu_arg(1)",%0" \ + : "=r" (ret__) \ + : "m" (var)); \ + break; \ + case 4: \ + asm(op "l "__percpu_arg(1)",%0" \ + : "=r" (ret__) \ + : "m" (var)); \ + break; \ + case 8: \ + __ret = __get_cpu_var(var); \ + break; \ + default: __bad_percpu_size(); \ + } \ + ret__; \ +}) +#endif /* * percpu_read() makes gcc load the percpu variable every time it is @@ -153,7 +212,7 @@ do { \ #define percpu_or(var, val) percpu_to_op("or", per_cpu__##var, val) #define percpu_xor(var, val) percpu_to_op("xor", per_cpu__##var, val) -#define __this_cpu_read(pcp) percpu_from_op("mov", pcp) +#define __this_cpu_read(pcp) percpu_from_op("mov", (pcp)) #define __this_cpu_write(pcp, val) percpu_to_op("mov", (pcp), val) #define __this_cpu_add(pcp, val) percpu_to_op("add", (pcp), val) #define __this_cpu_sub(pcp, val) percpu_to_op("sub", (pcp), val)