From patchwork Wed Apr 18 13:38:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 38416 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 [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9658CAAC0; Wed, 18 Apr 2018 15:39:40 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id D68E0AAB9 for ; Wed, 18 Apr 2018 15:39:35 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Apr 2018 06:39:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,465,1517904000"; d="scan'208";a="34321762" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by orsmga007.jf.intel.com with ESMTP; 18 Apr 2018 06:39:32 -0700 From: Jeff Guo To: stephen@networkplumber.org, bruce.richardson@intel.com, ferruh.yigit@intel.com, konstantin.ananyev@intel.com, gaetan.rivet@6wind.com, jingjing.wu@intel.com, thomas@monjalon.net, motih@mellanox.com, matan@mellanox.com, harry.van.haaren@intel.com, jianfeng.tan@intel.com Cc: jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org, jia.guo@intel.com, helin.zhang@intel.com Date: Wed, 18 Apr 2018 21:38:09 +0800 Message-Id: <1524058689-4954-5-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524058689-4954-1-git-send-email-jia.guo@intel.com> References: <1498711073-42917-1-git-send-email-jia.guo@intel.com> <1524058689-4954-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH V20 4/4] app/testpmd: show example to handler hot unplug 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" Use testpmd for example, to show how an application smoothly handle failure when device being hot unplug. Once app detect the removal event, the callback would be called, it first stop the packet forwarding, then stop the port, close the port and finally detach the port. Signed-off-by: Jeff Guo --- v20->v19: remove the auto binding example. --- app/test-pmd/testpmd.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 5986ff7..3751901 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -1125,6 +1125,9 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd) tics_datum = rte_rdtsc(); tics_per_1sec = rte_get_timer_hz(); #endif + if (hot_plug) + rte_dev_handle_hot_unplug(); + fsm = &fwd_streams[fc->stream_idx]; nb_fs = fc->stream_nb; do { @@ -2069,6 +2072,26 @@ rmv_event_callback(void *arg) dev->device->name); } +static void +rmv_dev_event_callback(char *dev_name) +{ + uint16_t port_id; + int ret; + + ret = rte_eth_dev_get_port_by_name(dev_name, &port_id); + if (ret) { + printf("can not get port by device %s!\n", dev_name); + return; + } + + RTE_ETH_VALID_PORTID_OR_RET(port_id); + printf("removing port id:%u\n", port_id); + stop_packet_forwarding(); + stop_port(port_id); + close_port(port_id); + detach_port(port_id); +} + /* This function is used by the interrupt thread */ static int eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, @@ -2130,9 +2153,7 @@ eth_dev_event_callback(char *device_name, enum rte_dev_event_type type, case RTE_DEV_EVENT_REMOVE: RTE_LOG(ERR, EAL, "The device: %s has been removed!\n", device_name); - /* TODO: After finish failure handle, begin to stop - * packet forward, stop port, close port, detach port. - */ + rmv_dev_event_callback(device_name); break; case RTE_DEV_EVENT_ADD: RTE_LOG(ERR, EAL, "The device: %s has been added!\n", @@ -2640,7 +2661,7 @@ main(int argc, char** argv) return -1; } eth_dev_event_callback_register(); - + rte_dev_handle_hot_unplug(); } if (start_port(RTE_PORT_ALL) != 0)