[PATCH v2] PCI: Fix BUILD_BUG_ON usage for old gcc

Alex Williamson posted 1 patch 12 months ago
drivers/pci/probe.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
[PATCH v2] PCI: Fix BUILD_BUG_ON usage for old gcc
Posted by Alex Williamson 12 months ago
As reported in the below link, it seems older versions of gcc cannot
determine that the howmany variable is known for all callers.  Include
a test so that newer compilers can enforce this sanity check and older
compilers can still work.  Add __always_inline attribute to give the
compiler an even better chance to know the inputs.

Fixes: 4453f360862e ("PCI: Batch BAR sizing operations")
Link: https://lore.kernel.org/all/20250209154512.GA18688@redhat.com
Reported-by: Oleg Nesterov <oleg@redhat.com>
Tested-by: Oleg Nesterov <oleg@redhat.com>
Tested-by: Mitchell Augustin <mitchell.augustin@canonical.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---

v2:
 - Switch to statically_true (David Laight)
 - Add __always_inline (David Laight)
 - Included Tested-by reports

 drivers/pci/probe.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index b6536ed599c3..246744d8d268 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -339,13 +339,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
 	return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
 }
 
-static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
+static __always_inline void pci_read_bases(struct pci_dev *dev,
+					   unsigned int howmany, int rom)
 {
 	u32 rombar, stdbars[PCI_STD_NUM_BARS];
 	unsigned int pos, reg;
 	u16 orig_cmd;
 
-	BUILD_BUG_ON(howmany > PCI_STD_NUM_BARS);
+	BUILD_BUG_ON(statically_true(howmany > PCI_STD_NUM_BARS));
 
 	if (dev->non_compliant_bars)
 		return;
-- 
2.48.1
Re: [PATCH v2] PCI: Fix BUILD_BUG_ON usage for old gcc
Posted by Bjorn Helgaas 12 months ago
On Wed, Feb 12, 2025 at 11:53:32AM -0700, Alex Williamson wrote:
> As reported in the below link, it seems older versions of gcc cannot
> determine that the howmany variable is known for all callers.  Include
> a test so that newer compilers can enforce this sanity check and older
> compilers can still work.  Add __always_inline attribute to give the
> compiler an even better chance to know the inputs.
> 
> Fixes: 4453f360862e ("PCI: Batch BAR sizing operations")
> Link: https://lore.kernel.org/all/20250209154512.GA18688@redhat.com
> Reported-by: Oleg Nesterov <oleg@redhat.com>
> Tested-by: Oleg Nesterov <oleg@redhat.com>
> Tested-by: Mitchell Augustin <mitchell.augustin@canonical.com>
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>

Applied to pci/for-linus for v6.14 since this fixes a build issue we
added in v6.14-rc1, thanks, Alex.

> ---
> 
> v2:
>  - Switch to statically_true (David Laight)
>  - Add __always_inline (David Laight)
>  - Included Tested-by reports
> 
>  drivers/pci/probe.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index b6536ed599c3..246744d8d268 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -339,13 +339,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>  	return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
>  }
>  
> -static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
> +static __always_inline void pci_read_bases(struct pci_dev *dev,
> +					   unsigned int howmany, int rom)
>  {
>  	u32 rombar, stdbars[PCI_STD_NUM_BARS];
>  	unsigned int pos, reg;
>  	u16 orig_cmd;
>  
> -	BUILD_BUG_ON(howmany > PCI_STD_NUM_BARS);
> +	BUILD_BUG_ON(statically_true(howmany > PCI_STD_NUM_BARS));
>  
>  	if (dev->non_compliant_bars)
>  		return;
> -- 
> 2.48.1
>