[dpdk-dev,v8,1/5] ethdev: add support of NIC reset

Message ID 1500304503-41592-2-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

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

Commit Message

Wei Dai July 17, 2017, 3:14 p.m. UTC
  This patch adds a new eth_dev layer API function rte_eth_dev_reset().
A DPDK application can call this function to reset a NIC and keep
its port id afterwards.
It means that all SW resources allocated in ethdev layer should be
kept and SW and HW resources of the NIC in PMD need to be reset in
similar way that it runs PCI dev_uninit() and then dev_init().
The sequence of dev_uninit() and dev_init() can be packed into a
single interface API rte_eth_dev_reset().
Please See the comments before the declaration of rte_eht_dev_reset()
in lib/librte_ether/rte_ethdev.h to get more details on why this
function is needed, what it does, when it should be called
and what an application should do after calling this function.

Signed-off-by: Wei Dai <wei.dai@intel.com>
---
 lib/librte_ether/rte_ethdev.c          | 17 +++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 33 +++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ether_version.map |  1 +
 3 files changed, 51 insertions(+)
  

Comments

Remy Horton July 20, 2017, 1:21 p.m. UTC | #1
See suggested wording inline

On 17/07/2017 16:14, Wei Dai wrote:
> This patch adds a new eth_dev layer API function rte_eth_dev_reset().
> A DPDK application can call this function to reset a NIC and keep
> its port id afterwards.
> It means that all SW resources allocated in ethdev layer should be
> kept and SW and HW resources of the NIC in PMD need to be reset in
> similar way that it runs PCI dev_uninit() and then dev_init().
> The sequence of dev_uninit() and dev_init() can be packed into a
> single interface API rte_eth_dev_reset().
> Please See the comments before the declaration of rte_eht_dev_reset()
> in lib/librte_ether/rte_ethdev.h to get more details on why this
> function is needed, what it does, when it should be called
> and what an application should do after calling this function.

This patch adds a new eth_dev layer API function rte_eth_dev_reset(),
which a DPDK application can call to reset a NIC and keep its port id
afterwards. It means that all software resources allocated in the ethdev 
layer are kept, and software & hardware resources of the NIC within the 
NIC's PMD are reset to a state simular to that obtained by calling the 
PCI dev_uninit() and then dev_init(). This effective sequence of 
dev_uninit() and dev_init() is packed into a single API function 
rte_eth_dev_reset().

Please see the comments before the declaration of rte_eht_dev_reset()
in lib/librte_ether/rte_ethdev.h to get more details on why this
function is needed, what it does, when it should be called
and what an application should do after calling this function.


> Signed-off-by: Wei Dai <wei.dai@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.c          | 17 +++++++++++++++++
>  lib/librte_ether/rte_ethdev.h          | 33 +++++++++++++++++++++++++++++++++
>  lib/librte_ether/rte_ether_version.map |  1 +
>  3 files changed, 51 insertions(+)

Reviewed-by: Remy Horton <remy.horton@intel.com>



>  /**
> + * Reset a Ethernet device and keep its port id.
> + *
> + * When a port has to be reset passively, the DPDK application can invoke this
> + * function. For example a PF is reset, all its VFs should also be reset.
> + * Normally, a DPDK application can invoke this function when
> + * RTE_ETH_EVENT_INTR_RESET event is detected. A DPDK application can also call
> + * this function to start an initiative port reset.

When a port has to be reset passively, the DPDK application can invoke 
this function. For example when a PF is reset, all its VFs should also 
be reset. Normally a DPDK application can invoke this function when 
RTE_ETH_EVENT_INTR_RESET event is detected, but can also use it to start 
a port reset in other circumstances.

> + * When this function is called, it first stops the port and then call PMD
> + * specific dev_uninit( ) and  dev_init( ) to makes the port return to initial
> + * status in which no any Tx queue and no Rx queue are setup and the port has
> + * just be reset and not started. And the port keeps its port id after calling
> + * this function.

When this function is called, it first stops the port and then calls the 
PMD specific dev_uninit( ) and dev_init( ) to return the port to initial 
state, in which no Tx and Rx queues are setup, as if the port has been 
reset and not started. The port keeps the port id it had before the 
function call.

> + * After calling rte_eth_dev_reset( ), the application should go through
> + * rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
> + * rte_eth_tx_queue_setup( ) and rte_eth_dev_start( ) again to restore
> + * its previous settings or to reconfigure itself with different settings.

After calling rte_eth_dev_reset( ), the application should use
rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
rte_eth_tx_queue_setup( ), and rte_eth_dev_start( )
to reconfigure the device as appropriate.


> + * Note: to avoid unexpected behaviour, the application should stop calling Rx
> + *       and Rx function before calling rte_eth_dev_reset( ).For thread safety,
> + *       all these controlling operations had better be made in same thread.

Note: To avoid unexpected behavior, the application should stop calling 
Tx and Rx functions before calling rte_eth_dev_reset( ). For thread 
safety, all these controlling functions should be called from the same 
thread.
  
Wei Dai July 23, 2017, 1:45 p.m. UTC | #2
Many thanks, Remy.
My v9 patch set has followed your guidance.

> -----Original Message-----
> From: Horton, Remy
> Sent: Thursday, July 20, 2017 9:22 PM
> To: Dai, Wei <wei.dai@intel.com>; dev@dpdk.org
> Cc: thomas@monjalon.net; Lu, Wenzhuo <wenzhuo.lu@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>; Xing, Beilei
> <beilei.xing@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Mcnamara,
> John <john.mcnamara@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v8 1/5] ethdev: add support of NIC reset
> 
> See suggested wording inline
> 
> On 17/07/2017 16:14, Wei Dai wrote:
> > This patch adds a new eth_dev layer API function rte_eth_dev_reset().
> > A DPDK application can call this function to reset a NIC and keep
> > its port id afterwards.
> > It means that all SW resources allocated in ethdev layer should be
> > kept and SW and HW resources of the NIC in PMD need to be reset in
> > similar way that it runs PCI dev_uninit() and then dev_init().
> > The sequence of dev_uninit() and dev_init() can be packed into a
> > single interface API rte_eth_dev_reset().
> > Please See the comments before the declaration of rte_eht_dev_reset()
> > in lib/librte_ether/rte_ethdev.h to get more details on why this
> > function is needed, what it does, when it should be called
> > and what an application should do after calling this function.
> 
> This patch adds a new eth_dev layer API function rte_eth_dev_reset(),
> which a DPDK application can call to reset a NIC and keep its port id
> afterwards. It means that all software resources allocated in the ethdev
> layer are kept, and software & hardware resources of the NIC within the
> NIC's PMD are reset to a state simular to that obtained by calling the
> PCI dev_uninit() and then dev_init(). This effective sequence of
> dev_uninit() and dev_init() is packed into a single API function
> rte_eth_dev_reset().
> 
> Please see the comments before the declaration of rte_eht_dev_reset()
> in lib/librte_ether/rte_ethdev.h to get more details on why this
> function is needed, what it does, when it should be called
> and what an application should do after calling this function.
> 
> 
> > Signed-off-by: Wei Dai <wei.dai@intel.com>
> > ---
> >  lib/librte_ether/rte_ethdev.c          | 17 +++++++++++++++++
> >  lib/librte_ether/rte_ethdev.h          | 33
> +++++++++++++++++++++++++++++++++
> >  lib/librte_ether/rte_ether_version.map |  1 +
> >  3 files changed, 51 insertions(+)
> 
> Reviewed-by: Remy Horton <remy.horton@intel.com>
> 
> 
> 
> >  /**
> > + * Reset a Ethernet device and keep its port id.
> > + *
> > + * When a port has to be reset passively, the DPDK application can invoke
> this
> > + * function. For example a PF is reset, all its VFs should also be reset.
> > + * Normally, a DPDK application can invoke this function when
> > + * RTE_ETH_EVENT_INTR_RESET event is detected. A DPDK application
> can also call
> > + * this function to start an initiative port reset.
> 
> When a port has to be reset passively, the DPDK application can invoke
> this function. For example when a PF is reset, all its VFs should also
> be reset. Normally a DPDK application can invoke this function when
> RTE_ETH_EVENT_INTR_RESET event is detected, but can also use it to start
> a port reset in other circumstances.
> 
> > + * When this function is called, it first stops the port and then call PMD
> > + * specific dev_uninit( ) and  dev_init( ) to makes the port return to initial
> > + * status in which no any Tx queue and no Rx queue are setup and the port
> has
> > + * just be reset and not started. And the port keeps its port id after calling
> > + * this function.
> 
> When this function is called, it first stops the port and then calls the
> PMD specific dev_uninit( ) and dev_init( ) to return the port to initial
> state, in which no Tx and Rx queues are setup, as if the port has been
> reset and not started. The port keeps the port id it had before the
> function call.
> 
> > + * After calling rte_eth_dev_reset( ), the application should go through
> > + * rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
> > + * rte_eth_tx_queue_setup( ) and rte_eth_dev_start( ) again to restore
> > + * its previous settings or to reconfigure itself with different settings.
> 
> After calling rte_eth_dev_reset( ), the application should use
> rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
> rte_eth_tx_queue_setup( ), and rte_eth_dev_start( )
> to reconfigure the device as appropriate.
> 
> 
> > + * Note: to avoid unexpected behaviour, the application should stop
> calling Rx
> > + *       and Rx function before calling rte_eth_dev_reset( ).For thread
> safety,
> > + *       all these controlling operations had better be made in same
> thread.
> 
> Note: To avoid unexpected behavior, the application should stop calling
> Tx and Rx functions before calling rte_eth_dev_reset( ). For thread
> safety, all these controlling functions should be called from the same
> thread.
>
  

Patch

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index a1b7447..2448bde 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1001,6 +1001,23 @@  rte_eth_dev_close(uint8_t port_id)
 }
 
 int
+rte_eth_dev_reset(uint8_t port_id)
+{
+	struct rte_eth_dev *dev;
+	int ret;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
+	dev = &rte_eth_devices[port_id];
+
+	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_reset, -ENOTSUP);
+
+	rte_eth_dev_stop(port_id);
+	ret = dev->dev_ops->dev_reset(dev);
+
+	return ret;
+}
+
+int
 rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
 		       const struct rte_eth_rxconf *rx_conf,
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 224f485..bd74d15 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1111,6 +1111,9 @@  typedef int  (*eth_dev_set_link_down_t)(struct rte_eth_dev *dev);
 typedef void (*eth_dev_close_t)(struct rte_eth_dev *dev);
 /**< @internal Function used to close a configured Ethernet device. */
 
+typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev);
+/** <@internal Function used to reset a configured Ethernet device. */
+
 typedef void (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
 /**< @internal Function used to enable the RX promiscuous mode of an Ethernet device. */
 
@@ -1431,6 +1434,7 @@  struct eth_dev_ops {
 	eth_dev_set_link_up_t      dev_set_link_up;   /**< Device link up. */
 	eth_dev_set_link_down_t    dev_set_link_down; /**< Device link down. */
 	eth_dev_close_t            dev_close;     /**< Close device. */
+	eth_dev_reset_t		   dev_reset;	  /**< Reset device. */
 	eth_link_update_t          link_update;   /**< Get device link state. */
 
 	eth_promiscuous_enable_t   promiscuous_enable; /**< Promiscuous ON. */
@@ -2136,6 +2140,35 @@  int rte_eth_dev_set_link_down(uint8_t port_id);
 void rte_eth_dev_close(uint8_t port_id);
 
 /**
+ * Reset a Ethernet device and keep its port id.
+ *
+ * When a port has to be reset passively, the DPDK application can invoke this
+ * function. For example a PF is reset, all its VFs should also be reset.
+ * Normally, a DPDK application can invoke this function when
+ * RTE_ETH_EVENT_INTR_RESET event is detected. A DPDK application can also call
+ * this function to start an initiative port reset.
+ *
+ * When this function is called, it first stops the port and then call PMD
+ * specific dev_uninit( ) and  dev_init( ) to makes the port return to initial
+ * status in which no any Tx queue and no Rx queue are setup and the port has
+ * just be reset and not started. And the port keeps its port id after calling
+ * this function.
+ *
+ * After calling rte_eth_dev_reset( ), the application should go through
+ * rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
+ * rte_eth_tx_queue_setup( ) and rte_eth_dev_start( ) again to restore
+ * its previous settings or to reconfigure itself with different settings.
+ *
+ * Note: to avoid unexpected behaviour, the application should stop calling Rx
+ *       and Rx function before calling rte_eth_dev_reset( ).For thread safety,
+ *       all these controlling operations had better be made in same thread.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+int rte_eth_dev_reset(uint8_t port_id);
+
+/**
  * Enable receipt in promiscuous mode for an Ethernet device.
  *
  * @param port_id
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index 4283728..e86d51e 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -155,6 +155,7 @@  DPDK_17.08 {
 	rte_eth_dev_adjust_nb_rx_tx_desc;
 	rte_flow_copy;
 	rte_flow_isolate;
+	rte_eth_dev_reset;
 	rte_tm_capabilities_get;
 	rte_tm_get_leaf_nodes;
 	rte_tm_hierarchy_commit;