ethdev: fix PCI device release in secondary process

In secondary process, rte_eth_dev_close() doesn't clear eth_dev->data.
If calling rte_dev_remove() after rte_eth_dev_close(), in
rte_eth_dev_pci_generic_remove() function, the released eth device still
can be found by its name in shared memory. As a result, the eth device
will be released repeatedly. The state of the eth device is modified to
RTE_ETH_DEV_UNUSED after rte_eth_dev_close(). So this state can be used
to avoid this problem.

Fixes: dcd5c8112bc3 ("ethdev: add PCI driver helpers")
Cc: stable@dpdk.org

Signed-off-by: Huisong Li <lihuisong@huawei.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Huisong Li 2021-10-21 10:24:21 +08:00 committed by Ferruh Yigit
parent 00ea15e7a3
commit 17faaed854

View File

@ -151,6 +151,16 @@ rte_eth_dev_pci_generic_remove(struct rte_pci_device *pci_dev,
if (!eth_dev)
return 0;
/*
* In secondary process, a released eth device can be found by its name
* in shared memory.
* If the state of the eth device is RTE_ETH_DEV_UNUSED, it means the
* eth device has been released.
*/
if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
eth_dev->state == RTE_ETH_DEV_UNUSED)
return 0;
if (dev_uninit) {
ret = dev_uninit(eth_dev);
if (ret)