2022-10-06 07:13:08

by Jisheng Zhang

[permalink] [raw]
Subject: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

Samuel reported that the static branch usage in cpu_relax() breaks
building with CONFIG_CC_OPTIMIZE_FOR_SIZE[1]:

In file included from <command-line>:
./arch/riscv/include/asm/jump_label.h: In function 'cpu_relax':
././include/linux/compiler_types.h:285:33: warning: 'asm' operand 0
probably does not match constraints
285 | #define asm_volatile_goto(x...) asm goto(x)
| ^~~
./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
'asm_volatile_goto'
41 | asm_volatile_goto(
| ^~~~~~~~~~~~~~~~~
././include/linux/compiler_types.h:285:33: error: impossible constraint
in 'asm'
285 | #define asm_volatile_goto(x...) asm goto(x)
| ^~~
./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
'asm_volatile_goto'
41 | asm_volatile_goto(
| ^~~~~~~~~~~~~~~~~
make[1]: *** [scripts/Makefile.build:249:
arch/riscv/kernel/vdso/vgettimeofday.o] Error 1
make: *** [arch/riscv/Makefile:128: vdso_prepare] Error 2

Maybe "-Os" prevents GCC from detecting that the key/branch arguments
can be treated as constants and used as immediate operands. Inspired
by x86's commit 864b435514b2("x86/jump_label: Mark arguments as const to
satisfy asm constraints"), and as pointed out by Steven in [2] "The "i"
constraint needs to be a constant.", let's do similar modifications to
riscv.

Tested by CC_OPTIMIZE_FOR_SIZE + gcc and CC_OPTIMIZE_FOR_SIZE + clang.

[1]https://lore.kernel.org/linux-riscv/[email protected]/
[2]https://lore.kernel.org/all/[email protected]/
Signed-off-by: Jisheng Zhang <[email protected]>
---
arch/riscv/include/asm/jump_label.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h
index 38af2ec7b9bf..6d58bbb5da46 100644
--- a/arch/riscv/include/asm/jump_label.h
+++ b/arch/riscv/include/asm/jump_label.h
@@ -14,8 +14,8 @@

#define JUMP_LABEL_NOP_SIZE 4

-static __always_inline bool arch_static_branch(struct static_key *key,
- bool branch)
+static __always_inline bool arch_static_branch(struct static_key * const key,
+ const bool branch)
{
asm_volatile_goto(
" .option push \n\t"
@@ -35,8 +35,8 @@ static __always_inline bool arch_static_branch(struct static_key *key,
return true;
}

-static __always_inline bool arch_static_branch_jump(struct static_key *key,
- bool branch)
+static __always_inline bool arch_static_branch_jump(struct static_key * const key,
+ const bool branch)
{
asm_volatile_goto(
" .option push \n\t"
--
2.37.2


2022-10-06 12:49:13

by Andrew Jones

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Thu, Oct 06, 2022 at 02:40:28PM +0800, Jisheng Zhang wrote:
> Samuel reported that the static branch usage in cpu_relax() breaks
> building with CONFIG_CC_OPTIMIZE_FOR_SIZE[1]:
>
> In file included from <command-line>:
> ./arch/riscv/include/asm/jump_label.h: In function 'cpu_relax':
> ././include/linux/compiler_types.h:285:33: warning: 'asm' operand 0
> probably does not match constraints
> 285 | #define asm_volatile_goto(x...) asm goto(x)
> | ^~~
> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> 'asm_volatile_goto'
> 41 | asm_volatile_goto(
> | ^~~~~~~~~~~~~~~~~
> ././include/linux/compiler_types.h:285:33: error: impossible constraint
> in 'asm'
> 285 | #define asm_volatile_goto(x...) asm goto(x)
> | ^~~
> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> 'asm_volatile_goto'
> 41 | asm_volatile_goto(
> | ^~~~~~~~~~~~~~~~~
> make[1]: *** [scripts/Makefile.build:249:
> arch/riscv/kernel/vdso/vgettimeofday.o] Error 1
> make: *** [arch/riscv/Makefile:128: vdso_prepare] Error 2
>
> Maybe "-Os" prevents GCC from detecting that the key/branch arguments
> can be treated as constants and used as immediate operands. Inspired
> by x86's commit 864b435514b2("x86/jump_label: Mark arguments as const to
> satisfy asm constraints"), and as pointed out by Steven in [2] "The "i"
> constraint needs to be a constant.", let's do similar modifications to
> riscv.
>
> Tested by CC_OPTIMIZE_FOR_SIZE + gcc and CC_OPTIMIZE_FOR_SIZE + clang.
>
> [1]https://lore.kernel.org/linux-riscv/[email protected]/
> [2]https://lore.kernel.org/all/[email protected]/
> Signed-off-by: Jisheng Zhang <[email protected]>
> ---
> arch/riscv/include/asm/jump_label.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h
> index 38af2ec7b9bf..6d58bbb5da46 100644
> --- a/arch/riscv/include/asm/jump_label.h
> +++ b/arch/riscv/include/asm/jump_label.h
> @@ -14,8 +14,8 @@
>
> #define JUMP_LABEL_NOP_SIZE 4
>
> -static __always_inline bool arch_static_branch(struct static_key *key,
> - bool branch)
> +static __always_inline bool arch_static_branch(struct static_key * const key,
> + const bool branch)
> {
> asm_volatile_goto(
> " .option push \n\t"
> @@ -35,8 +35,8 @@ static __always_inline bool arch_static_branch(struct static_key *key,
> return true;
> }
>
> -static __always_inline bool arch_static_branch_jump(struct static_key *key,
> - bool branch)
> +static __always_inline bool arch_static_branch_jump(struct static_key * const key,
> + const bool branch)
> {
> asm_volatile_goto(
> " .option push \n\t"
> --
> 2.37.2
>

Reviewed-by: Andrew Jones <[email protected]>

2022-10-06 12:49:21

by Conor Dooley

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On 06/10/2022 13:41, Andrew Jones wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
>
> On Thu, Oct 06, 2022 at 02:40:28PM +0800, Jisheng Zhang wrote:
>> Samuel reported that the static branch usage in cpu_relax() breaks
>> building with CONFIG_CC_OPTIMIZE_FOR_SIZE[1]:
>>
>> In file included from <command-line>:
>> ./arch/riscv/include/asm/jump_label.h: In function 'cpu_relax':
>> ././include/linux/compiler_types.h:285:33: warning: 'asm' operand 0
>> probably does not match constraints
>> 285 | #define asm_volatile_goto(x...) asm goto(x)
>> | ^~~
>> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
>> 'asm_volatile_goto'
>> 41 | asm_volatile_goto(
>> | ^~~~~~~~~~~~~~~~~
>> ././include/linux/compiler_types.h:285:33: error: impossible constraint
>> in 'asm'
>> 285 | #define asm_volatile_goto(x...) asm goto(x)
>> | ^~~
>> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
>> 'asm_volatile_goto'
>> 41 | asm_volatile_goto(
>> | ^~~~~~~~~~~~~~~~~
>> make[1]: *** [scripts/Makefile.build:249:
>> arch/riscv/kernel/vdso/vgettimeofday.o] Error 1
>> make: *** [arch/riscv/Makefile:128: vdso_prepare] Error 2
>>
>> Maybe "-Os" prevents GCC from detecting that the key/branch arguments
>> can be treated as constants and used as immediate operands. Inspired
>> by x86's commit 864b435514b2("x86/jump_label: Mark arguments as const to
>> satisfy asm constraints"), and as pointed out by Steven in [2] "The "i"
>> constraint needs to be a constant.", let's do similar modifications to
>> riscv.
>>
>> Tested by CC_OPTIMIZE_FOR_SIZE + gcc and CC_OPTIMIZE_FOR_SIZE + clang.
>>
>> [1]https://lore.kernel.org/linux-riscv/[email protected]/
>> [2]https://lore.kernel.org/all/[email protected]/

Hey Jisheng,

Could you please make these normal link tags.?
Also could you please add the reported-by from samuel & a fixes tag?

Thanks,
Conor.

>> Signed-off-by: Jisheng Zhang <[email protected]>
>> ---
>> arch/riscv/include/asm/jump_label.h | 8 ++++----
>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h
>> index 38af2ec7b9bf..6d58bbb5da46 100644
>> --- a/arch/riscv/include/asm/jump_label.h
>> +++ b/arch/riscv/include/asm/jump_label.h
>> @@ -14,8 +14,8 @@
>>
>> #define JUMP_LABEL_NOP_SIZE 4
>>
>> -static __always_inline bool arch_static_branch(struct static_key *key,
>> - bool branch)
>> +static __always_inline bool arch_static_branch(struct static_key * const key,
>> + const bool branch)
>> {
>> asm_volatile_goto(
>> " .option push \n\t"
>> @@ -35,8 +35,8 @@ static __always_inline bool arch_static_branch(struct static_key *key,
>> return true;
>> }
>>
>> -static __always_inline bool arch_static_branch_jump(struct static_key *key,
>> - bool branch)
>> +static __always_inline bool arch_static_branch_jump(struct static_key * const key,
>> + const bool branch)
>> {
>> asm_volatile_goto(
>> " .option push \n\t"
>> --
>> 2.37.2
>>
>
> Reviewed-by: Andrew Jones <[email protected]>
>
> _______________________________________________
> linux-riscv mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/linux-riscv

2022-10-08 14:41:34

by Jisheng Zhang

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Sat, Oct 08, 2022 at 10:09:02AM -0400, Steven Rostedt wrote:
> On Sat, 8 Oct 2022 10:07:48 -0400
> Steven Rostedt <[email protected]> wrote:
>
> > Link: https://lore.kernel.org/linux-riscv/[email protected]/
> > Link: https://lore.kernel.org/all/[email protected]/
> >
>
> This way tools can be used to map commits to links relevant to them.
> They key off the "Link:" tag keyword.

Thank you so much!

2022-10-08 14:55:25

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Sat, 8 Oct 2022 21:55:07 +0800
Jisheng Zhang <[email protected]> wrote:

> > >> [1]https://lore.kernel.org/linux-riscv/[email protected]/
> > >> [2]https://lore.kernel.org/all/[email protected]/
> >
> >
> > Could you please make these normal link tags.?
>
> How to make these link tags? I just used the permalink in
> lore.kernel.org

Link: https://lore.kernel.org/linux-riscv/[email protected]/
Link: https://lore.kernel.org/all/[email protected]/

-- Steve

2022-10-08 15:01:52

by Jisheng Zhang

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Thu, Oct 06, 2022 at 12:44:32PM +0000, [email protected] wrote:
> On 06/10/2022 13:41, Andrew Jones wrote:
> > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> >
> > On Thu, Oct 06, 2022 at 02:40:28PM +0800, Jisheng Zhang wrote:
> >> Samuel reported that the static branch usage in cpu_relax() breaks
> >> building with CONFIG_CC_OPTIMIZE_FOR_SIZE[1]:
> >>
> >> In file included from <command-line>:
> >> ./arch/riscv/include/asm/jump_label.h: In function 'cpu_relax':
> >> ././include/linux/compiler_types.h:285:33: warning: 'asm' operand 0
> >> probably does not match constraints
> >> 285 | #define asm_volatile_goto(x...) asm goto(x)
> >> | ^~~
> >> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> >> 'asm_volatile_goto'
> >> 41 | asm_volatile_goto(
> >> | ^~~~~~~~~~~~~~~~~
> >> ././include/linux/compiler_types.h:285:33: error: impossible constraint
> >> in 'asm'
> >> 285 | #define asm_volatile_goto(x...) asm goto(x)
> >> | ^~~
> >> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> >> 'asm_volatile_goto'
> >> 41 | asm_volatile_goto(
> >> | ^~~~~~~~~~~~~~~~~
> >> make[1]: *** [scripts/Makefile.build:249:
> >> arch/riscv/kernel/vdso/vgettimeofday.o] Error 1
> >> make: *** [arch/riscv/Makefile:128: vdso_prepare] Error 2
> >>
> >> Maybe "-Os" prevents GCC from detecting that the key/branch arguments
> >> can be treated as constants and used as immediate operands. Inspired
> >> by x86's commit 864b435514b2("x86/jump_label: Mark arguments as const to
> >> satisfy asm constraints"), and as pointed out by Steven in [2] "The "i"
> >> constraint needs to be a constant.", let's do similar modifications to
> >> riscv.
> >>
> >> Tested by CC_OPTIMIZE_FOR_SIZE + gcc and CC_OPTIMIZE_FOR_SIZE + clang.
> >>
> >> [1]https://lore.kernel.org/linux-riscv/[email protected]/
> >> [2]https://lore.kernel.org/all/[email protected]/
>
> Hey Jisheng,

Hi,

>
> Could you please make these normal link tags.?

How to make these link tags? I just used the permalink in
lore.kernel.org

> Also could you please add the reported-by from samuel & a fixes tag?

I will add Reported-by tag, but I'm not sure whether fixes tag
is suitable, and which commit I could use? commit 8eb060e1018
("arch/riscv: add Zihintpause support")?
>
> Thanks,
> Conor.
>
> >> Signed-off-by: Jisheng Zhang <[email protected]>
> >> ---
> >> arch/riscv/include/asm/jump_label.h | 8 ++++----
> >> 1 file changed, 4 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h
> >> index 38af2ec7b9bf..6d58bbb5da46 100644
> >> --- a/arch/riscv/include/asm/jump_label.h
> >> +++ b/arch/riscv/include/asm/jump_label.h
> >> @@ -14,8 +14,8 @@
> >>
> >> #define JUMP_LABEL_NOP_SIZE 4
> >>
> >> -static __always_inline bool arch_static_branch(struct static_key *key,
> >> - bool branch)
> >> +static __always_inline bool arch_static_branch(struct static_key * const key,
> >> + const bool branch)
> >> {
> >> asm_volatile_goto(
> >> " .option push \n\t"
> >> @@ -35,8 +35,8 @@ static __always_inline bool arch_static_branch(struct static_key *key,
> >> return true;
> >> }
> >>
> >> -static __always_inline bool arch_static_branch_jump(struct static_key *key,
> >> - bool branch)
> >> +static __always_inline bool arch_static_branch_jump(struct static_key * const key,
> >> + const bool branch)
> >> {
> >> asm_volatile_goto(
> >> " .option push \n\t"
> >> --
> >> 2.37.2
> >>
> >
> > Reviewed-by: Andrew Jones <[email protected]>
> >
> > _______________________________________________
> > linux-riscv mailing list
> > [email protected]
> > http://lists.infradead.org/mailman/listinfo/linux-riscv
>

2022-10-08 15:03:11

by Conor Dooley

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Sat, Oct 08, 2022 at 09:55:07PM +0800, Jisheng Zhang wrote:
> On Thu, Oct 06, 2022 at 12:44:32PM +0000, [email protected] wrote:
> > Also could you please add the reported-by from samuel & a fixes tag?
>
> I will add Reported-by tag, but I'm not sure whether fixes tag
> is suitable, and which commit I could use? commit 8eb060e1018
> ("arch/riscv: add Zihintpause support")?

That is the commit that Samuel blamed for the issue & is the one that
added the static branch - so I guess so!

Thanks,
Conor.

2022-10-08 16:31:41

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

On Sat, 8 Oct 2022 10:07:48 -0400
Steven Rostedt <[email protected]> wrote:

> Link: https://lore.kernel.org/linux-riscv/[email protected]/
> Link: https://lore.kernel.org/all/[email protected]/
>

This way tools can be used to map commits to links relevant to them.
They key off the "Link:" tag keyword.

-- Steve

2022-10-11 08:53:22

by Heiko Stuebner

[permalink] [raw]
Subject: Re: [PATCH] riscv: jump_label: mark arguments as const to satisfy asm constraints

Am Donnerstag, 6. Oktober 2022, 08:40:28 CEST schrieb Jisheng Zhang:
> Samuel reported that the static branch usage in cpu_relax() breaks
> building with CONFIG_CC_OPTIMIZE_FOR_SIZE[1]:
>
> In file included from <command-line>:
> ./arch/riscv/include/asm/jump_label.h: In function 'cpu_relax':
> ././include/linux/compiler_types.h:285:33: warning: 'asm' operand 0
> probably does not match constraints
> 285 | #define asm_volatile_goto(x...) asm goto(x)
> | ^~~
> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> 'asm_volatile_goto'
> 41 | asm_volatile_goto(
> | ^~~~~~~~~~~~~~~~~
> ././include/linux/compiler_types.h:285:33: error: impossible constraint
> in 'asm'
> 285 | #define asm_volatile_goto(x...) asm goto(x)
> | ^~~
> ./arch/riscv/include/asm/jump_label.h:41:9: note: in expansion of macro
> 'asm_volatile_goto'
> 41 | asm_volatile_goto(
> | ^~~~~~~~~~~~~~~~~
> make[1]: *** [scripts/Makefile.build:249:
> arch/riscv/kernel/vdso/vgettimeofday.o] Error 1
> make: *** [arch/riscv/Makefile:128: vdso_prepare] Error 2
>
> Maybe "-Os" prevents GCC from detecting that the key/branch arguments
> can be treated as constants and used as immediate operands. Inspired
> by x86's commit 864b435514b2("x86/jump_label: Mark arguments as const to
> satisfy asm constraints"), and as pointed out by Steven in [2] "The "i"
> constraint needs to be a constant.", let's do similar modifications to
> riscv.
>
> Tested by CC_OPTIMIZE_FOR_SIZE + gcc and CC_OPTIMIZE_FOR_SIZE + clang.

I ran into the same build-issue when enabling CC_OPTIMIZE_FOR_SIZE
and this patch fixes it, so

Tested-by: Heiko Stuebner <[email protected]>


> [1]https://lore.kernel.org/linux-riscv/[email protected]/
> [2]https://lore.kernel.org/all/[email protected]/
> Signed-off-by: Jisheng Zhang <[email protected]>
> ---
> arch/riscv/include/asm/jump_label.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h
> index 38af2ec7b9bf..6d58bbb5da46 100644
> --- a/arch/riscv/include/asm/jump_label.h
> +++ b/arch/riscv/include/asm/jump_label.h
> @@ -14,8 +14,8 @@
>
> #define JUMP_LABEL_NOP_SIZE 4
>
> -static __always_inline bool arch_static_branch(struct static_key *key,
> - bool branch)
> +static __always_inline bool arch_static_branch(struct static_key * const key,
> + const bool branch)
> {
> asm_volatile_goto(
> " .option push \n\t"
> @@ -35,8 +35,8 @@ static __always_inline bool arch_static_branch(struct static_key *key,
> return true;
> }
>
> -static __always_inline bool arch_static_branch_jump(struct static_key *key,
> - bool branch)
> +static __always_inline bool arch_static_branch_jump(struct static_key * const key,
> + const bool branch)
> {
> asm_volatile_goto(
> " .option push \n\t"
>