From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 9FBD71B06D for ; Mon, 9 Jul 2018 08:59:17 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Jul 2018 23:59:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,329,1526367600"; d="scan'208";a="71124472" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by orsmga001.jf.intel.com with ESMTP; 08 Jul 2018 23:59:14 -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, qi.z.zhang@intel.com, shaopeng.he@intel.com, bernard.iremonger@intel.com, arybchenko@solarflare.com Cc: jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org, jia.guo@intel.com, helin.zhang@intel.com Date: Mon, 9 Jul 2018 14:56:51 +0800 Message-Id: <1531119413-17298-2-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531119413-17298-1-git-send-email-jia.guo@intel.com> References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531119413-17298-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH v2 1/3] net/ixgbe: enable hotplug detect in ixgbe 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 06:59:18 -0000 This patch aim to enable hotplug detect in ixgbe 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: refine some doc. --- drivers/net/ixgbe/ixgbe_ethdev.c | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 87d2ad0..83ce026 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -1534,6 +1534,47 @@ generate_random_mac_addr(struct ether_addr *mac_addr) memcpy(&mac_addr->addr_bytes[3], &random, 3); } +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)) { + _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; + } +} + /* * Virtual Function device init */ @@ -1678,6 +1719,9 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev) rte_intr_enable(intr_handle); ixgbevf_intr_enable(eth_dev); + /* register the device event callback */ + rte_dev_event_callback_register(NULL, eth_dev_event_callback, NULL); + PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x mac.type=%s", eth_dev->data->port_id, pci_dev->id.vendor_id, pci_dev->id.device_id, "ixgbe_mac_82599_vf"); @@ -1801,7 +1845,7 @@ static int eth_ixgbe_pci_remove(struct rte_pci_device *pci_dev) static struct rte_pci_driver rte_ixgbe_pmd = { .id_table = pci_id_ixgbe_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_ixgbe_pci_probe, .remove = eth_ixgbe_pci_remove, }; -- 2.7.4