[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
<LV3PR12MB926534BA78B6888767E446CC9435A@LV3PR12MB9265.namprd12.prod.outlook.com>
Date: Thu, 14 Aug 2025 18:39:34 +0000
From: "Kaplan, David" <David.Kaplan@....com>
To: Pawan Gupta <pawan.kumar.gupta@...ux.intel.com>
CC: Thomas Gleixner <tglx@...utronix.de>, Borislav Petkov <bp@...en8.de>,
Peter Zijlstra <peterz@...radead.org>, Josh Poimboeuf <jpoimboe@...nel.org>,
Ingo Molnar <mingo@...hat.com>, Dave Hansen <dave.hansen@...ux.intel.com>,
"x86@...nel.org" <x86@...nel.org>, "H . Peter Anvin" <hpa@...or.com>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: RE: [PATCH 2/3] x86/bugs: Use early_param for spectre_v2
[AMD Official Use Only - AMD Internal Distribution Only]
> -----Original Message-----
> From: Pawan Gupta <pawan.kumar.gupta@...ux.intel.com>
> Sent: Thursday, August 14, 2025 11:55 AM
> To: Kaplan, David <David.Kaplan@....com>
> Cc: Thomas Gleixner <tglx@...utronix.de>; Borislav Petkov <bp@...en8.de>; Peter
> Zijlstra <peterz@...radead.org>; Josh Poimboeuf <jpoimboe@...nel.org>; Ingo
> Molnar <mingo@...hat.com>; Dave Hansen <dave.hansen@...ux.intel.com>;
> x86@...nel.org; H . Peter Anvin <hpa@...or.com>; linux-kernel@...r.kernel.org
> Subject: Re: [PATCH 2/3] x86/bugs: Use early_param for spectre_v2
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> On Mon, Aug 11, 2025 at 09:26:58AM -0500, David Kaplan wrote:
> > Most of the mitigations in bugs.c use early_param for command line parsing.
> > Rework the spectre_v2 and nospectre_v2 command line options to be
> > consistent with the others.
> >
> > Signed-off-by: David Kaplan <david.kaplan@....com>
> > ---
> > arch/x86/kernel/cpu/bugs.c | 151 +++++++++++++++++++------------------
> > 1 file changed, 78 insertions(+), 73 deletions(-)
> >
> > diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> > index 6bfe199b9f3e..19a3891953c3 100644
> > --- a/arch/x86/kernel/cpu/bugs.c
> > +++ b/arch/x86/kernel/cpu/bugs.c
> > @@ -1827,7 +1827,8 @@ enum spectre_v2_mitigation_cmd {
> > SPECTRE_V2_CMD_IBRS,
> > };
> >
> > -static enum spectre_v2_mitigation_cmd spectre_v2_cmd __ro_after_init =
> SPECTRE_V2_CMD_AUTO;
> > +static enum spectre_v2_mitigation_cmd spectre_v2_cmd __ro_after_init =
> > + IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ?
> SPECTRE_V2_CMD_AUTO : SPECTRE_V2_CMD_NONE;
> >
> > enum spectre_v2_user_mitigation_cmd {
> > SPECTRE_V2_USER_CMD_NONE,
> > @@ -2035,112 +2036,118 @@ static const char * const spectre_v2_strings[] = {
> > [SPECTRE_V2_IBRS] = "Mitigation: IBRS",
> > };
> >
> > -static const struct {
> > - const char *option;
> > - enum spectre_v2_mitigation_cmd cmd;
> > - bool secure;
> > -} mitigation_options[] __initconst = {
> > - { "off", SPECTRE_V2_CMD_NONE, false },
> > - { "on", SPECTRE_V2_CMD_FORCE, true },
> > - { "retpoline", SPECTRE_V2_CMD_RETPOLINE, false },
> > - { "retpoline,amd", SPECTRE_V2_CMD_RETPOLINE_LFENCE, false },
> > - { "retpoline,lfence", SPECTRE_V2_CMD_RETPOLINE_LFENCE, false },
> > - { "retpoline,generic", SPECTRE_V2_CMD_RETPOLINE_GENERIC, false },
> > - { "eibrs", SPECTRE_V2_CMD_EIBRS, false },
> > - { "eibrs,lfence", SPECTRE_V2_CMD_EIBRS_LFENCE, false },
> > - { "eibrs,retpoline", SPECTRE_V2_CMD_EIBRS_RETPOLINE, false },
> > - { "auto", SPECTRE_V2_CMD_AUTO, false },
> > - { "ibrs", SPECTRE_V2_CMD_IBRS, false },
> > -};
> > -
> > static void __init spec_v2_print_cond(const char *reason, bool secure)
> > {
> > if (boot_cpu_has_bug(X86_BUG_SPECTRE_V2) != secure)
> > pr_info("%s selected on command line.\n", reason);
> > }
> >
> > -static enum spectre_v2_mitigation_cmd __init spectre_v2_parse_cmdline(void)
> > -{
> > - enum spectre_v2_mitigation_cmd cmd;
> > - char arg[20];
> > - int ret, i;
> > +static bool nospectre_v2 __ro_after_init;
> >
> > - cmd = IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ?
> SPECTRE_V2_CMD_AUTO : SPECTRE_V2_CMD_NONE;
> > - if (cmdline_find_option_bool(boot_command_line, "nospectre_v2"))
> > - return SPECTRE_V2_CMD_NONE;
> > +static int __init nospectre_v2_parse_cmdline(char *str)
> > +{
> > + nospectre_v2 = true;
> > + spectre_v2_cmd = SPECTRE_V2_CMD_NONE;
> > + return 0;
> > +}
> > +early_param("nospectre_v2", nospectre_v2_parse_cmdline);
> >
> > - ret = cmdline_find_option(boot_command_line, "spectre_v2", arg, sizeof(arg));
> > - if (ret < 0)
> > - return cmd;
> > +static int __init spectre_v2_parse_cmdline(char *str)
> > +{
> > + if (!str)
> > + return -EINVAL;
> >
> > - for (i = 0; i < ARRAY_SIZE(mitigation_options); i++) {
> > - if (!match_option(arg, ret, mitigation_options[i].option))
> > - continue;
> > - cmd = mitigation_options[i].cmd;
> > - break;
> > - }
> > + if (nospectre_v2)
> > + return 0;
> >
> > - if (i >= ARRAY_SIZE(mitigation_options)) {
> > - pr_err("unknown option (%s). Switching to default mode\n", arg);
> > - return cmd;
> > - }
> > + if (!strcmp(str, "off"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_NONE;
> > + else if (!strcmp(str, "on"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_FORCE;
> > + else if (!strcmp(str, "retpoline"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_RETPOLINE;
> > + else if (!strcmp(str, "retpoline,amd") ||
> > + !strcmp(str, "retpoline,lfence"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_RETPOLINE_LFENCE;
> > + else if (!strcmp(str, "retpoline,generic"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_RETPOLINE_GENERIC;
> > + else if (!strcmp(str, "eibrs"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_EIBRS;
> > + else if (!strcmp(str, "eibrs,lfence"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_EIBRS_LFENCE;
> > + else if (!strcmp(str, "eibrs,retpoline"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_EIBRS_RETPOLINE;
> > + else if (!strcmp(str, "auto"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_AUTO;
> > + else if (!strcmp(str, "ibrs"))
> > + spectre_v2_cmd = SPECTRE_V2_CMD_IBRS;
> > + else
> > + pr_err("Ignoring unknown spectre_v2 option (%s).", str);
>
> All of the below should go in spectre_v2_select_mitigation() after all
> features are detected because ...
>
> > - if ((cmd == SPECTRE_V2_CMD_RETPOLINE ||
> > - cmd == SPECTRE_V2_CMD_RETPOLINE_LFENCE ||
> > - cmd == SPECTRE_V2_CMD_RETPOLINE_GENERIC ||
> > - cmd == SPECTRE_V2_CMD_EIBRS_LFENCE ||
> > - cmd == SPECTRE_V2_CMD_EIBRS_RETPOLINE) &&
> > + if ((spectre_v2_cmd == SPECTRE_V2_CMD_RETPOLINE ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_RETPOLINE_LFENCE ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_RETPOLINE_GENERIC ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS_LFENCE ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS_RETPOLINE) &&
> > !IS_ENABLED(CONFIG_MITIGATION_RETPOLINE)) {
> > pr_err("%s selected but not compiled in. Switching to AUTO select\n",
> > - mitigation_options[i].option);
> > - return SPECTRE_V2_CMD_AUTO;
> > + str);
> > + spectre_v2_cmd = SPECTRE_V2_CMD_AUTO;
> > }
> >
> > - if ((cmd == SPECTRE_V2_CMD_EIBRS ||
> > - cmd == SPECTRE_V2_CMD_EIBRS_LFENCE ||
> > - cmd == SPECTRE_V2_CMD_EIBRS_RETPOLINE) &&
> > + if ((spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS_LFENCE ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS_RETPOLINE) &&
> > !boot_cpu_has(X86_FEATURE_IBRS_ENHANCED)) {
>
> ... X86_FEATURE_IBRS_ENHANCED is not enumerated yet in early_param
> processing.
Ah, thanks for catching that.
>
> > pr_err("%s selected but CPU doesn't have Enhanced or Automatic IBRS.
> Switching to AUTO select\n",
> > - mitigation_options[i].option);
> > - return SPECTRE_V2_CMD_AUTO;
> > + str);
> > + spectre_v2_cmd = SPECTRE_V2_CMD_AUTO;
> > }
> >
> > - if ((cmd == SPECTRE_V2_CMD_RETPOLINE_LFENCE ||
> > - cmd == SPECTRE_V2_CMD_EIBRS_LFENCE) &&
> > + if ((spectre_v2_cmd == SPECTRE_V2_CMD_RETPOLINE_LFENCE ||
> > + spectre_v2_cmd == SPECTRE_V2_CMD_EIBRS_LFENCE) &&
> > !boot_cpu_has(X86_FEATURE_LFENCE_RDTSC)) {
>
> and this. So in essence, spectre_v2_parse_cmdline() should only record what
> user wanted.
Yeah makes sense, I'll work on fixing that.
--David Kaplan
Powered by blists - more mailing lists