Re: [PATCH] vsyscall: use __iter_div_u64_rem()

From: Thomas Gleixner
Date: Mon Jul 22 2019 - 06:10:53 EST


On Thu, 11 Jul 2019, Arnd Bergmann wrote:

Trimmed CC list and added Jan

> See below for the patch I am using locally to work around this.
> That patch is probably wrong, so I have not submitted it yet, but it
> gives you a clean build ;-)
>
> Arnd
> 8<---
> Subject: [PATCH] x86: percpu: fix clang 32-bit build
>
> clang does not like an inline assembly with a "=q" contraint for
> a 64-bit output:
>
> arch/x86/events/perf_event.h:824:21: error: invalid output size for
> constraint '=q'
> u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
> ^
> include/linux/percpu-defs.h:447:2: note: expanded from macro '__this_cpu_read'
> raw_cpu_read(pcp); \
> ^
> include/linux/percpu-defs.h:421:28: note: expanded from macro 'raw_cpu_read'
> #define raw_cpu_read(pcp)
> __pcpu_size_call_return(raw_cpu_read_, pcp)
> ^
> include/linux/percpu-defs.h:322:23: note: expanded from macro
> '__pcpu_size_call_return'
> case 1: pscr_ret__ = stem##1(variable); break; \
> ^
> <scratch space>:357:1: note: expanded from here
> raw_cpu_read_1
> ^
> arch/x86/include/asm/percpu.h:394:30: note: expanded from macro 'raw_cpu_read_1'
> #define raw_cpu_read_1(pcp) percpu_from_op(, "mov", pcp)
> ^
> arch/x86/include/asm/percpu.h:189:15: note: expanded from macro 'percpu_from_op'
> : "=q" (pfo_ret__) \
> ^
>
> According to the commit that introduced the "q" constraint, this was
> needed to fix miscompilation, but it gives no further detail.

Jan, do you have any memory why you added those 'q' constraints? The
changelog of 3c598766a2ba is not really helpful.

Thanks,

tglx

> Using the normal "=r" constraint seems to work so far.
>
> Fixes: 3c598766a2ba ("x86: fix percpu_{to,from}_op()")
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
>
> diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
> index 2278797c769d..e791fbf4018f 100644
> --- a/arch/x86/include/asm/percpu.h
> +++ b/arch/x86/include/asm/percpu.h
> @@ -99,7 +99,7 @@ do { \
> case 1: \
> asm qual (op "b %1,"__percpu_arg(0) \
> : "+m" (var) \
> - : "qi" ((pto_T__)(val))); \
> + : "ri" ((pto_T__)(val))); \
> break; \
> case 2: \
> asm qual (op "w %1,"__percpu_arg(0) \
> @@ -144,7 +144,7 @@ do {
> \
> else \
> asm qual ("addb %1, "__percpu_arg(0) \
> : "+m" (var) \
> - : "qi" ((pao_T__)(val))); \
> + : "ri" ((pao_T__)(val))); \
> break; \
> case 2: \
> if (pao_ID__ == 1) \
> @@ -186,7 +186,7 @@ do {
> \
> switch (sizeof(var)) { \
> case 1: \
> asm qual (op "b "__percpu_arg(1)",%0" \
> - : "=q" (pfo_ret__) \
> + : "=r" (pfo_ret__) \
> : "m" (var)); \
> break; \
> case 2: \
> @@ -215,7 +215,7 @@ do {
> \
> switch (sizeof(var)) { \
> case 1: \
> asm(op "b "__percpu_arg(P1)",%0" \
> - : "=q" (pfo_ret__) \
> + : "=r" (pfo_ret__) \
> : "p" (&(var))); \
> break; \
> case 2: \
>