Hi, > -----Original Message----- > From: Thomas Monjalon <tho...@monjalon.net> > Sent: Monday, September 14, 2020 6:07 > To: dev@dpdk.org > Cc: Yigit, Ferruh <ferruh.yi...@intel.com>; arybche...@solarflare.com; Xu, > Rosen <rosen...@intel.com>; Stephen Hemminger > <sthem...@microsoft.com>; K. Y. Srinivasan <k...@microsoft.com>; > Haiyang Zhang <haiya...@microsoft.com>; Long Li <lon...@microsoft.com>; > Heinrich Kuhn <heinrich.k...@netronome.com>; Gagandeep Singh > <g.si...@nxp.com>; Akhil Goyal <akhil.go...@nxp.com>; Martin Spinler > <spin...@cesnet.cz>; Burakov, Anatoly <anatoly.bura...@intel.com> > Subject: [PATCH 17/20] 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 <tho...@monjalon.net> > --- > drivers/net/ipn3ke/ipn3ke_ethdev.c | 6 ++---- > drivers/net/kni/rte_eth_kni.c | 16 +++++++--------- > drivers/net/netvsc/hn_ethdev.c | 2 +- > drivers/net/nfp/nfp_net.c | 2 ++ > drivers/net/pfe/pfe_ethdev.c | 6 ++---- > drivers/net/szedata2/rte_eth_szedata2.c | 6 ++---- > 6 files changed, 16 insertions(+), 22 deletions(-) > > diff --git a/drivers/net/ipn3ke/ipn3ke_ethdev.c > b/drivers/net/ipn3ke/ipn3ke_ethdev.c > index 027be29bd8..4446d2af9e 100644 > --- a/drivers/net/ipn3ke/ipn3ke_ethdev.c > +++ b/drivers/net/ipn3ke/ipn3ke_ethdev.c > @@ -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); > diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c > index 45ab1b17a8..2a4058f7b0 100644 > --- a/drivers/net/kni/rte_eth_kni.c > +++ b/drivers/net/kni/rte_eth_kni.c > @@ -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(); > diff --git a/drivers/net/netvsc/hn_ethdev.c > b/drivers/net/netvsc/hn_ethdev.c index c4a2dd9f4a..4c37dc520c 100644 > --- a/drivers/net/netvsc/hn_ethdev.c > +++ b/drivers/net/netvsc/hn_ethdev.c > @@ -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) > diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index > c20d71cdc3..2f108099a3 100644 > --- a/drivers/net/nfp/nfp_net.c > +++ b/drivers/net/nfp/nfp_net.c > @@ -3721,6 +3721,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); > diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c > index 8867b61a9d..7a36303785 100644 > --- a/drivers/net/pfe/pfe_ethdev.c > +++ b/drivers/net/pfe/pfe_ethdev.c > @@ -1158,10 +1158,8 @@ pmd_pfe_remove(struct rte_vdev_device *vdev) > return 0; > > eth_dev = rte_eth_dev_allocated(name); > - if (eth_dev == NULL) > - return -ENODEV; > - > - pfe_eth_exit(eth_dev, g_pfe); > + if (eth_dev != NULL) > + pfe_eth_exit(eth_dev, g_pfe); > munmap(g_pfe->cbus_baseaddr, g_pfe->cbus_size); > > if (g_pfe->nb_devs == 0) { > diff --git a/drivers/net/szedata2/rte_eth_szedata2.c > b/drivers/net/szedata2/rte_eth_szedata2.c > index 4325b9a30d..5f589dfa4c 100644 > --- a/drivers/net/szedata2/rte_eth_szedata2.c > +++ b/drivers/net/szedata2/rte_eth_szedata2.c > @@ -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) { > -- > 2.28.0
For net/ipn3ke Reviewed-by: Rosen Xu <rosen...@intel.com>