When compiling an external kernel module with `-O0` or `-O1`, the following
compile error may be reported:
./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
25 | asm_volatile_goto("1:"
| ^~~~~~~~~~~~~~~~~
It appears that these lower optimization levels prevent GCC from detecting
that the key/branch arguments can be treated as constants and used as
immediate operands. To work around this, explicitly add the `const` label.
Signed-off-by: Jason Gerecke <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
---
Marked RFC since I'm not familiar with this subsystem or the asm blocks that
are impacted. Extra-close inspection would be appreciated.
arch/x86/include/asm/jump_label.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index 06c3cc22a058..7f2006645d84 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -20,7 +20,7 @@
#include <linux/stringify.h>
#include <linux/types.h>
-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("1:"
".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
@@ -36,7 +36,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
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("1:"
".byte 0xe9\n\t .long %l[l_yes] - 2f\n\t"
--
2.30.1
On Thu, 11 Feb 2021 13:48:48 -0800
Jason Gerecke <[email protected]> wrote:
> When compiling an external kernel module with `-O0` or `-O1`, the following
> compile error may be reported:
>
> ./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
> 25 | asm_volatile_goto("1:"
> | ^~~~~~~~~~~~~~~~~
>
> It appears that these lower optimization levels prevent GCC from detecting
> that the key/branch arguments can be treated as constants and used as
> immediate operands. To work around this, explicitly add the `const` label.
Yes this makes sense. The "i" constraint needs to be a constant.
Reviewed-by: Steven Rostedt (VMware) <[email protected]>
-- Steve
>
> Signed-off-by: Jason Gerecke <[email protected]>
> Cc: Steven Rostedt <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> ---
> Marked RFC since I'm not familiar with this subsystem or the asm blocks that
> are impacted. Extra-close inspection would be appreciated.
>
> arch/x86/include/asm/jump_label.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
> index 06c3cc22a058..7f2006645d84 100644
> --- a/arch/x86/include/asm/jump_label.h
> +++ b/arch/x86/include/asm/jump_label.h
> @@ -20,7 +20,7 @@
> #include <linux/stringify.h>
> #include <linux/types.h>
>
> -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("1:"
> ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
> @@ -36,7 +36,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
> 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("1:"
> ".byte 0xe9\n\t .long %l[l_yes] - 2f\n\t"
On Fri, Feb 12, 2021 at 09:40:59AM -0500, Steven Rostedt wrote:
> On Thu, 11 Feb 2021 13:48:48 -0800
> Jason Gerecke <[email protected]> wrote:
>
> > When compiling an external kernel module with `-O0` or `-O1`, the following
> > compile error may be reported:
> >
> > ./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
> > 25 | asm_volatile_goto("1:"
> > | ^~~~~~~~~~~~~~~~~
> >
> > It appears that these lower optimization levels prevent GCC from detecting
> > that the key/branch arguments can be treated as constants and used as
> > immediate operands. To work around this, explicitly add the `const` label.
>
> Yes this makes sense. The "i" constraint needs to be a constant.
Right, using -O[01] seems a little daft though. But yeah, that patch is
correct and won't cause harm.
I've queued it for after the next merge window.
On Fri, Feb 12, 2021 at 7:27 AM Peter Zijlstra <[email protected]> wrote:
>
> On Fri, Feb 12, 2021 at 09:40:59AM -0500, Steven Rostedt wrote:
> > On Thu, 11 Feb 2021 13:48:48 -0800
> > Jason Gerecke <[email protected]> wrote:
> >
> > > When compiling an external kernel module with `-O0` or `-O1`, the following
> > > compile error may be reported:
> > >
> > > ./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
> > > 25 | asm_volatile_goto("1:"
> > > | ^~~~~~~~~~~~~~~~~
> > >
> > > It appears that these lower optimization levels prevent GCC from detecting
> > > that the key/branch arguments can be treated as constants and used as
> > > immediate operands. To work around this, explicitly add the `const` label.
> >
> > Yes this makes sense. The "i" constraint needs to be a constant.
>
> Right, using -O[01] seems a little daft though. But yeah, that patch is
> correct and won't cause harm.
>
> I've queued it for after the next merge window.
Thanks. Only reason I even tried compiling at those levels was to play
around with GCC's new static analyzer options. They seem to be
ineffective at more normal optimization levels.
On Thu, Feb 11, 2021 at 01:48:48PM -0800, Jason Gerecke wrote:
> When compiling an external kernel module with `-O0` or `-O1`, the following
> compile error may be reported:
>
> ./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
> 25 | asm_volatile_goto("1:"
> | ^~~~~~~~~~~~~~~~~
>
> It appears that these lower optimization levels prevent GCC from detecting
> that the key/branch arguments can be treated as constants and used as
> immediate operands. To work around this, explicitly add the `const` label.
>
> Signed-off-by: Jason Gerecke <[email protected]>
> Cc: Steven Rostedt <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> ---
> Marked RFC since I'm not familiar with this subsystem or the asm blocks that
> are impacted. Extra-close inspection would be appreciated.
Acked-by: Josh Poimboeuf <[email protected]>
--
Josh
The following commit has been merged into the locking/core branch of tip:
Commit-ID: 566a9522381495d27b596ee3bdc9578ba02a895d
Gitweb: https://git.kernel.org/tip/566a9522381495d27b596ee3bdc9578ba02a895d
Author: Jason Gerecke <[email protected]>
AuthorDate: Thu, 11 Feb 2021 13:48:48 -08:00
Committer: Peter Zijlstra <[email protected]>
CommitterDate: Tue, 02 Mar 2021 15:06:34 +01:00
x86/jump_label: Mark arguments as const to satisfy asm constraints
When compiling an external kernel module with `-O0` or `-O1`, the following
compile error may be reported:
./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
25 | asm_volatile_goto("1:"
| ^~~~~~~~~~~~~~~~~
It appears that these lower optimization levels prevent GCC from detecting
that the key/branch arguments can be treated as constants and used as
immediate operands. To work around this, explicitly add the `const` label.
Signed-off-by: Jason Gerecke <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Reviewed-by: Steven Rostedt (VMware) <[email protected]>
Acked-by: Josh Poimboeuf <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
arch/x86/include/asm/jump_label.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index 06c3cc2..7f20066 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -20,7 +20,7 @@
#include <linux/stringify.h>
#include <linux/types.h>
-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("1:"
".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
@@ -36,7 +36,7 @@ l_yes:
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("1:"
".byte 0xe9\n\t .long %l[l_yes] - 2f\n\t"
The following commit has been merged into the locking/core branch of tip:
Commit-ID: 864b435514b286c0be2a38a02f487aa28d990ef8
Gitweb: https://git.kernel.org/tip/864b435514b286c0be2a38a02f487aa28d990ef8
Author: Jason Gerecke <[email protected]>
AuthorDate: Thu, 11 Feb 2021 13:48:48 -08:00
Committer: Ingo Molnar <[email protected]>
CommitterDate: Sat, 06 Mar 2021 12:51:00 +01:00
x86/jump_label: Mark arguments as const to satisfy asm constraints
When compiling an external kernel module with `-O0` or `-O1`, the following
compile error may be reported:
./arch/x86/include/asm/jump_label.h:25:2: error: impossible constraint in ‘asm’
25 | asm_volatile_goto("1:"
| ^~~~~~~~~~~~~~~~~
It appears that these lower optimization levels prevent GCC from detecting
that the key/branch arguments can be treated as constants and used as
immediate operands. To work around this, explicitly add the `const` label.
Signed-off-by: Jason Gerecke <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
Reviewed-by: Steven Rostedt (VMware) <[email protected]>
Acked-by: Josh Poimboeuf <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
arch/x86/include/asm/jump_label.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index 06c3cc2..7f20066 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -20,7 +20,7 @@
#include <linux/stringify.h>
#include <linux/types.h>
-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("1:"
".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
@@ -36,7 +36,7 @@ l_yes:
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("1:"
".byte 0xe9\n\t .long %l[l_yes] - 2f\n\t"