代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/dpdk 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 9e0a0e38ecaa7efaca9d349737d0a5ef9ca33a57 Mon Sep 17 00:00:00 2001
From: Zerun Fu <[email protected]>
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")
Signed-off-by: Zerun Fu <[email protected]>
Reviewed-by: Chaoyong He <[email protected]>
Reviewed-by: Long Wu <[email protected]>
Reviewed-by: Peng Zhang <[email protected]>
Acked-by: Anatoly Burakov <[email protected]>
Reviewed-by: Chenbo Xia <[email protected]>
---
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。