Signed-off-by: Dengdui Huang <huangdengdui@huawei.com> (cherry picked from commit 995630c7cd13b2dd46372cc3ebe094c662723660)
76 lines
2.5 KiB
Diff
76 lines
2.5 KiB
Diff
From 9e0a0e38ecaa7efaca9d349737d0a5ef9ca33a57 Mon Sep 17 00:00:00 2001
|
|
From: Zerun Fu <zerun.fu@corigine.com>
|
|
Date: Tue, 2 Jul 2024 15:40:06 +0800
|
|
Subject: [PATCH] bus/pci: fix UIO resource mapping in secondary process
|
|
|
|
[ upstream commit 9e0a0e38ecaa7efaca9d349737d0a5ef9ca33a57 ]
|
|
|
|
For the primary process, the logic loops all BARs and will skip
|
|
the map of BAR with an invalid physical address (0), also will
|
|
assign 'uio_res->nb_maps' with the real mapped BARs number. But
|
|
for the secondary process, instead of loops all BARs, the logic
|
|
using the 'uio_res->nb_map' as index. If the device uses continuous
|
|
BARs there will be no problem, whereas if it uses discrete BARs,
|
|
it will lead to mapping errors.
|
|
|
|
Fix this problem by also loops all BARs and skip the map of BAR
|
|
with an invalid physical address in secondary process.
|
|
|
|
Fixes: 9b957f378abf ("pci: merge uio functions for linux and bsd")
|
|
Cc: stable@dpdk.org
|
|
|
|
Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
|
|
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
|
|
Reviewed-by: Long Wu <long.wu@corigine.com>
|
|
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
|
|
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
|
|
Reviewed-by: Chenbo Xia <chenbox@nvidia.com>
|
|
---
|
|
drivers/bus/pci/pci_common_uio.c | 16 +++++++++++++---
|
|
1 file changed, 13 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/bus/pci/pci_common_uio.c b/drivers/bus/pci/pci_common_uio.c
|
|
index ff1b02b6bd..65f72b7cc6 100644
|
|
--- a/drivers/bus/pci/pci_common_uio.c
|
|
+++ b/drivers/bus/pci/pci_common_uio.c
|
|
@@ -26,7 +26,7 @@ EAL_REGISTER_TAILQ(rte_uio_tailq)
|
|
static int
|
|
pci_uio_map_secondary(struct rte_pci_device *dev)
|
|
{
|
|
- int fd, i, j;
|
|
+ int fd, i = 0, j, res_idx;
|
|
struct mapped_pci_resource *uio_res;
|
|
struct mapped_pci_res_list *uio_res_list =
|
|
RTE_TAILQ_CAST(rte_uio_tailq.head, mapped_pci_res_list);
|
|
@@ -37,7 +37,15 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
|
|
if (rte_pci_addr_cmp(&uio_res->pci_addr, &dev->addr))
|
|
continue;
|
|
|
|
- for (i = 0; i != uio_res->nb_maps; i++) {
|
|
+ /* Map all BARs */
|
|
+ for (res_idx = 0; res_idx != PCI_MAX_RESOURCE; res_idx++) {
|
|
+ /* skip empty BAR */
|
|
+ if (dev->mem_resource[res_idx].phys_addr == 0)
|
|
+ continue;
|
|
+
|
|
+ if (i >= uio_res->nb_maps)
|
|
+ return -1;
|
|
+
|
|
/*
|
|
* open devname, to mmap it
|
|
*/
|
|
@@ -70,7 +78,9 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
|
|
}
|
|
return -1;
|
|
}
|
|
- dev->mem_resource[i].addr = mapaddr;
|
|
+ dev->mem_resource[res_idx].addr = mapaddr;
|
|
+
|
|
+ i++;
|
|
}
|
|
return 0;
|
|
}
|
|
--
|
|
2.21.0
|
|
|