From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 31E805F2B for ; Mon, 9 Jul 2018 10:54:13 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Jul 2018 01:54:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,329,1526367600"; d="scan'208";a="214460104" Received: from jguo15x-mobl3.ccr.corp.intel.com (HELO [10.67.68.84]) ([10.67.68.84]) by orsmga004.jf.intel.com with ESMTP; 09 Jul 2018 01:54:09 -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" , "qi.z.zhang@intel.com" , "shaopeng.he@intel.com" , "bernard.iremonger@intel.com" , "arybchenko@solarflare.com" References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531119413-17298-1-git-send-email-jia.guo@intel.com> <1531119413-17298-3-git-send-email-jia.guo@intel.com> Cc: "jblunck@infradead.org" , "shreyansh.jain@nxp.com" , "dev@dpdk.org" , "helin.zhang@intel.com" From: Jeff Guo Message-ID: <3517c603-d940-d79a-4fc6-ec25ab084186@intel.com> Date: Mon, 9 Jul 2018 16:54:08 +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 v2 2/3] net/i40e: enable hotplug detect in i40e 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: Mon, 09 Jul 2018 08:54:14 -0000 hi, matan On 7/9/2018 3:47 PM, Matan Azrad wrote: > Hi Guo > > From: Jeff Guo >> This patch aim to enable hotplug detect in i40e pmd driver. Firstly it set the >> flags RTE_PCI_DRV_INTR_RMV in drv_flags to announce the hotplug ability, >> and then use rte_dev_event_callback_register to register the hotplug event >> callback to eal. When eal detect the hotplug event, it will call the callback to >> process it, if the event is hotplug remove, it will trigger the >> RTE_ETH_EVENT_INTR_RMV event into ethdev callback to let app process >> the hotplug for the ethdev. >> >> This is an example for other driver, that if any driver support hotplug feature >> could be use this way to enable hotplug detect. >> >> Signed-off-by: Jeff Guo >> --- >> v2->v1: >> no v1, add hotplug detect in ixgbe for new. >> --- >> drivers/net/i40e/i40e_ethdev.c | 46 >> +++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 45 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c >> index 13c5d32..ad4231f 100644 >> --- a/drivers/net/i40e/i40e_ethdev.c >> +++ b/drivers/net/i40e/i40e_ethdev.c >> @@ -688,7 +688,7 @@ static int eth_i40e_pci_remove(struct rte_pci_device >> *pci_dev) static struct rte_pci_driver rte_i40e_pmd = { >> .id_table = pci_id_i40e_map, >> .drv_flags = RTE_PCI_DRV_NEED_MAPPING | >> RTE_PCI_DRV_INTR_LSC | >> - RTE_PCI_DRV_IOVA_AS_VA, >> + RTE_PCI_DRV_IOVA_AS_VA | RTE_PCI_DRV_INTR_RMV, >> .probe = eth_i40e_pci_probe, >> .remove = eth_i40e_pci_remove, >> }; >> @@ -1183,6 +1183,47 @@ i40e_aq_debug_write_global_register(struct >> i40e_hw *hw, >> return i40e_aq_debug_write_register(hw, reg_addr, reg_val, >> cmd_details); } >> >> +static void >> +eth_dev_event_callback(char *device_name, enum rte_dev_event_type >> type, >> + __rte_unused void *arg) >> +{ >> + uint32_t pid; >> + >> + if (type >= RTE_DEV_EVENT_MAX) { >> + fprintf(stderr, "%s called upon invalid event %d\n", >> + __func__, type); >> + fflush(stderr); >> + } >> + >> + switch (type) { >> + case RTE_DEV_EVENT_REMOVE: >> + PMD_DRV_LOG(INFO, "The device: %s has been >> removed!\n", >> + device_name); >> + >> + if (!device_name) >> + return; >> + >> + for (pid = 0; pid < RTE_MAX_ETHPORTS; pid++) { >> + if (rte_eth_devices[pid].device) { >> + if (!strcmp(device_name, >> + rte_eth_devices[pid].device->name)) { > You just need to compare this PMD ethdev ports device names to the current EAL removed device name. > You should not raise RMV events for other PMD ports. make sense here. thanks matan. >> + _rte_eth_dev_callback_process( >> + &rte_eth_devices[pid], >> + RTE_ETH_EVENT_INTR_RMV, >> NULL); >> + continue; >> + } >> + } >> + } >> + break; >> + case RTE_DEV_EVENT_ADD: >> + RTE_LOG(INFO, EAL, "The device: %s has been added!\n", >> + device_name); >> + break; >> + default: >> + break; >> + } >> +} >> + >> static int >> eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params >> __rte_unused) { @@ -1442,6 +1483,9 @@ eth_i40e_dev_init(struct >> rte_eth_dev *dev, void *init_params __rte_unused) >> rte_intr_callback_register(intr_handle, >> i40e_dev_interrupt_handler, dev); >> >> + /* register the device event callback */ >> + rte_dev_event_callback_register(NULL, eth_dev_event_callback, >> NULL); >> + >> /* configure and enable device interrupt */ >> i40e_pf_config_irq0(hw, TRUE); >> i40e_pf_enable_irq0(hw); >> -- >> 2.7.4