From: David Laight <david.laight.linux@gmail.com>
To: Anders Roxell <anders.roxell@linaro.org>
Cc: bhelgaas@google.com, kees@kernel.org, ojeda@kernel.org,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
arnd@arndb.de, dan.carpenter@linaro.org,
benjamin.copeland@linaro.org,
Linux Kernel Functional Testing <lkft@linaro.org>
Subject: Re: [PATCH] drivers/pci: Fix FIELD_PREP compilation error with gcc-8
Date: Sat, 6 Sep 2025 14:12:27 +0100 [thread overview]
Message-ID: <20250906141227.6ec8a775@pumpkin> (raw)
In-Reply-To: <20250828101237.1359212-1-anders.roxell@linaro.org>
On Thu, 28 Aug 2025 12:12:37 +0200
Anders Roxell <anders.roxell@linaro.org> wrote:
> Commit cbc654d18d37 ("bitops: Add __attribute_const__ to generic
> ffs()-family implementations") causes a compilation failure on ARM
> footbridge_defconfig with gcc-8:
>
> FIELD_PREP: value too large for the field
>
> The error occurs in pcie_set_readrq() at:
> v = FIELD_PREP(PCI_EXP_DEVCTL_READRQ, ffs(rq) - 8);
>
> With __attribute_const__, gcc-8 now performs wrong compile-time
> validation in FIELD_PREP and cannot guarantee that ffs(rq) - 8 will
> always produce values that fit in the 3-bit PCI_EXP_DEVCTL_READRQ field.
Which is actually quite correct - in principle pcie_get_mps() could
return a small value.
What is probably happening is that two copies of the FIELD_PREP()
are being generated for ffs(rq) and ffs(mps).
The latter might be (mps ? asm_fun(mps) + 1 : 0) leading to an extra
copy for ffs(0) - which will cause the warning in FIELD_PREP.
An alternate fix you be to move the validation of rq below the
'performance' clamp.
David
>
> Avoid FIELD_PREP entirely by using direct bit manipulation. Replace
> FIELD_PREP(PCI_EXP_DEVCTL_READRQ, ffs(rq) - 8) with the equivalent
> manual bit operations: ((ffs(rq) - 8) << 12) & PCI_EXP_DEVCTL_READRQ.
>
> This bypasses the compile-time validation while maintaining identical
> runtime behavior and functionality.
>
> Fixes: cbc654d18d37 ("bitops: Add __attribute_const__ to generic ffs()-family implementations")
> Reported-by: Linux Kernel Functional Testing <lkft@linaro.org>
> Closes: https://lore.kernel.org/linux-pci/CA+G9fYuysVr6qT8bjF6f08WLyCJRG7aXAeSd2F7=zTaHHd7L+Q@mail.gmail.com/T/#u
> Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
> ---
> drivers/pci/pci.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index e698278229f2..9f9607bd9f51 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -5893,7 +5893,8 @@ int pcie_set_readrq(struct pci_dev *dev, int rq)
> rq = mps;
> }
>
> - v = FIELD_PREP(PCI_EXP_DEVCTL_READRQ, ffs(rq) - 8);
> + /* Ideally we would used FIELD_PREP() but this is a work around for gcc-8 */
> + v = ((ffs(rq) - 8) << 12) & PCI_EXP_DEVCTL_READRQ;
>
> if (bridge->no_inc_mrrs) {
> int max_mrrs = pcie_get_readrq(dev);
prev parent reply other threads:[~2025-09-06 13:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 10:12 [PATCH] drivers/pci: Fix FIELD_PREP compilation error with gcc-8 Anders Roxell
2025-09-04 4:29 ` Kees Cook
2025-09-05 5:31 ` Kees Cook
2025-09-06 13:12 ` David Laight [this message]
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=20250906141227.6ec8a775@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=anders.roxell@linaro.org \
--cc=arnd@arndb.de \
--cc=benjamin.copeland@linaro.org \
--cc=bhelgaas@google.com \
--cc=dan.carpenter@linaro.org \
--cc=kees@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lkft@linaro.org \
--cc=ojeda@kernel.org \
/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.