[dpdk-dev] ethdev: fix port accessing after release

Message ID 1522239030-24489-1-git-send-email-matan@mellanox.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Matan Azrad March 28, 2018, 12:10 p.m. UTC
  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 <ferruh.yigit@intel.com>
Signed-off-by: Matan Azrad <matan@mellanox.com>
---
 lib/librte_ether/rte_ethdev_pci.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Thomas Monjalon March 28, 2018, 12:25 p.m. UTC | #1
28/03/2018 14:10, Matan Azrad:
> 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 <ferruh.yigit@intel.com>
> Signed-off-by: Matan Azrad <matan@mellanox.com>

Acked-by: Thomas Monjalon <thomas@monjalon.net>
  
Ferruh Yigit March 30, 2018, 10:40 a.m. UTC | #2
On 3/28/2018 1:25 PM, Thomas Monjalon wrote:
> 28/03/2018 14:10, Matan Azrad:
>> 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 <ferruh.yigit@intel.com>
>> Signed-off-by: Matan Azrad <matan@mellanox.com>
> 
> Acked-by: Thomas Monjalon <thomas@monjalon.net>

Applied to dpdk-next-net/master, thanks.
  

Patch

diff --git a/lib/librte_ether/rte_ethdev_pci.h b/lib/librte_ether/rte_ethdev_pci.h
index 897ce5b..6565ae7 100644
--- a/lib/librte_ether/rte_ethdev_pci.h
+++ b/lib/librte_ether/rte_ethdev_pci.h
@@ -123,9 +123,6 @@ 
 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 @@ 
 
 	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);