Use early_param() to get the value of the tsx= command line parameter. It
is an early parameter, because it must be parsed before tsx_init(), which
is called long before kernel_init(), where normal parameters are parsed.
Although cmdline_find_option() from tsx_init() works fine, the option is
later reported as unknown and passed to user space. The latter is not a
real issue, but the former is confusing and makes people wonder if the tsx=
parameter had any effect and double-check for typos unnecessarily.
The behavior changes slightly if "tsx" is given without any argument (which
is invalid syntax). Prior to this patch, the kernel logged an error message
and disabled TSX. With this patch, the kernel still issues a warning
(Malformed early option 'tsx'), but TSX state is unchanged. The new
behavior is consistent with other parameters, e.g. "tsx_async_abort".
Suggested-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
---
arch/x86/kernel/cpu/tsx.c | 52 ++++++++++++++++++++-------------------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c
index 8be08ece2214..74ba4abac7e9 100644
--- a/arch/x86/kernel/cpu/tsx.c
+++ b/arch/x86/kernel/cpu/tsx.c
@@ -20,13 +20,17 @@
#define pr_fmt(fmt) "tsx: " fmt
enum tsx_ctrl_states {
+ TSX_CTRL_AUTO,
TSX_CTRL_ENABLE,
TSX_CTRL_DISABLE,
TSX_CTRL_RTM_ALWAYS_ABORT,
TSX_CTRL_NOT_SUPPORTED,
};
-static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED;
+static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init =
+ IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
+ IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE :
+ TSX_CTRL_ENABLE;
static void tsx_disable(void)
{
@@ -163,11 +167,28 @@ static void tsx_dev_mode_disable(void)
}
}
-void __init tsx_init(void)
+static int __init tsx_parse_cmdline(char *str)
{
- char arg[5] = {};
- int ret;
+ if (!str)
+ return -EINVAL;
+
+ if (!strcmp(str, "on")) {
+ tsx_ctrl_state = TSX_CTRL_ENABLE;
+ } else if (!strcmp(str, "off")) {
+ tsx_ctrl_state = TSX_CTRL_DISABLE;
+ } else if (!strcmp(str, "auto")) {
+ tsx_ctrl_state = TSX_CTRL_AUTO;
+ } else {
+ tsx_ctrl_state = TSX_CTRL_DISABLE;
+ pr_err("invalid option, defaulting to off\n");
+ }
+
+ return 0;
+}
+early_param("tsx", tsx_parse_cmdline);
+void __init tsx_init(void)
+{
tsx_dev_mode_disable();
/*
@@ -201,27 +222,8 @@ void __init tsx_init(void)
return;
}
- ret = cmdline_find_option(boot_command_line, "tsx", arg, sizeof(arg));
- if (ret >= 0) {
- if (!strcmp(arg, "on")) {
- tsx_ctrl_state = TSX_CTRL_ENABLE;
- } else if (!strcmp(arg, "off")) {
- tsx_ctrl_state = TSX_CTRL_DISABLE;
- } else if (!strcmp(arg, "auto")) {
- tsx_ctrl_state = x86_get_tsx_auto_mode();
- } else {
- tsx_ctrl_state = TSX_CTRL_DISABLE;
- pr_err("invalid option, defaulting to off\n");
- }
- } else {
- /* tsx= not provided */
- if (IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO))
- tsx_ctrl_state = x86_get_tsx_auto_mode();
- else if (IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF))
- tsx_ctrl_state = TSX_CTRL_DISABLE;
- else
- tsx_ctrl_state = TSX_CTRL_ENABLE;
- }
+ if (tsx_ctrl_state == TSX_CTRL_AUTO)
+ tsx_ctrl_state = x86_get_tsx_auto_mode();
if (tsx_ctrl_state == TSX_CTRL_DISABLE) {
tsx_disable();
--
2.51.0
On Wed, Oct 22, 2025 at 12:26:13PM +0200, Petr Tesarik wrote:
> Use early_param() to get the value of the tsx= command line parameter. It
> is an early parameter, because it must be parsed before tsx_init(), which
> is called long before kernel_init(), where normal parameters are parsed.
>
> Although cmdline_find_option() from tsx_init() works fine, the option is
> later reported as unknown and passed to user space. The latter is not a
> real issue, but the former is confusing and makes people wonder if the tsx=
> parameter had any effect and double-check for typos unnecessarily.
>
> The behavior changes slightly if "tsx" is given without any argument (which
> is invalid syntax). Prior to this patch, the kernel logged an error message
> and disabled TSX. With this patch, the kernel still issues a warning
> (Malformed early option 'tsx'), but TSX state is unchanged. The new
> behavior is consistent with other parameters, e.g. "tsx_async_abort".
>
> Suggested-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> Signed-off-by: Petr Tesarik <ptesarik@suse.com>
> ---
> arch/x86/kernel/cpu/tsx.c | 52 ++++++++++++++++++++-------------------
> 1 file changed, 27 insertions(+), 25 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c
> index 8be08ece2214..74ba4abac7e9 100644
> --- a/arch/x86/kernel/cpu/tsx.c
> +++ b/arch/x86/kernel/cpu/tsx.c
> @@ -20,13 +20,17 @@
> #define pr_fmt(fmt) "tsx: " fmt
>
> enum tsx_ctrl_states {
> + TSX_CTRL_AUTO,
> TSX_CTRL_ENABLE,
> TSX_CTRL_DISABLE,
> TSX_CTRL_RTM_ALWAYS_ABORT,
> TSX_CTRL_NOT_SUPPORTED,
> };
>
> -static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED;
> +static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init =
> + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
> + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE :
^
The extra space I had in
the version I sent was
intentional.
> + TSX_CTRL_ENABLE;
Also this can stay on the same line.
IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE : TSX_CTRL_ENABLE;
IMO, this is so much more easier to read.
On Wed, 22 Oct 2025 10:46:03 -0700
Pawan Gupta <pawan.kumar.gupta@linux.intel.com> wrote:
> On Wed, Oct 22, 2025 at 12:26:13PM +0200, Petr Tesarik wrote:
> > Use early_param() to get the value of the tsx= command line parameter. It
> > is an early parameter, because it must be parsed before tsx_init(), which
> > is called long before kernel_init(), where normal parameters are parsed.
> >
> > Although cmdline_find_option() from tsx_init() works fine, the option is
> > later reported as unknown and passed to user space. The latter is not a
> > real issue, but the former is confusing and makes people wonder if the tsx=
> > parameter had any effect and double-check for typos unnecessarily.
> >
> > The behavior changes slightly if "tsx" is given without any argument (which
> > is invalid syntax). Prior to this patch, the kernel logged an error message
> > and disabled TSX. With this patch, the kernel still issues a warning
> > (Malformed early option 'tsx'), but TSX state is unchanged. The new
> > behavior is consistent with other parameters, e.g. "tsx_async_abort".
> >
> > Suggested-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> > Signed-off-by: Petr Tesarik <ptesarik@suse.com>
> > ---
> > arch/x86/kernel/cpu/tsx.c | 52 ++++++++++++++++++++-------------------
> > 1 file changed, 27 insertions(+), 25 deletions(-)
> >
> > diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c
> > index 8be08ece2214..74ba4abac7e9 100644
> > --- a/arch/x86/kernel/cpu/tsx.c
> > +++ b/arch/x86/kernel/cpu/tsx.c
> > @@ -20,13 +20,17 @@
> > #define pr_fmt(fmt) "tsx: " fmt
> >
> > enum tsx_ctrl_states {
> > + TSX_CTRL_AUTO,
> > TSX_CTRL_ENABLE,
> > TSX_CTRL_DISABLE,
> > TSX_CTRL_RTM_ALWAYS_ABORT,
> > TSX_CTRL_NOT_SUPPORTED,
> > };
> >
> > -static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED;
> > +static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init =
> > + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
> > + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE :
> ^
> The extra space I had in
> the version I sent was
> intentional.
>
> > + TSX_CTRL_ENABLE;
>
> Also this can stay on the same line.
>
> IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
> IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE : TSX_CTRL_ENABLE;
>
> IMO, this is so much more easier to read.
Matter of taste if you ask me. I have no preference either way, so if
you do have an opinion, let's write it your way.
Do I have to resubmit, or can an x86 maintainer adjust it when applying
the patch?
Petr T
On Thu, Oct 23, 2025 at 08:45:10AM +0200, Petr Tesarik wrote:
> On Wed, 22 Oct 2025 10:46:03 -0700
> Pawan Gupta <pawan.kumar.gupta@linux.intel.com> wrote:
>
> > On Wed, Oct 22, 2025 at 12:26:13PM +0200, Petr Tesarik wrote:
> > > Use early_param() to get the value of the tsx= command line parameter. It
> > > is an early parameter, because it must be parsed before tsx_init(), which
> > > is called long before kernel_init(), where normal parameters are parsed.
> > >
> > > Although cmdline_find_option() from tsx_init() works fine, the option is
> > > later reported as unknown and passed to user space. The latter is not a
> > > real issue, but the former is confusing and makes people wonder if the tsx=
> > > parameter had any effect and double-check for typos unnecessarily.
> > >
> > > The behavior changes slightly if "tsx" is given without any argument (which
> > > is invalid syntax). Prior to this patch, the kernel logged an error message
> > > and disabled TSX. With this patch, the kernel still issues a warning
> > > (Malformed early option 'tsx'), but TSX state is unchanged. The new
> > > behavior is consistent with other parameters, e.g. "tsx_async_abort".
> > >
> > > Suggested-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> > > Signed-off-by: Petr Tesarik <ptesarik@suse.com>
> > > ---
> > > arch/x86/kernel/cpu/tsx.c | 52 ++++++++++++++++++++-------------------
> > > 1 file changed, 27 insertions(+), 25 deletions(-)
> > >
> > > diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c
> > > index 8be08ece2214..74ba4abac7e9 100644
> > > --- a/arch/x86/kernel/cpu/tsx.c
> > > +++ b/arch/x86/kernel/cpu/tsx.c
> > > @@ -20,13 +20,17 @@
> > > #define pr_fmt(fmt) "tsx: " fmt
> > >
> > > enum tsx_ctrl_states {
> > > + TSX_CTRL_AUTO,
> > > TSX_CTRL_ENABLE,
> > > TSX_CTRL_DISABLE,
> > > TSX_CTRL_RTM_ALWAYS_ABORT,
> > > TSX_CTRL_NOT_SUPPORTED,
> > > };
> > >
> > > -static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED;
> > > +static enum tsx_ctrl_states tsx_ctrl_state __ro_after_init =
> > > + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
> > > + IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE :
> > ^
> > The extra space I had in
> > the version I sent was
> > intentional.
> >
> > > + TSX_CTRL_ENABLE;
> >
> > Also this can stay on the same line.
> >
> > IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_AUTO) ? TSX_CTRL_AUTO :
> > IS_ENABLED(CONFIG_X86_INTEL_TSX_MODE_OFF) ? TSX_CTRL_DISABLE : TSX_CTRL_ENABLE;
> >
> > IMO, this is so much more easier to read.
>
> Matter of taste if you ask me. I have no preference either way, so if you
> do have an opinion, let's write it your way.
I would let the maintainers decide how they want it.
> Do I have to resubmit, or can an x86 maintainer adjust it when applying
> the patch?
Borislav, Dave?
© 2016 - 2025 Red Hat, Inc.