From: David Laight <david.laight.linux@gmail.com>
To: Yury Norov <yury.norov@gmail.com>
Cc: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
Geert Uytterhoeven <geert+renesas@glider.be>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Crt Mori <cmo@melexis.com>,
Richard Genoud <richard.genoud@bootlin.com>,
Andy Shevchenko <andriy.shevchenko@intel.com>,
Luo Jie <quic_luoj@quicinc.com>,
Peter Zijlstra <peterz@infradead.org>,
Jakub Kicinski <kuba@kernel.org>,
netdev@vger.kernel.org, "David S . Miller" <davem@davemloft.net>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Andreas Noever <andreas.noever@gmail.com>,
Yehezkel Bernat <YehezkelShB@gmail.com>
Subject: Re: [PATCH v2 03/16] bitmap: Use FIELD_PREP() in expansion of FIELD_PREP_WM16()
Date: Thu, 18 Dec 2025 08:44:46 +0000 [thread overview]
Message-ID: <20251218084446.580f29b9@pumpkin> (raw)
In-Reply-To: <aUNHyjKS9b2KwdGJ@yury>
On Wed, 17 Dec 2025 19:16:10 -0500
Yury Norov <yury.norov@gmail.com> wrote:
> On Wed, Dec 17, 2025 at 02:22:32PM +0100, Nicolas Frattaroli wrote:
> > On Friday, 12 December 2025 20:37:08 Central European Standard Time david.laight.linux@gmail.com wrote:
> > > From: David Laight <david.laight.linux@gmail.com>
> > >
> > > Instead of directly expanding __BF_FIELD_CHECK() (which really ought
> > > not be used outside bitfield) and open-coding the generation of the
> > > masked value, just call FIELD_PREP() and add an extra check for
> > > the mask being at most 16 bits.
> > > The extra check is added after calling FIELD_PREP() to get a sane
> > > error message if 'mask' isn't constant.
> > >
> > > Remove the leading _ from the formal parameter names.
> > > Prefix the local variables with _wm16_ to hopefully make them
> > > unique.
> > >
> > > Signed-off-by: David Laight <david.laight.linux@gmail.com>
> > > ---
> > >
> > > Changes for v2:
> > > - Update kerneldoc to match changed formal parameter names.
> > > - Change local variables to not collide with those in FIELD_PREP().
> > >
> > > Most of the examples are constants and get optimised away.
> > >
> > > include/linux/hw_bitfield.h | 21 ++++++++++-----------
> > > 1 file changed, 10 insertions(+), 11 deletions(-)
> > >
> > > diff --git a/include/linux/hw_bitfield.h b/include/linux/hw_bitfield.h
> > > index df202e167ce4..0bd1040a5f93 100644
> > > --- a/include/linux/hw_bitfield.h
> > > +++ b/include/linux/hw_bitfield.h
> > > @@ -12,8 +12,8 @@
> > >
> > > /**
> > > * FIELD_PREP_WM16() - prepare a bitfield element with a mask in the upper half
> > > - * @_mask: shifted mask defining the field's length and position
> > > - * @_val: value to put in the field
> > > + * @mask: shifted mask defining the field's length and position
> > > + * @val: value to put in the field
> > > *
> > > * FIELD_PREP_WM16() masks and shifts up the value, as well as bitwise ORs the
> > > * result with the mask shifted up by 16.
> > > @@ -23,15 +23,14 @@
> > > * register, a bit in the lower half is only updated if the corresponding bit
> > > * in the upper half is high.
> > > */
> > > -#define FIELD_PREP_WM16(_mask, _val) \
> > > - ({ \
> > > - typeof(_val) __val = _val; \
> > > - typeof(_mask) __mask = _mask; \
> > > - __BF_FIELD_CHECK(__mask, ((u16)0U), __val, \
> > > - "HWORD_UPDATE: "); \
> > > - (((typeof(__mask))(__val) << __bf_shf(__mask)) & (__mask)) | \
> > > - ((__mask) << 16); \
> > > - })
> > > +#define FIELD_PREP_WM16(mask, val) \
> > > +({ \
> > > + __auto_type _wm16_mask = mask; \
> > > + u32 _wm16_val = FIELD_PREP(_wm16_mask, val); \
> > > + BUILD_BUG_ON_MSG(_wm16_mask > 0xffffu, \
> > > + "FIELD_PREP_WM16: mask too large"); \
> > > + _wm16_val | (_wm16_mask << 16); \
> > > +})
> > >
> > > /**
> > > * FIELD_PREP_WM16_CONST() - prepare a constant bitfield element with a mask in
> > >
> >
> > Tested-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
> >
> > Compiled it with my usual config and booted it on a board that uses
> > drivers that make use of these macros, and checked that things are
> > working.
>
> Nicolas, thanks for testing! Would you also want to add an explicit
> ack or review tag?
>
> David, I'm OK with this change. Please add bloat-o-meter and code
> generation examples, and minimize the diff as I asked in v1, before I
> can merge it.
That is pretty much the minimal diff.
By the time you've changed the three lines that do anything 'real'
and realigned the continuation markers all the lines have changed.
I did look at the generated code, but since 'mask' is a constant
the whole thing is just ((val << const_a) | const_b) pretty much
regardless of the actual source - most of which is compile-time checks.
There isn't anything for the bloat-o-meter to find.
David
>
> Thanks,
> Yury
next prev parent reply other threads:[~2025-12-18 8:44 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-12 19:37 [PATCH v2 0/16] bitfield: tidy up bitfield.h david.laight.linux
2025-12-12 19:37 ` [PATCH v2 01/16] nfp: Call FIELD_PREP() in NFP_ETH_SET_BIT_CONFIG() wrapper david.laight.linux
2025-12-12 23:10 ` Jakub Kicinski
2025-12-12 19:37 ` [PATCH v2 02/16] thunderbolt: Don't pass a bitfield to FIELD_GET david.laight.linux
2025-12-13 2:28 ` Yury Norov
2025-12-13 10:01 ` David Laight
2025-12-13 22:14 ` David Laight
2025-12-12 19:37 ` [PATCH v2 03/16] bitmap: Use FIELD_PREP() in expansion of FIELD_PREP_WM16() david.laight.linux
2025-12-17 13:22 ` Nicolas Frattaroli
2025-12-18 0:16 ` Yury Norov
2025-12-18 8:44 ` David Laight [this message]
2025-12-19 13:11 ` Nicolas Frattaroli
2025-12-12 19:37 ` [PATCH v2 04/16] bitfield: Copy #define parameters to locals david.laight.linux
2025-12-12 19:37 ` [PATCH v2 05/16] bitfield: Merge __field_prep/get() into field_prep/get() david.laight.linux
2025-12-12 19:37 ` [PATCH v2 06/16] bitfield: Remove some pointless casts david.laight.linux
2025-12-12 19:37 ` [PATCH v2 07/16] bitfield: FIELD_MODIFY: Only do a single read/write on the target david.laight.linux
2025-12-12 19:37 ` [PATCH v2 08/16] bitfield: Simplify __BF_FIELD_CHECK_REG() david.laight.linux
2025-12-17 10:26 ` Jonathan Cameron
2025-12-17 22:31 ` David Laight
2025-12-18 0:10 ` Yury Norov
2025-12-28 18:53 ` Andy Shevchenko
2025-12-28 22:50 ` David Laight
2025-12-12 19:37 ` [PATCH v2 09/16] bitfield: Rename __FIELD_PREP/GET() to __BF_FIELD_PREP/GET() david.laight.linux
2025-12-12 19:37 ` [PATCH v2 10/16] bitfield: Split the 'val' check out of __BF_FIELD_CHECK_MASK() david.laight.linux
2025-12-12 19:37 ` [PATCH v2 11/16] bitfield: Common up validation of the mask parameter david.laight.linux
2025-12-14 6:19 ` kernel test robot
2025-12-14 13:17 ` David Laight
2025-12-12 19:37 ` [PATCH v2 12/16] bitfield: Remove leading _ from #define formal parameter names david.laight.linux
2025-12-12 19:37 ` [PATCH v2 13/16] bitfield: Reduce indentation david.laight.linux
2025-12-12 19:37 ` [PATCH v2 14/16] bitfield: Add comment block for the host/fixed endian functions david.laight.linux
2025-12-12 19:37 ` [PATCH v2 15/16] bitfield: Update comments for le/be functions david.laight.linux
2025-12-12 19:37 ` [PATCH v2 16/16] build_bug.h; Remove __BUILD_BUG_ON_NOT_POWER_OF_2() david.laight.linux
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=20251218084446.580f29b9@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=YehezkelShB@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andreas.noever@gmail.com \
--cc=andriy.shevchenko@intel.com \
--cc=cmo@melexis.com \
--cc=davem@davemloft.net \
--cc=geert+renesas@glider.be \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=mika.westerberg@linux.intel.com \
--cc=netdev@vger.kernel.org \
--cc=nicolas.frattaroli@collabora.com \
--cc=peterz@infradead.org \
--cc=quic_luoj@quicinc.com \
--cc=richard.genoud@bootlin.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).