public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Maciej Wieczór-Retman" <m.wieczorretman@pm.me>
To: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Cc: tglx@kernel.org, peterz@infradead.org, xin@zytor.com,
	maciej.wieczor-retman@intel.com, babu.moger@amd.com,
	chang.seok.bae@intel.com, sohil.mehta@intel.com,
	dave.hansen@linux.intel.com, jpoimboe@kernel.org,
	elena.reshetova@intel.com, hpa@zytor.com, ak@linux.intel.com,
	darwi@linutronix.de, bp@alien8.de, mingo@redhat.com,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v11 3/4] x86/cpu: Do a sanity check on required feature bits
Date: Sat, 21 Mar 2026 05:58:18 +0000	[thread overview]
Message-ID: <ab4xlKVJtk4IOcS4@maciej> (raw)
In-Reply-To: <20260321003015.4i7wrqmaunbljguw@desk>

On 2026-03-20 at 17:31:27 -0700, Pawan Gupta wrote:
>On Fri, Mar 20, 2026 at 12:50:25PM +0000, Maciej Wieczor-Retman wrote:
>...
>> diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
>> index 0e318f3d56cb..92159a0963c8 100644
>> --- a/arch/x86/kernel/cpu/common.c
>> +++ b/arch/x86/kernel/cpu/common.c
>> @@ -2005,6 +2005,38 @@ const char *x86_cap_name(unsigned int bit, char *buf)
>>  	return buf;
>>  }
>>
>> +/*
>> + * As a sanity check compare the final x86_capability bitmask with the initial
>> + * predefined required feature bits.
>> + */
>> +static void verify_required_features(const struct cpuinfo_x86 *c)
>> +{
>> +	u32 required_features[NCAPINTS] = REQUIRED_MASK_INIT;
>> +	DECLARE_BITMAP(missing, NCAPINTS * 32);
>> +	char cap_buf[X86_CAP_BUF_SIZE];
>> +	u32 *missing_u32;
>> +	unsigned int i;
>> +	u32 error = 0;
>> +
>> +	memset(missing, 0, sizeof(missing));
>> +	missing_u32 = (u32 *)missing;
>> +
>> +	for (i = 0; i < NCAPINTS; i++) {
>> +		missing_u32[i] = ~c->x86_capability[i] & required_features[i];
>> +		error |= missing_u32[i];
>> +	}
>> +
>> +	if (!error)
>> +		return;
>> +
>> +	/* At least one required feature is missing */
>> +	pr_warn("CPU %d: missing required feature(s):", c->cpu_index);
>> +	for_each_set_bit(i, missing, NCAPINTS * 32)
>> +		pr_cont(" %s", x86_cap_name(i, cap_buf));
>> +	pr_cont("\n");
>> +	add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
>> +}
>
>Do we need 2 loops? Can this be simplified as below:
>
>static void verify_required_features(const struct cpuinfo_x86 *c)
>{
>	u32 required_features[NCAPINTS + 1] = REQUIRED_MASK_INIT;
>	char cap_buf[X86_CAP_BUF_SIZE];
>	int i, error = 0;
>
>	for_each_set_bit(i, (unsigned long *)required_features, NCAPINTS * 32) {
>		if (test_bit(i, (unsigned long *)c->x86_capability))
>			continue;
>		if (!error)
>			pr_warn("CPU %d: missing required feature(s):", c->cpu_index);
>		pr_cont(" %s", x86_cap_name(i, cap_buf));
>		error = 1;
>	}
>
>	if (!error)
>		return;
>
>	pr_cont("\n");
>	add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
>}

I'll have to test it but one concern I'd have is the pr_cont() in this
context? Since it can technically have asynchronous problems I would
think putting more code between subsequent calls to pr_cont() can
increase the chance of some race condition. But perhaps these two if
checks are not nearly enough for that to happen.

Otherwise I liked in the previous approach the steps of setting up a
bitmask with simple bitwise logic operations, then checking the results
later. But the above code also works and I think it is easier to read.
So if there is no opposition I'll test it and switch to it for the next
version, thanks :)

-- 
Kind regards
Maciej Wieczór-Retman


  reply	other threads:[~2026-03-21  5:58 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-20 12:50 [PATCH v11 0/4] x86: Capability bits fix and required bits sanity check Maciej Wieczor-Retman
2026-03-20 12:50 ` [PATCH v11 1/4] x86/cpu: Clear feature bits disabled at compile-time Maciej Wieczor-Retman
2026-03-20 12:50 ` [PATCH v11 2/4] x86/cpu: Check if feature string is non-zero Maciej Wieczor-Retman
2026-03-23 14:24   ` Borislav Petkov
2026-03-23 15:52     ` Maciej Wieczor-Retman
2026-03-23 16:23       ` Borislav Petkov
2026-03-23 16:58         ` Maciej Wieczor-Retman
2026-03-23 17:51           ` Borislav Petkov
2026-03-23 18:11             ` Maciej Wieczor-Retman
2026-03-23 18:15               ` H. Peter Anvin
2026-03-20 12:50 ` [PATCH v11 3/4] x86/cpu: Do a sanity check on required feature bits Maciej Wieczor-Retman
2026-03-21  0:31   ` Pawan Gupta
2026-03-21  5:58     ` Maciej Wieczór-Retman [this message]
2026-03-23 18:16       ` Pawan Gupta
2026-03-23 18:33         ` Maciej Wieczor-Retman
2026-03-26 18:36     ` Maciej Wieczor-Retman
2026-03-26 19:04       ` Pawan Gupta
2026-03-26 19:11         ` Maciej Wieczor-Retman
2026-03-28  1:52           ` H. Peter Anvin
2026-03-28  2:01             ` H. Peter Anvin
2026-03-30  9:47               ` Maciej Wieczor-Retman
2026-03-30 10:09             ` Maciej Wieczor-Retman
2026-03-30 16:01               ` Pawan Gupta
2026-03-30 21:24               ` David Laight
2026-03-31  8:12                 ` Maciej Wieczor-Retman
2026-03-31 13:29             ` Maciej Wieczor-Retman
2026-03-23 16:31   ` Borislav Petkov
2026-03-23 17:05     ` Maciej Wieczor-Retman
2026-03-23 17:55       ` Borislav Petkov
2026-03-23 18:43         ` H. Peter Anvin
2026-03-23 18:43     ` H. Peter Anvin
2026-03-23 19:19       ` Borislav Petkov
2026-03-23 20:24         ` H. Peter Anvin
2026-03-23 20:58           ` Borislav Petkov
2026-03-23 21:40             ` H. Peter Anvin
2026-03-23 21:50               ` Borislav Petkov
2026-03-23 21:56                 ` Borislav Petkov
2026-03-23 22:03                 ` H. Peter Anvin
2026-03-23 22:09                   ` Borislav Petkov
2026-03-24  1:16                     ` H. Peter Anvin
2026-03-20 12:50 ` [PATCH v11 4/4] x86/cpu: Clear feature bits whose dependencies were cleared Maciej Wieczor-Retman
2026-03-23 16:35   ` Borislav Petkov
2026-03-23 17:23     ` Maciej Wieczor-Retman
2026-03-23 17:59       ` Borislav Petkov
2026-03-23 18:18         ` Maciej Wieczor-Retman
2026-03-23 18:57         ` H. Peter Anvin
2026-03-23 19:30           ` Borislav Petkov
2026-03-25  9:33             ` Maciej Wieczor-Retman
2026-03-23 19:33           ` Ahmed S. Darwish

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ab4xlKVJtk4IOcS4@maciej \
    --to=m.wieczorretman@pm.me \
    --cc=ak@linux.intel.com \
    --cc=babu.moger@amd.com \
    --cc=bp@alien8.de \
    --cc=chang.seok.bae@intel.com \
    --cc=darwi@linutronix.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=elena.reshetova@intel.com \
    --cc=hpa@zytor.com \
    --cc=jpoimboe@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maciej.wieczor-retman@intel.com \
    --cc=mingo@redhat.com \
    --cc=pawan.kumar.gupta@linux.intel.com \
    --cc=peterz@infradead.org \
    --cc=sohil.mehta@intel.com \
    --cc=tglx@kernel.org \
    --cc=x86@kernel.org \
    --cc=xin@zytor.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox