Hi all,I am from Sangfor Tech.I found a bug when using DPDK in multiprocess scenario.The secondary process enters "rte_eth_dev_pci_copy_info" function when initializing.Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero, but this struct is shared by primary process and secondary process, and the value change is unexpected by primary process. This may cause very serious damage.I think the secondary process should not enter "rte_eth_dev_pci_copy_info" function or changes the value of struct "rte_eth_dev_data.dev_flags" in shared memory. I fixed this bug by adding an if-statement to forbid the secondary process changing the above-mentioned value. Thansk, All. Cc: sta...@dpdk.org
Signed-off-by: Fang TongHao <fangtong...@sangfor.com.cn> --- lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h index ccdbb46ec..916de8a14 100644 --- a/lib/librte_ethdev/rte_ethdev_pci.h +++ b/lib/librte_ethdev/rte_ethdev_pci.h @@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, } eth_dev->intr_handle = &pci_dev->intr_handle; - - eth_dev->data->dev_flags = 0; - if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) - eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; - if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV) - eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV; - - eth_dev->data->kdrv = pci_dev->kdrv; - eth_dev->data->numa_node = pci_dev->device.numa_node; + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + eth_dev->data->dev_flags = 0; + if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) + eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; + if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV) + eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV; + + eth_dev->data->kdrv = pci_dev->kdrv; + eth_dev->data->numa_node = pci_dev->device.numa_node; + } } static inline int -- 2.24.1.windows.2