From f0e1180cb6a99825587ce4c108c4366023ac1f63 Mon Sep 17 00:00:00 2001 From: Matan Azrad Date: Wed, 28 Mar 2018 12:10:30 +0000 Subject: [PATCH] ethdev: fix port accessing after release rte_eth_dev_pci_release() function wrongly releases an ethdev port and then releases internal fields of this port. This behavior is problematic, because after the release, the port may be reallocated again by another thread or just be invalid for any usage. Move the release operation to the end of the function. Fixes: dcd5c8112bc3 ("ethdev: add PCI driver helpers") Cc: stable@dpdk.org Suggested-by: Ferruh Yigit Signed-off-by: Matan Azrad Acked-by: Thomas Monjalon --- lib/librte_ether/rte_ethdev_pci.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/librte_ether/rte_ethdev_pci.h b/lib/librte_ether/rte_ethdev_pci.h index 897ce5b410..6565ae7d3e 100644 --- a/lib/librte_ether/rte_ethdev_pci.h +++ b/lib/librte_ether/rte_ethdev_pci.h @@ -123,9 +123,6 @@ rte_eth_dev_pci_allocate(struct rte_pci_device *dev, size_t private_data_size) static inline void rte_eth_dev_pci_release(struct rte_eth_dev *eth_dev) { - /* free ether device */ - rte_eth_dev_release_port(eth_dev); - if (rte_eal_process_type() == RTE_PROC_PRIMARY) rte_free(eth_dev->data->dev_private); @@ -139,6 +136,9 @@ rte_eth_dev_pci_release(struct rte_eth_dev *eth_dev) eth_dev->device = NULL; eth_dev->intr_handle = NULL; + + /* free ether device */ + rte_eth_dev_release_port(eth_dev); } typedef int (*eth_dev_pci_callback_t)(struct rte_eth_dev *eth_dev); -- 2.20.1