Re: [PATCH v4 01/13] bitops: Change parity8() to parity_odd() with u64 input and bool return type

Kuan-Wei Chiu
2025-05-15T09:20:33Z

On Wed, Apr 09, 2025 at 11:39:22AM -0700, Guenter Roeck wrote:
> On 4/9/25 11:25, Kuan-Wei Chiu wrote:
> > On Wed, Apr 09, 2025 at 12:59:14PM -0400, Yury Norov wrote:
> > > On Wed, Apr 09, 2025 at 11:43:44PM +0800, Kuan-Wei Chiu wrote:
> > > > Redesign the parity8() helper as parity_odd(), changing its input type
> > > > from u8 to u64 to support broader use cases and its return type from
> > > > int to bool to clearly reflect the function's binary output. The
> > > > function now returns true for odd parity and false for even parity,
> > > > making its behavior more intuitive based on the name.
> > > >
> > > > Also mark the function with __attribute_const__ to enable better
> > > > compiler optimization, as the result depends solely on its input and
> > > > has no side effects.
> > > >
> > > > While more efficient implementations may exist, further optimization is
> > > > postponed until a use case in performance-critical paths arises.
> > > >
> > > > Co-developed-by: Yu-Chun Lin <eleanor15x@gmail.com>
> > > > Signed-off-by: Yu-Chun Lin <eleanor15x@gmail.com>
> > > > Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
> > > > ---
> > > > arch/x86/kernel/bootflag.c | 4 ++--
> > > > drivers/hwmon/spd5118.c | 2 +-
> > > > drivers/i3c/master/dw-i3c-master.c | 2 +-
> > > > drivers/i3c/master/i3c-master-cdns.c | 2 +-
> > > > drivers/i3c/master/mipi-i3c-hci/dat_v1.c | 2 +-
> > > > include/linux/bitops.h | 19 ++++++++++++-------
> > > > 6 files changed, 18 insertions(+), 13 deletions(-)
> > > >
> > > > diff --git a/arch/x86/kernel/bootflag.c b/arch/x86/kernel/bootflag.c
> > > > index 73274d76ce16..86aae4b2bfd5 100644
> > > > --- a/arch/x86/kernel/bootflag.c
> > > > +++ b/arch/x86/kernel/bootflag.c
> > > > @@ -26,7 +26,7 @@ static void __init sbf_write(u8 v)
> > > > unsigned long flags;
> > > > if (sbf_port != -1) {
> > > > - if (!parity8(v))
> > > > + if (!parity_odd(v))
>
> What is the benefit of this change all over the place instead of
> adding parity_odd() as new API and keeping the old one (just letting
> it call the new API) ?
>
> A simple
>
> static inline int parity8(u8 val)
> {
> return parity_odd(val);
> }
>
> would have done the trick and be much less invasive.
>
Yury has previously mentioned that adding multiple fixed-type parity
functions increases his maintenance burden. IIUC, he prefers having a
single interface in bitops.h rather than multiple ones.

He were reluctant to add three more functions like:

static inline bool parity16(u16 val)
{
return parity8(val ^ (val >> 8));
}

static inline bool parity32(u32 val)
{
return parity16(val ^ (val >> 16));
}

static inline bool parity64(u64 val)
{
return parity32(val ^ (val >> 32));
}

But instead, we ended up with:

static inline bool parity(u64 val)
{
val ^= val >> 32;
val ^= val >> 16;
val ^= val >> 8;
val ^= val >> 4;
return (0x6996 >> (val & 0xf)) & 1;
}

static inline bool parity8(u8 val)
{
return parity_odd(val);
}

But in the end, we introduced both parity(u64) and parity8(u8), which,
IMHO, might be even more confusing than having consistent fixed-type
helpers.

Regards,
Kuan-Wei