x86/percpu: Clean up percpu_stable_op()
Use __pcpu_size_call_return() to simplify this_cpu_read_stable(). Also remove __bad_percpu_size() which is now unused. Signed-off-by: Brian Gerst <brgerst@gmail.com> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Sedat Dilek <sedat.dilek@gmail.com> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Dennis Zhou <dennis@kernel.org> Link: https://lkml.kernel.org/r/20200720204925.3654302-10-ndesaulniers@google.comzero-sugar-mainline-defconfig
parent
ebcd580bed
commit
c94055fe93
|
@ -85,7 +85,6 @@
|
||||||
|
|
||||||
/* For arch-specific code, we can use direct single-insn ops (they
|
/* For arch-specific code, we can use direct single-insn ops (they
|
||||||
* don't give an lvalue though). */
|
* don't give an lvalue though). */
|
||||||
extern void __bad_percpu_size(void);
|
|
||||||
|
|
||||||
#define __pcpu_type_1 u8
|
#define __pcpu_type_1 u8
|
||||||
#define __pcpu_type_2 u16
|
#define __pcpu_type_2 u16
|
||||||
|
@ -167,33 +166,13 @@ do { \
|
||||||
(typeof(_var))(unsigned long) pfo_val__; \
|
(typeof(_var))(unsigned long) pfo_val__; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define percpu_stable_op(op, var) \
|
#define percpu_stable_op(size, op, _var) \
|
||||||
({ \
|
({ \
|
||||||
typeof(var) pfo_ret__; \
|
__pcpu_type_##size pfo_val__; \
|
||||||
switch (sizeof(var)) { \
|
asm(__pcpu_op2_##size(op, __percpu_arg(P[var]), "%[val]") \
|
||||||
case 1: \
|
: [val] __pcpu_reg_##size("=", pfo_val__) \
|
||||||
asm(op "b "__percpu_arg(P1)",%0" \
|
: [var] "p" (&(_var))); \
|
||||||
: "=q" (pfo_ret__) \
|
(typeof(_var))(unsigned long) pfo_val__; \
|
||||||
: "p" (&(var))); \
|
|
||||||
break; \
|
|
||||||
case 2: \
|
|
||||||
asm(op "w "__percpu_arg(P1)",%0" \
|
|
||||||
: "=r" (pfo_ret__) \
|
|
||||||
: "p" (&(var))); \
|
|
||||||
break; \
|
|
||||||
case 4: \
|
|
||||||
asm(op "l "__percpu_arg(P1)",%0" \
|
|
||||||
: "=r" (pfo_ret__) \
|
|
||||||
: "p" (&(var))); \
|
|
||||||
break; \
|
|
||||||
case 8: \
|
|
||||||
asm(op "q "__percpu_arg(P1)",%0" \
|
|
||||||
: "=r" (pfo_ret__) \
|
|
||||||
: "p" (&(var))); \
|
|
||||||
break; \
|
|
||||||
default: __bad_percpu_size(); \
|
|
||||||
} \
|
|
||||||
pfo_ret__; \
|
|
||||||
})
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -258,7 +237,11 @@ do { \
|
||||||
* per-thread variables implemented as per-cpu variables and thus
|
* per-thread variables implemented as per-cpu variables and thus
|
||||||
* stable for the duration of the respective task.
|
* stable for the duration of the respective task.
|
||||||
*/
|
*/
|
||||||
#define this_cpu_read_stable(var) percpu_stable_op("mov", var)
|
#define this_cpu_read_stable_1(pcp) percpu_stable_op(1, "mov", pcp)
|
||||||
|
#define this_cpu_read_stable_2(pcp) percpu_stable_op(2, "mov", pcp)
|
||||||
|
#define this_cpu_read_stable_4(pcp) percpu_stable_op(4, "mov", pcp)
|
||||||
|
#define this_cpu_read_stable_8(pcp) percpu_stable_op(8, "mov", pcp)
|
||||||
|
#define this_cpu_read_stable(pcp) __pcpu_size_call_return(this_cpu_read_stable_, pcp)
|
||||||
|
|
||||||
#define raw_cpu_read_1(pcp) percpu_from_op(1, , "mov", pcp)
|
#define raw_cpu_read_1(pcp) percpu_from_op(1, , "mov", pcp)
|
||||||
#define raw_cpu_read_2(pcp) percpu_from_op(2, , "mov", pcp)
|
#define raw_cpu_read_2(pcp) percpu_from_op(2, , "mov", pcp)
|
||||||
|
|
Loading…
Reference in New Issue