From: Yury Norov <ynorov@nvidia.com>
To: Petr Tesarik <ptesarik@suse.com>
Cc: Yury Norov <yury.norov@gmail.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Richard Henderson <richard.henderson@linaro.org>,
Matt Turner <mattst88@gmail.com>,
Magnus Lindholm <linmag7@gmail.com>,
Vineet Gupta <vgupta@kernel.org>,
Geert Uytterhoeven <geert@linux-m68k.org>,
"Maciej W. Rozycki" <macro@orcam.me.uk>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Chris Zankel <chris@zankel.net>,
Max Filippov <jcmvbkbc@gmail.com>,
Patrik Jakobsson <patrik.r.jakobsson@gmail.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Robin Murphy <robin.murphy@arm.com>,
Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
Jakub Kicinski <kuba@kernel.org>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
Oliver Neukum <oliver@neukum.org>, Arnd Bergmann <arnd@arndb.de>,
Kuan-Wei Chiu <visitorckw@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Marcel Holtmann <marcel@holtmann.org>,
Johan Hedberg <johan.hedberg@gmail.com>,
Luiz Augusto von Dentz <luiz.dentz@gmail.com>,
Pablo Neira Ayuso <pablo@netfilter.org>,
Florian Westphal <fw@strlen.de>,
linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH 1/2] bits: introduce ffs_val()
Date: Fri, 9 Jan 2026 13:26:30 -0500 [thread overview]
Message-ID: <aWFIVrH41EPgVmbw@yury> (raw)
In-Reply-To: <20260109184614.7b3b9bb3@mordecai>
> > No need for a separate header. Just put int straight in bitops.h.
>
> Well, <linux/bitops.h> is a bit heavy, so I was afraid of spoiling
> build times if I include it from <asm-generic/div64.h>, but if you say
> it's fine, yes, why not, let's put it into bitops.h somewhere before
> #include <asm/bitops.h>.
Unless you have strong performance numbers, let's keep it in the
bitops.h
> > > +/**
> > > + * ffs_val - find the value of the first set bit
> >
> > By definition, the value of 1st set bit is 1, just like any other set
> > bit. :)
>
> I'm struggling with suitable wording. The trouble is that "find first
> set bit" is generally understood as find the bit _position_. Maybe I
> should say _isolate_ the bit, or something like that.
>
> > > + * @x: the value to search
> > > + *
> > > + * Unlike ffs(), which returns a bit position, ffs_val() returns the bit
> > > + * value itself.
> > > + *
> > > + * Returns:
> > > + * least significant non-zero bit, 0 if all bits are zero
> > > + */
> > > +#define ffs_val(x) \
> > > +({ \
> > > + const typeof(x) val__ = (x); \
> >
> > const auto? Also, are you sure it works OK with unsigned types? No
> > warnings? Maybe add a test?
>
> The "const auto" is good idea. Regarding unsigned types, indeed, the
> result of applying unary minus to any non-zero value is out of bounds
> of an unsigned type. However, the C standard has this much to say:
> "C’s unsigned integer types are ‘‘modulo’’ in the LIA−1 sense in that
> overflows or out-of-bounds results silently wrap."
>
> Besides, this patch series does not change anything, it merely puts the
> arithmetic inside a macro.
>
> > > + val__ & -val__; \
> > > +})
> >
> > This macro returns in fact a mask containing LSB only, so I'd suggest
> > to choose a name like lsb_mask().
>
> Mask is a terrible word, because it doesn't say if the masked bit is
> set or clear. Even if I limit myself to the Linux kernel, it's used for
> both in different contexts.
>
> What about isolate_lsb()?
In bitops world, something_mask() has a very clear meaning. Consider
GENMASK(), BITMAP_FIRST_BYTE_MASK(), __BF_FIELD_CHECK_MASK(), and so
on.
lsb_mask(), or LSB_MASK() if you prefer, is just right.
> The only issue is that LSB may also refer to least-significant BYTE. :-(
It will never mean byte because it hosts in bitops.h, not byteops.h
> > This is also a replacement of BIT(ffs()), GENMASK(ffs(), 0) constructions.
> > Can you check the kernel, and convert those patterns too? I found at least
> > one in drivers/clk/nxp/clk-lpc32xx.c:lpc32xx_clk_div_quirk().
>
> Yes, there's a lot of places under drivers/ that can benefit from this
> macro. I didn't want to spam everyone with this RFC, as we iron out the
> details. I'm even unsure about the correct process to get such a change
> into the kernel.
If you don't want to fix every driver, it's OK. But please keep core
kernel clean.
>
> Thanks for the review and suggestions!
>
> Petr T
next prev parent reply other threads:[~2026-01-09 18:26 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-09 16:41 [RFC PATCH 0/2] Helper to isolate least-significant bit Petr Tesarik
2026-01-09 16:37 ` [RFC PATCH 1/2] bits: introduce ffs_val() Petr Tesarik
2026-01-09 17:01 ` Arnd Bergmann
2026-01-09 23:54 ` David Laight
2026-01-09 17:16 ` Yury Norov
2026-01-09 17:46 ` Petr Tesarik
2026-01-09 18:26 ` Yury Norov [this message]
2026-01-09 19:27 ` Petr Tesarik
2026-01-09 19:44 ` Yury Norov
2026-01-09 18:50 ` Arnd Bergmann
2026-01-10 10:50 ` David Laight
2026-01-12 8:15 ` Thomas Zimmermann
2026-01-12 8:58 ` Petr Tesarik
2026-01-12 11:22 ` David Laight
2026-01-13 1:40 ` Maciej W. Rozycki
2026-01-09 16:37 ` [RFC PATCH 2/2] treewide, bits: use ffs_val() where it is open-coded Petr Tesarik
2026-01-09 18:19 ` Yury Norov
2026-01-09 19:32 ` Petr Tesarik
2026-01-09 20:19 ` Yury Norov
2026-01-10 10:36 ` Maciej W. Rozycki
2026-01-10 11:54 ` David Laight
2026-01-11 3:15 ` Maciej W. Rozycki
2026-01-11 10:40 ` David Laight
2026-01-11 21:22 ` Maciej W. Rozycki
2026-01-11 23:57 ` David Laight
2026-01-12 11:21 ` Maciej W. Rozycki
2026-01-12 13:23 ` David Laight
2026-01-10 16:42 ` Kuan-Wei Chiu
2026-01-10 22:23 ` David Laight
2026-01-11 14:41 ` Kuan-Wei Chiu
2026-01-11 21:22 ` Maciej W. Rozycki
2026-01-09 17:20 ` [RFC PATCH 0/2] Helper to isolate least-significant bit Kuan-Wei Chiu
2026-01-09 18:59 ` Petr Tesarik
2026-01-09 19:26 ` Andrew Cooper
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=aWFIVrH41EPgVmbw@yury \
--to=ynorov@nvidia.com \
--cc=agordeev@linux.ibm.com \
--cc=airlied@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=andrew+netdev@lunn.ch \
--cc=arnd@arndb.de \
--cc=chris@zankel.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=fw@strlen.de \
--cc=geert@linux-m68k.org \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=jcmvbkbc@gmail.com \
--cc=johan.hedberg@gmail.com \
--cc=joro@8bytes.org \
--cc=kuba@kernel.org \
--cc=linmag7@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=luiz.dentz@gmail.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=macro@orcam.me.uk \
--cc=maddy@linux.ibm.com \
--cc=marcel@holtmann.org \
--cc=mattst88@gmail.com \
--cc=mpe@ellerman.id.au \
--cc=mripard@kernel.org \
--cc=oliver@neukum.org \
--cc=pabeni@redhat.com \
--cc=pablo@netfilter.org \
--cc=patrik.r.jakobsson@gmail.com \
--cc=ptesarik@suse.com \
--cc=richard.henderson@linaro.org \
--cc=robin.murphy@arm.com \
--cc=simona@ffwll.ch \
--cc=tsbogend@alpha.franken.de \
--cc=tzimmermann@suse.de \
--cc=vgupta@kernel.org \
--cc=visitorckw@gmail.com \
--cc=will@kernel.org \
--cc=yury.norov@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.