git: 2032abb31cbe - stable/15 - LinuxKPI: pci: undo the pci_resource_len() check in lkpi_pci_request_region()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 08 Dec 2025 15:44:14 UTC
The branch stable/15 has been updated by bz:
URL: https://cgit.FreeBSD.org/src/commit/?id=2032abb31cbe067d41067a81e529d91f1bace4c9
commit 2032abb31cbe067d41067a81e529d91f1bace4c9
Author: Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2025-12-02 16:04:22 +0000
Commit: Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2025-12-08 15:43:51 +0000
LinuxKPI: pci: undo the pci_resource_len() check in lkpi_pci_request_region()
Creating non-passthru SR-IOV interfaces on a mlx5en(4) failed.
The problem lies in the pci_resource_len() call but not that the BAR length
is tmeporary 0 but in that we call lkpi_pci_get_bar() with a true argument
which will create the BAR resource for us and report the approriate length
back. However, the later call to bus_alloc_resource_any() will then fail
given the resource already exists.
Restore the previous behaviour and let bus_alloc_resource_any() do the
work. Adjust the return values from -ENODEV to -EBUSY to match callers
expectations.
In linuxkpi_pcim_request_all_regions(), like in linuxkpi_pci_request_regions(),
filter out the -EBUSY errors as "not an error" and try the next bar.
This also seems to be consistent with the expectations of the callers.
PR: 290793
Reported by: David BOYER (jcduss13 gmail.com)
Tested on: mlx5en, iwlwifi, mt7921
Reviewed by: kib
Fixes: 7e21158d44cd "implement [linuxkpi_]pcim_request_all_regions()"
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D53902
(cherry picked from commit ed29ffd396e522a45ab1980c12a75b3409b51712)
---
sys/compat/linuxkpi/common/src/linux_pci.c | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index 8507a59a8df3..fb3f648df496 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -1223,13 +1223,6 @@ lkpi_pci_request_region(struct pci_dev *pdev, int bar, const char *res_name,
if (!lkpi_pci_bar_id_valid(bar))
return (-EINVAL);
- /*
- * If the bar is not valid, return success without adding the BAR;
- * otherwise linuxkpi_pcim_request_all_regions() will error.
- */
- if (pci_resource_len(pdev, bar) == 0)
- return (0);
- /* Likewise if it is neither IO nor MEM, nothing to do for us. */
type = pci_resource_type(pdev, bar);
if (type < 0)
return (0);
@@ -1241,7 +1234,7 @@ lkpi_pci_request_region(struct pci_dev *pdev, int bar, const char *res_name,
device_printf(pdev->dev.bsddev, "%s: failed to alloc "
"bar %d type %d rid %d\n",
__func__, bar, type, PCIR_BAR(bar));
- return (-ENODEV);
+ return (-EBUSY);
}
/*
@@ -1285,7 +1278,7 @@ linuxkpi_pci_request_regions(struct pci_dev *pdev, const char *res_name)
for (i = 0; i <= PCIR_MAX_BAR_0; i++) {
error = pci_request_region(pdev, i, res_name);
- if (error && error != -ENODEV) {
+ if (error && error != -EBUSY) {
pci_release_regions(pdev);
return (error);
}
@@ -1300,7 +1293,7 @@ linuxkpi_pcim_request_all_regions(struct pci_dev *pdev, const char *res_name)
for (bar = 0; bar <= PCIR_MAX_BAR_0; bar++) {
error = lkpi_pci_request_region(pdev, bar, res_name, true);
- if (error != 0) {
+ if (error != 0 && error != -EBUSY) {
device_printf(pdev->dev.bsddev, "%s: bar %d res_name '%s': "
"lkpi_pci_request_region returned %d\n", __func__,
bar, res_name, error);