drivers/net: accept removing device without any port

The ports can be closed (i.e. completely released)
before removing the whole device.
Such case was wrongly considered an error by some drivers.

If the device supports only one port, there is nothing much
to free after the port is closed.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
Reviewed-by: Rosen Xu <rosen.xu@intel.com>
Reviewed-by: Sachin Saxena <sachin.saxena@oss.nxp.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
Thomas Monjalon 2020-09-29 01:14:30 +02:00 committed by Ferruh Yigit
parent fbd1913561
commit 68f578bf9b
5 changed files with 14 additions and 18 deletions

View File

@ -562,10 +562,8 @@ static int ipn3ke_vswitch_remove(struct rte_afu_device *afu_dev)
afu_dev->device.name, i);
ethdev = rte_eth_dev_allocated(afu_dev->device.name);
if (!ethdev)
return -ENODEV;
rte_eth_dev_destroy(ethdev, ipn3ke_rpst_uninit);
if (ethdev != NULL)
rte_eth_dev_destroy(ethdev, ipn3ke_rpst_uninit);
}
ret = rte_eth_switch_domain_free(hw->switch_domain_id);

View File

@ -488,17 +488,15 @@ eth_kni_remove(struct rte_vdev_device *vdev)
/* find the ethdev entry */
eth_dev = rte_eth_dev_allocated(name);
if (eth_dev == NULL)
return -1;
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
eth_kni_dev_stop(eth_dev);
return rte_eth_dev_release_port(eth_dev);
if (eth_dev != NULL) {
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
eth_kni_dev_stop(eth_dev);
return rte_eth_dev_release_port(eth_dev);
}
eth_kni_close(eth_dev);
rte_eth_dev_release_port(eth_dev);
}
eth_kni_close(eth_dev);
rte_eth_dev_release_port(eth_dev);
is_kni_initialized--;
if (is_kni_initialized == 0)
rte_kni_close();

View File

@ -1092,7 +1092,7 @@ static int eth_hn_remove(struct rte_vmbus_device *dev)
eth_dev = rte_eth_dev_allocated(dev->device.name);
if (!eth_dev)
return -ENODEV;
return 0; /* port already released */
ret = eth_hn_dev_uninit(eth_dev);
if (ret)

View File

@ -3739,6 +3739,8 @@ static int eth_nfp_pci_remove(struct rte_pci_device *pci_dev)
int port = 0;
eth_dev = rte_eth_dev_allocated(pci_dev->device.name);
if (eth_dev == NULL)
return 0; /* port already released */
if ((pci_dev->id.device_id == PCI_DEVICE_ID_NFP4000_PF_NIC) ||
(pci_dev->id.device_id == PCI_DEVICE_ID_NFP6000_PF_NIC)) {
port = get_pf_port_number(eth_dev->data->name);

View File

@ -1910,10 +1910,8 @@ static int szedata2_eth_pci_remove(struct rte_pci_device *pci_dev)
pci_dev->device.name, i);
PMD_DRV_LOG(DEBUG, "Removing eth_dev %s", name);
eth_dev = rte_eth_dev_allocated(name);
if (!eth_dev) {
PMD_DRV_LOG(ERR, "eth_dev %s not found", name);
retval = retval ? retval : -ENODEV;
}
if (eth_dev == NULL)
continue; /* port already released */
ret = rte_szedata2_eth_dev_uninit(eth_dev);
if (ret != 0) {