mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 00:24:58 +08:00
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.com
This commit is contained in:
parent
ebcd580bed
commit
c94055fe93
@ -85,7 +85,6 @@
|
||||
|
||||
/* For arch-specific code, we can use direct single-insn ops (they
|
||||
* don't give an lvalue though). */
|
||||
extern void __bad_percpu_size(void);
|
||||
|
||||
#define __pcpu_type_1 u8
|
||||
#define __pcpu_type_2 u16
|
||||
@ -167,33 +166,13 @@ do { \
|
||||
(typeof(_var))(unsigned long) pfo_val__; \
|
||||
})
|
||||
|
||||
#define percpu_stable_op(op, var) \
|
||||
({ \
|
||||
typeof(var) pfo_ret__; \
|
||||
switch (sizeof(var)) { \
|
||||
case 1: \
|
||||
asm(op "b "__percpu_arg(P1)",%0" \
|
||||
: "=q" (pfo_ret__) \
|
||||
: "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__; \
|
||||
#define percpu_stable_op(size, op, _var) \
|
||||
({ \
|
||||
__pcpu_type_##size pfo_val__; \
|
||||
asm(__pcpu_op2_##size(op, __percpu_arg(P[var]), "%[val]") \
|
||||
: [val] __pcpu_reg_##size("=", pfo_val__) \
|
||||
: [var] "p" (&(_var))); \
|
||||
(typeof(_var))(unsigned long) pfo_val__; \
|
||||
})
|
||||
|
||||
/*
|
||||
@ -258,7 +237,11 @@ do { \
|
||||
* per-thread variables implemented as per-cpu variables and thus
|
||||
* 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_2(pcp) percpu_from_op(2, , "mov", pcp)
|
||||
|
Loading…
Reference in New Issue
Block a user