On Fri, May 15, 2026 at 08:38:36AM +0200, Aleksandr Loktionov wrote: > struct iavf_adapter::crit_section is a bit-lock container indexed > by values from enum iavf_critical_section_t (__IAVF_IN_REMOVE_TASK). > It is manipulated exclusively through the kernel atomic bitops API: > set_bit(), clear_bit(), test_bit(), test_and_set_bit(). > > It is declared as a bare 'unsigned long' and every call site passes > '&adapter->crit_section'. That is functionally correct -- the bit > index is a compile-time enum value well below BITS_PER_LONG so > BIT_WORD(nr) is always 0 and only the singleton word is ever > touched -- but it relies on layout coincidence rather than on the > documented contract of the bitops API, which is defined in terms of > 'unsigned long *' arrays. > > Static analyzers that model the same contract flag every such call > site with ARRAY_VS_SINGLETON because the address of a scalar is > passed where an array pointer is expected. > > Convert the field to a proper bitmap using DECLARE_BITMAP() sized by > a new sentinel __IAVF_CRIT_SECTION_NBITS at the end of the enum. The > underlying storage is unchanged (a single unsigned long word on every > architecture Linux supports), so there is no functional or ABI change; > the type simply becomes 'unsigned long[1]' which matches what the > bitops API expects and silences the analyzer warnings permanently. > > Drop the leading '&' at every call site, since arrays decay to > pointers. > > No functional change intended. > > Suggested-by: Arkadiusz Kubalewski <[email protected]> > Signed-off-by: Aleksandr Loktionov <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
