Hello Ferruh, > On Dec 15, 2020, at 8:42 AM, Ferruh Yigit <ferruh.yi...@intel.com> wrote: > > On 12/10/2020 2:22 PM, Andrew Boyer wrote: >> This is now required behavior for a PMD. >> Remove the UNMAINTAINED flag. >> Signed-off-by: Andrew Boyer <abo...@pensando.io> >> --- >> MAINTAINERS | 2 +- >> drivers/net/ionic/ionic_ethdev.c | 41 ++++++++++++++++---------------- >> drivers/net/ionic/ionic_lif.c | 15 ++++++++++++ >> drivers/net/ionic/ionic_lif.h | 1 + >> 4 files changed, 38 insertions(+), 21 deletions(-) >> diff --git a/MAINTAINERS b/MAINTAINERS >> index 7bc0010f2..fc1b09923 100644 >> --- a/MAINTAINERS >> +++ b/MAINTAINERS >> @@ -840,7 +840,7 @@ F: doc/guides/nics/pfe.rst >> F: drivers/net/pfe/ >> F: doc/guides/nics/features/pfe.ini >> -Pensando ionic - UNMAINTAINED >> +Pensando ionic >> M: Andrew Boyer <abo...@pensando.io> >> F: drivers/net/ionic/ >> F: doc/guides/nics/ionic.rst >> diff --git a/drivers/net/ionic/ionic_ethdev.c >> b/drivers/net/ionic/ionic_ethdev.c >> index 5a360ac08..629d7068b 100644 >> --- a/drivers/net/ionic/ionic_ethdev.c >> +++ b/drivers/net/ionic/ionic_ethdev.c >> @@ -958,6 +958,8 @@ ionic_dev_stop(struct rte_eth_dev *eth_dev) >> return err; >> } >> +static void ionic_unconfigure_intr(struct ionic_adapter *adapter); >> + >> /* >> * Reset and stop device. >> */ >> @@ -965,6 +967,8 @@ static int >> ionic_dev_close(struct rte_eth_dev *eth_dev) >> { >> struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); >> + struct ionic_adapter *adapter = lif->adapter; >> + uint32_t i; >> int err; >> IONIC_PRINT_CALL(); >> @@ -977,12 +981,21 @@ ionic_dev_close(struct rte_eth_dev *eth_dev) >> return -1; >> } >> - err = eth_ionic_dev_uninit(eth_dev); >> - if (err) { >> - IONIC_PRINT(ERR, "Cannot destroy LIF: %d", err); >> - return -1; >> + ionic_lif_free_queues(lif); >> + >> + IONIC_PRINT(NOTICE, "Removing device %s", eth_dev->device->name); >> + ionic_unconfigure_intr(adapter); >> + >> + for (i = 0; i < adapter->nlifs; i++) { >> + lif = adapter->lifs[i]; >> + rte_eth_dev_destroy(lif->eth_dev, eth_ionic_dev_uninit); > > Should 'ionic_lif_stop()' & 'ionic_lif_free_queues()' be called per 'lif' > here?
You are correct. A future patch removes multi-lif support - it is unused. So this is a result of how I broke up the changes. See below. >> } >> + ionic_port_reset(adapter); >> + ionic_reset(adapter); >> + >> + rte_free(adapter); >> + > > In ionic, an ethdev is created per 'lif' during probe and when one of the > ethdev closed, all 'lif' destroyed and 'adapter' freed, so all ethdev should > be unusable at this stage. > 1) First better to document this behavior in the commit log, and as overall > can you please prefer more descriptive commit logs. Sure, I will add more detail to commit logs. > 2) What happens to the ethdev statuses, 'lif' destroyed and ethdev are not > usable but ethdev status not updated or freed? > What happens if the application tries to access to ethdev of another 'lif' > after 'ionic_dev_close()'? I see what you’re saying, we get here from eth_dev_ops.dev_close -> ionic_dev_close(), so the first ethdev to get closed brings down the adapter etc. In reality we are going to have one adapter <-> one lif <-> one ethdev, so closing the ethdev will be the end of everything. (Just for this PF/VF; they are independent.) Rather than doing any design work to fix this I will reorder the patches to take out multi-lif support first. -Andrew > >> return 0; >> } >> @@ -1280,10 +1293,7 @@ static int >> eth_ionic_pci_remove(struct rte_pci_device *pci_dev __rte_unused) >> { >> char name[RTE_ETH_NAME_MAX_LEN]; >> - struct ionic_adapter *adapter = NULL; >> struct rte_eth_dev *eth_dev; >> - struct ionic_lif *lif; >> - uint32_t i; >> /* Adapter lookup is using (the first) eth_dev name */ >> snprintf(name, sizeof(name), "net_%s_lif_0", >> @@ -1291,19 +1301,10 @@ eth_ionic_pci_remove(struct rte_pci_device *pci_dev >> __rte_unused) >> > > Should remove '__rte_unused' OK > >> eth_dev = rte_eth_dev_allocated(name); >> if (eth_dev) { >> - lif = IONIC_ETH_DEV_TO_LIF(eth_dev); >> - adapter = lif->adapter; >> - } >> - >> - if (adapter) { >> - ionic_unconfigure_intr(adapter); >> - >> - for (i = 0; i < adapter->nlifs; i++) { >> - lif = adapter->lifs[i]; >> - rte_eth_dev_destroy(lif->eth_dev, eth_ionic_dev_uninit); >> - } >> - >> - rte_free(adapter); >> + ionic_dev_close(eth_dev); >> + } else { >> + IONIC_PRINT(WARNING, "Cannot find device %s", >> + pci_dev->device.name); > > Not sure if this warning is correct, if there is no allocated ethdev this is > not an error, this means there is nothing to remove and function can continue > with 'return 0' OK, I will reduce it to DEBUG level. >> } >> return 0; >> diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c >> index 875c7e585..e213597ee 100644 >> --- a/drivers/net/ionic/ionic_lif.c >> +++ b/drivers/net/ionic/ionic_lif.c >> @@ -927,6 +927,21 @@ ionic_lif_free(struct ionic_lif *lif) >> } >> } >> +void >> +ionic_lif_free_queues(struct ionic_lif *lif) >> +{ >> + uint32_t i; >> + >> + for (i = 0; i < lif->ntxqcqs; i++) { >> + ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]); >> + lif->eth_dev->data->tx_queues[i] = NULL; >> + } >> + for (i = 0; i < lif->nrxqcqs; i++) { >> + ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]); >> + lif->eth_dev->data->rx_queues[i] = NULL; >> + } >> +} >> + >> int >> ionic_lif_rss_config(struct ionic_lif *lif, >> const uint16_t types, const uint8_t *key, const uint32_t *indir) >> diff --git a/drivers/net/ionic/ionic_lif.h b/drivers/net/ionic/ionic_lif.h >> index b80931c61..bf010716e 100644 >> --- a/drivers/net/ionic/ionic_lif.h >> +++ b/drivers/net/ionic/ionic_lif.h >> @@ -122,6 +122,7 @@ int ionic_lifs_size(struct ionic_adapter *ionic); >> int ionic_lif_alloc(struct ionic_lif *lif); >> void ionic_lif_free(struct ionic_lif *lif); >> +void ionic_lif_free_queues(struct ionic_lif *lif); >> int ionic_lif_init(struct ionic_lif *lif); >> void ionic_lif_deinit(struct ionic_lif *lif);