--- arch/x86/include/asm/percpu.h | 63 +++++++++++++----------------------------- 1 file changed, 20 insertions(+), 43 deletions(-) Index: linux-2.6/arch/x86/include/asm/percpu.h =================================================================== --- linux-2.6.orig/arch/x86/include/asm/percpu.h 2009-09-16 15:40:42.000000000 -0500 +++ linux-2.6/arch/x86/include/asm/percpu.h 2009-09-16 16:20:39.000000000 -0500 @@ -79,60 +79,25 @@ do { \ T__ tmp__; \ tmp__ = (val); \ } \ - switch (sizeof(var)) { \ - case 1: \ - asm(op "b %1,"__percpu_arg(0) \ + asm(op " %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: \ - asm(op "q %1,"__percpu_arg(0) \ - : "+m" (var) \ - : "re" ((T__)(val))); \ - break; \ - default: __bad_percpu_size(); \ - } \ } while (0) #define percpu_from_op(op, var, constraint) \ ({ \ typeof(var) ret__; \ - switch (sizeof(var)) { \ - case 1: \ - asm(op "b "__percpu_arg(1)",%0" \ + asm(op " "__percpu_arg(1)",%0" \ : "=q" (ret__) \ : constraint); \ - break; \ - case 2: \ - asm(op "w "__percpu_arg(1)",%0" \ - : "=r" (ret__) \ - : constraint); \ - break; \ - case 4: \ - asm(op "l "__percpu_arg(1)",%0" \ - : "=r" (ret__) \ - : constraint); \ - break; \ - case 8: \ - asm(op "q "__percpu_arg(1)",%0" \ - : "=r" (ret__) \ - : constraint); \ - break; \ - default: __bad_percpu_size(); \ - } \ ret__; \ }) +#define __this_cpu_read(pcp) __this_cpu_read_##sizeof(pcp)(pcp) +#define __this_cpu_write(pcp, val) __this_cpu_write_##sizeof(pcp)(pcp, val) +#define __this_cpu_add(pcp, val) __this_cpu_add_##sizeof(pcp)(pcp, val) + + /* * percpu_read() makes gcc load the percpu variable every time it is * accessed while percpu_read_stable() allows the value to be cached. @@ -142,7 +107,13 @@ do { \ * per-thread variables implemented as per-cpu variables and thus * stable for the duration of the respective task. */ -#define percpu_read(var) percpu_from_op("mov", per_cpu__##var, \ +#define percpu_read_1(var) percpu_from_op("movb", per_cpu__##var, \ + "m" (per_cpu__##var)) +#define percpu_read_2(var) percpu_from_op("movb", per_cpu__##var, \ + "m" (per_cpu__##var)) +#define percpu_read_4(var) percpu_from_op("movb", per_cpu__##var, \ + "m" (per_cpu__##var)) +#define percpu_read_8(var) generic_from_op(per_cpu__##var, \ "m" (per_cpu__##var)) #define percpu_read_stable(var) percpu_from_op("mov", per_cpu__##var, \ "p" (&per_cpu__##var)) @@ -161,6 +132,12 @@ do { \ #define __this_cpu_or(pcp, val) percpu_to_op("or", (pcp), val) #define __this_cpu_xor(pcp, val) percpu_to_op("xor", (pcp), val) +#define __this_cpu_read(pcp) __this_cpu_read##sizoef(pcp)(pcp) + +#define __this_cpu_read_1(pcp) percpu_from_op("mov", "b", pcp) +#define __this_cpu_read_2(pcp) percpu_from_op("mov", "w", pcp) +#define __this_cpu_read_4(pcp) per_cpu_ + #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)