From patchwork Mon Jul 10 10:05:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Dai X-Patchwork-Id: 26705 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 7270D7CAF; Mon, 10 Jul 2017 12:16:26 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 568C57CA3 for ; Mon, 10 Jul 2017 12:16:23 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2017 03:16:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,339,1496127600"; d="scan'208";a="109491298" Received: from dpdk6.bj.intel.com ([172.16.182.81]) by orsmga002.jf.intel.com with ESMTP; 10 Jul 2017 03:16:20 -0700 From: Wei Dai To: thomas@monjalon.net, wenzhuo.lu@intel.com, konstantin.ananyev@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com Cc: dev@dpdk.org, Wei Dai Date: Mon, 10 Jul 2017 18:05:41 +0800 Message-Id: <1499681144-26031-2-git-send-email-wei.dai@intel.com> X-Mailer: git-send-email 2.7.5 In-Reply-To: <1499681144-26031-1-git-send-email-wei.dai@intel.com> References: <1498817556-64379-1-git-send-email-wei.dai@intel.com> <1499681144-26031-1-git-send-email-wei.dai@intel.com> Subject: [dpdk-dev] [PATCH v6 1/4] ethdev: add support of NIC reset X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 this function does and what an application should do after calling this function. Signed-off-by: Wei Dai --- lib/librte_ether/rte_ethdev.c | 16 ++++++++++++ lib/librte_ether/rte_ethdev.h | 45 ++++++++++++++++++++++++++++++++++ lib/librte_ether/rte_ether_version.map | 2 +- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 76179fd..21ea5bb 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -3414,3 +3414,19 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id, return 0; } + +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; +} diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index fd6baf3..f5fd047 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1113,6 +1113,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. */ @@ -1430,6 +1433,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. */ @@ -2132,6 +2136,47 @@ 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. + * + * A DPDK application calls this function to do an initiative or passive + * reset of a port. + * + * Sometimes a port have to be reset passively. For example a PF is reset, + * all its VFs should also be reset by application itself to align with the + * PF. + * A DPDK application also can call this function to trigger an initative + * port reset. + * + * When processing reset, if the port goes through PCI remove() and then + * PCI probe() for restoration, its port id may be changed and this is not + * expected by some DPDK application. + * + * Normally, PCI probe() includes two parts: one is in rte_ethdev layer + * to allocate resource in rte_ethdev layer and the other is calling PMD + * specific dev_init() to allocate and initialize resource in PMD layer. + * PCI remove( ) releases all resource allocated from rte_ethdev layer + * in PCI probe( ) and calls PMD specific dev_uninit( ) to releaase + * resource allocated by dev_init( ) in PMD layer. + * + * To keep same port id and reset the port, only dev_uninit() and + * dev_init( ) in PMD can be called and keep all resources allocated + * from rte_ethdev layer poart in PCI probe( ). All these are what + * rte_eth_dev_reset() does. + * + * The rte_eth_dev_reset( ) calls rte_eth_dev_stop( ), PMD dev_uninit( ) + * and then PMD dev_init( ) to reset a port and keep same port id. + * + * After calling rte_eth_dev_reset( ), the application can 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. + * + * @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 08deb1f..d89a101 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -155,5 +155,5 @@ DPDK_17.08 { rte_eth_dev_adjust_nb_rx_tx_desc; rte_flow_copy; rte_flow_isolate; - + rte_eth_dev_reset; } DPDK_17.05;