[v1,56/58] net/octeontx2: add device stop and close operations

Message ID 20190602152434.23996-57-jerinj@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series OCTEON TX2 Ethdev driver |

Checks

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

Commit Message

Jerin Jacob Kollanukkaran June 2, 2019, 3:24 p.m. UTC
  From: Nithin Dabilpuram <ndabilpuram@marvell.com>

Add device stop, close and reset operations.

Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
 drivers/net/octeontx2/otx2_ethdev.c | 70 +++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)
  

Comments

Ferruh Yigit June 6, 2019, 4:23 p.m. UTC | #1
On 6/2/2019 4:24 PM, jerinj@marvell.com wrote:
> From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> 
> Add device stop, close and reset operations.
> 
> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>

<...>

> @@ -1792,6 +1844,24 @@ otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
>  	return 0;
>  }
>  
> +static void
> +otx2_nix_dev_close(struct rte_eth_dev *eth_dev)
> +{
> +	otx2_eth_dev_uninit(eth_dev, true);
> +}

'close' should free all PMD resources, with 'RTE_ETH_DEV_CLOSE_REMOVE' flag
ethdev API can free the ethdev level allocated memory itself.
  
Nithin Dabilpuram June 7, 2019, 5:11 a.m. UTC | #2
On Thu, Jun 06, 2019 at 05:23:12PM +0100, Ferruh Yigit wrote:
> On 6/2/2019 4:24 PM, jerinj@marvell.com wrote:
> > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > 
> > Add device stop, close and reset operations.
> > 
> > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
> 
> <...>
> 
> > @@ -1792,6 +1844,24 @@ otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
> >  	return 0;
> >  }
> >  
> > +static void
> > +otx2_nix_dev_close(struct rte_eth_dev *eth_dev)
> > +{
> > +	otx2_eth_dev_uninit(eth_dev, true);
> > +}
> 
> 'close' should free all PMD resources, with 'RTE_ETH_DEV_CLOSE_REMOVE' flag
> ethdev API can free the ethdev level allocated memory itself.
> 

Agreed, we are adhering to the spec and handling close with RTE_ETH_DEV_CLOSE_REMOVE flag
behavior where close cannot return error and even rte_eth_dev will itself be freed. 
Do you see any issue ?

> 
>
  

Patch

diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
index bdf291996..6c67cecd5 100644
--- a/drivers/net/octeontx2/otx2_ethdev.c
+++ b/drivers/net/octeontx2/otx2_ethdev.c
@@ -184,6 +184,19 @@  cgx_intlbk_enable(struct otx2_eth_dev *dev, bool en)
 	return otx2_mbox_process(mbox);
 }
 
+static int
+nix_cgx_stop_link_event(struct otx2_eth_dev *dev)
+{
+	struct otx2_mbox *mbox = dev->mbox;
+
+	if (otx2_dev_is_vf(dev))
+		return 0;
+
+	otx2_mbox_alloc_msg_cgx_stop_linkevents(mbox);
+
+	return otx2_mbox_process(mbox);
+}
+
 static inline void
 nix_rx_queue_reset(struct otx2_eth_rxq *rxq)
 {
@@ -1403,6 +1416,37 @@  otx2_nix_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx)
 	return rc;
 }
 
+static void
+otx2_nix_dev_stop(struct rte_eth_dev *eth_dev)
+{
+	struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
+	struct rte_mbuf *rx_pkts[32];
+	struct otx2_eth_rxq *rxq;
+	int count, i, j, rc;
+
+	nix_cgx_stop_link_event(dev);
+	npc_rx_disable(dev);
+
+	/* Stop rx queues and free up pkts pending */
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
+		rc = otx2_nix_rx_queue_stop(eth_dev, i);
+		if (rc)
+			continue;
+
+		rxq = eth_dev->data->rx_queues[i];
+		count = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);
+		while (count) {
+			for (j = 0; j < count; j++)
+				rte_pktmbuf_free(rx_pkts[j]);
+			count = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);
+		}
+	}
+
+	/* Stop tx queues  */
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
+		otx2_nix_tx_queue_stop(eth_dev, i);
+}
+
 static int
 otx2_nix_dev_start(struct rte_eth_dev *eth_dev)
 {
@@ -1455,6 +1499,8 @@  otx2_nix_dev_start(struct rte_eth_dev *eth_dev)
 	return rc;
 }
 
+static int otx2_nix_dev_reset(struct rte_eth_dev *eth_dev);
+static void otx2_nix_dev_close(struct rte_eth_dev *eth_dev);
 
 /* Initialize and register driver with DPDK Application */
 static const struct eth_dev_ops otx2_eth_dev_ops = {
@@ -1466,6 +1512,8 @@  static const struct eth_dev_ops otx2_eth_dev_ops = {
 	.rx_queue_setup           = otx2_nix_rx_queue_setup,
 	.rx_queue_release         = otx2_nix_rx_queue_release,
 	.dev_start                = otx2_nix_dev_start,
+	.dev_stop                 = otx2_nix_dev_stop,
+	.dev_close                = otx2_nix_dev_close,
 	.tx_queue_start           = otx2_nix_tx_queue_start,
 	.tx_queue_stop            = otx2_nix_tx_queue_stop,
 	.rx_queue_start           = otx2_nix_rx_queue_start,
@@ -1473,6 +1521,7 @@  static const struct eth_dev_ops otx2_eth_dev_ops = {
 	.dev_set_link_up          = otx2_nix_dev_set_link_up,
 	.dev_set_link_down        = otx2_nix_dev_set_link_down,
 	.dev_supported_ptypes_get = otx2_nix_supported_ptypes_get,
+	.dev_reset                = otx2_nix_dev_reset,
 	.stats_get                = otx2_nix_dev_stats_get,
 	.stats_reset              = otx2_nix_dev_stats_reset,
 	.get_reg                  = otx2_nix_dev_get_reg,
@@ -1727,6 +1776,7 @@  otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
 	/* Disable nix bpid config */
 	otx2_nix_rxchan_bpid_cfg(eth_dev, false);
 
+	npc_rx_disable(dev);
 	/* Disable vlan offloads */
 	otx2_nix_vlan_fini(eth_dev);
 
@@ -1737,6 +1787,8 @@  otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
 	if (otx2_ethdev_is_ptp_en(dev))
 		otx2_nix_timesync_disable(eth_dev);
 
+	nix_cgx_stop_link_event(dev);
+
 	/* Free up SQs */
 	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
 		otx2_nix_tx_queue_release(eth_dev->data->tx_queues[i]);
@@ -1792,6 +1844,24 @@  otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
 	return 0;
 }
 
+static void
+otx2_nix_dev_close(struct rte_eth_dev *eth_dev)
+{
+	otx2_eth_dev_uninit(eth_dev, true);
+}
+
+static int
+otx2_nix_dev_reset(struct rte_eth_dev *eth_dev)
+{
+	int rc;
+
+	rc = otx2_eth_dev_uninit(eth_dev, false);
+	if (rc)
+		return rc;
+
+	return otx2_eth_dev_init(eth_dev);
+}
+
 static int
 nix_remove(struct rte_pci_device *pci_dev)
 {