Messages in this thread |  | | From | Nick Desaulniers <> | Date | Mon, 1 Jun 2020 13:43:18 -0700 | Subject | Re: [PATCH v2 09/10] x86/percpu: Clean up percpu_stable_op() |
| |
On Sat, May 30, 2020 at 3:11 PM Brian Gerst <brgerst@gmail.com> wrote: > > Use __pcpu_size_call_return() to simplify this_cpu_read_stable().
Clever! As in this_cpu_read() in include/linux/percpu-defs.h. Could be its own patch before this, but it's fine. Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> Also remove __bad_percpu_size() which is now unused. > > Signed-off-by: Brian Gerst <brgerst@gmail.com> > --- > arch/x86/include/asm/percpu.h | 41 ++++++++++------------------------- > 1 file changed, 12 insertions(+), 29 deletions(-) > > diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h > index 7efc0b5c4ff0..cf2b9c2a241e 100644 > --- a/arch/x86/include/asm/percpu.h > +++ b/arch/x86/include/asm/percpu.h > @@ -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" \
What does the `P` do here? https://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints says can be machine dependent integral literal in a certain range. https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints doesn't document `P` for x86 though...
> - : "=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) > -- > 2.25.4 >
-- Thanks, ~Nick Desaulniers
|  |