From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 7CE2A29D6 for ; Thu, 3 May 2018 11:35:56 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 May 2018 02:35:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,358,1520924400"; d="scan'208";a="36538257" Received: from jguo15x-mobl3.ccr.corp.intel.com (HELO [10.67.68.67]) ([10.67.68.67]) by fmsmga007.fm.intel.com with ESMTP; 03 May 2018 02:35:52 -0700 To: Matan Azrad , "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 , Mordechay Haimovsky , "harry.van.haaren@intel.com" , "jianfeng.tan@intel.com" References: <1498711073-42917-1-git-send-email-jia.guo@intel.com> <1524058689-4954-1-git-send-email-jia.guo@intel.com> <1524058689-4954-5-git-send-email-jia.guo@intel.com> Cc: "jblunck@infradead.org" , "shreyansh.jain@nxp.com" , "dev@dpdk.org" , "helin.zhang@intel.com" From: "Guo, Jia" Message-ID: <02948416-4643-729e-2fdf-24c8d1aa6dc5@intel.com> Date: Thu, 3 May 2018 17:35:51 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [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: , X-List-Received-Date: Thu, 03 May 2018 09:35:56 -0000 hi, matan On 5/3/2018 3:25 PM, Matan Azrad wrote: > Hi Jeff > >> From: Jeff Guo, Wednesday, April 18, 2018 4:38 PM >> 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(); >> + > Again, I don't understand why the application should configure it - it already started the hot-plug, > Can't the EAL handle this automatically when the user starts the hot-plug? please check v21, agree with you and have already modify it. >> 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); >> +} > We have also the rmv_event_callback() which is triggered by a RMV interrupt and running by the host thread. > What is the context thread of rmv_dev_event_callback()? > Shouldn't they be synchronized? Should we need both in the same time? the context thread is interrupt thread. and we might be discuss how to sync it. do you have comment if i combine these 2 into 1 callback? >> + >> /* 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) >> -- >> 2.7.4