On 2026-03-26 12:11, Maciej Wieczor-Retman wrote: > On 2026-03-26 at 12:04:30 -0700, Pawan Gupta wrote: >> On Thu, Mar 26, 2026 at 06:36:15PM +0000, Maciej Wieczor-Retman wrote: >>>> 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; >>> >>> Isn't this [NCAPINTS + 1] still a problem because for_each_set_bit() works in 64 >>> bit chunks? If NCAPINTS becomes an odd number in the future, the >>> required_features[] last 32 bits will be uninitialized - REQUIRED_MASK_INIT is >>> of (NCAPINTS * sizeof(u32)) size. So they might have some bits set and trigger >>> the pr_warn() below. >> >> Isn't a partially initialized array always zeroed out for the uninitialized >> part? > > Ah okay, my bad. Right, it should be okay then. Thanks! > That being said, I would personally like to see an explicit assignment from REQUIRED_MASK_INIT into an automatic variable replaced with a memcpy() from a (possibly static) const array. It might be useful elsewhere, and it would avoid compilers sometimes creating really ugly code. One thing that matters here is that these bitmaps are *already* accessed using bitop operations. Therefore, if this is a problem *here*, then it is a problem *everywhere*. The simplest way to deal with it is probably to require NCAPINTS and NBUGINTS to be even, even (pun intended) if that means a temporarily unused word at the end of the array. That doesn't even require any code changes, just a statement at the top of cpufeatures.h (see attached patch for an untested example.) A more bespoke variant would be to script-generate NCAPINTS and NBUGINTS, but that might have other problems. -hpa