From patchwork Fri Dec 14 07:45:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 48804 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 C63E81B725; Fri, 14 Dec 2018 08:41:41 +0100 (CET) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 619001B722 for ; Fri, 14 Dec 2018 08:41:40 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2018 23:41:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,352,1539673200"; d="scan'208";a="100641758" Received: from jeffguo-s2600wt2.sh.intel.com (HELO localhost.localdomain) ([10.67.110.10]) by orsmga006.jf.intel.com with ESMTP; 13 Dec 2018 23:41:35 -0800 From: Jeff Guo To: bernard.iremonger@intel.com, wenzhuo.lu@intel.com, shahafs@mellanox.com, thomas@monjalon.net, matan@mellanox.com Cc: ferruh.yigit@intel.com, konstantin.ananyev@intel.com, dev@dpdk.org, jia.guo@intel.com, stephen@networkplumber.org, gaetan.rivet@6wind.com, qi.z.zhang@intel.com, arybchenko@solarflare.com, bruce.richardson@intel.com, shaopeng.he@intel.com, anatoly.burakov@intel.com Date: Fri, 14 Dec 2018 15:45:40 +0800 Message-Id: <1544773540-89825-4-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544773540-89825-1-git-send-email-jia.guo@intel.com> References: <1544773540-89825-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH 3/3] testpmd: remove device detach into eal 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" Assume that eal detect the removal event and handle hot-unplug, so device detach should be located in eal framework, the sequence should be eal detect and handle hot-unplug event at first, then eal notify app to finish pre-detach prepare, such as stop forwarding and clean ports, finally device be detached safely in eal. This patch aim to remove the invoke of device detach from app callback to eal device event handler. Signed-off-by: Jeff Guo --- app/test-pmd/testpmd.c | 1 - drivers/bus/pci/pci_common.c | 7 +++++++ lib/librte_eal/linuxapp/eal/eal_dev.c | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index bd44b21..f15035c 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2538,7 +2538,6 @@ rmv_port_callback(void *arg) stop_port(port_id); no_link_check = org_no_link_check; close_port(port_id); - detach_port_device(port_id); if (need_to_start) start_packet_forwarding(0); } diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 6276e5d..565f8cf 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -465,6 +465,13 @@ pci_hot_unplug_handler(struct rte_device *dev) */ rte_dev_event_callback_process(dev->name, RTE_DEV_EVENT_REMOVE); + ret = rte_dev_remove(dev); + if (ret) { + RTE_LOG(ERR, EAL, "Failed to remove device %s\n", + dev->name); + return -1; + } + RTE_LOG(INFO, EAL, "Success to remove device %s\n", dev->name); break; #endif case RTE_KDRV_IGB_UIO: diff --git a/lib/librte_eal/linuxapp/eal/eal_dev.c b/lib/librte_eal/linuxapp/eal/eal_dev.c index 2830c86..f4a75f8 100644 --- a/lib/librte_eal/linuxapp/eal/eal_dev.c +++ b/lib/librte_eal/linuxapp/eal/eal_dev.c @@ -275,8 +275,22 @@ dev_uev_handler(__rte_unused void *param) "for device (%s)\n", dev->name); } rte_spinlock_unlock(&failure_handle_lock); + + rte_dev_event_callback_process(uevent.devname, + uevent.type); + ret = rte_dev_remove(dev); + if (ret) { + RTE_LOG(ERR, EAL, + "Failed to remove device %s\n", + dev->name); + return; + } + RTE_LOG(INFO, EAL, "Success to remove device %s\n", + dev->name); + } else { + rte_dev_event_callback_process(uevent.devname, + uevent.type); } - rte_dev_event_callback_process(uevent.devname, uevent.type); } return;