From patchwork Tue Jul 10 12:51:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 42708 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 DAAE21B3BA; Tue, 10 Jul 2018 14:53:58 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 250861B3B6 for ; Tue, 10 Jul 2018 14:53:55 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2018 05:53:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,334,1526367600"; d="scan'208";a="70159581" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by fmsmga004.fm.intel.com with ESMTP; 10 Jul 2018 05:53:53 -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: Tue, 10 Jul 2018 20:51:35 +0800 Message-Id: <1531227098-29564-2-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531227098-29564-1-git-send-email-jia.guo@intel.com> References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531227098-29564-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH v4 1/4] ethdev: Add API to enable device event handler 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" Implement a couple of eal device event handler install/uninstall APIs in ethdev, it could let PMDs have chance to manage the eal device event, such as register device event callback, then monitor and process the hotplug event. Signed-off-by: Jeff Guo Reviewed-by: Qi Zhang --- v4->v3: change to use eal device event handler install api --- doc/guides/rel_notes/release_18_08.rst | 12 +++++++ lib/librte_ethdev/rte_ethdev.c | 59 ++++++++++++++++++++++++++++++++++ lib/librte_ethdev/rte_ethdev_driver.h | 32 ++++++++++++++++++ 3 files changed, 103 insertions(+) diff --git a/doc/guides/rel_notes/release_18_08.rst b/doc/guides/rel_notes/release_18_08.rst index bc01242..b6482ce 100644 --- a/doc/guides/rel_notes/release_18_08.rst +++ b/doc/guides/rel_notes/release_18_08.rst @@ -46,6 +46,18 @@ New Features Flow API support has been added to CXGBE Poll Mode Driver to offload flows to Chelsio T5/T6 NICs. +* **Added eal device event process helper in ethdev.** + + Implement a couple of eal device event handler install/uninstall APIs in + ethdev, these helper could let PMDs have chance to manage the eal device + event, such as register device event callback, then monitor and process + hotplug event. + + * ``rte_eth_dev_event_handler_install`` for PMDs use to install the device + event handler. + * ``rte_eth_dev_event_handler_uninstall`` for PMDs use to uninstall the device + event handler. + API Changes ----------- diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index a9977df..09ea02d 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -4518,6 +4518,65 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da) return result; } +static void __rte_experimental +eth_dev_event_callback(char *device_name, enum rte_dev_event_type type, + void *arg) +{ + struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)arg; + + switch (type) { + case RTE_DEV_EVENT_REMOVE: + ethdev_log(INFO, "The device: %s has been removed!\n", + device_name); + + if (!device_name || !eth_dev) + return; + + if (!(eth_dev->data->dev_flags & RTE_ETH_EVENT_INTR_RMV)) + return; + + if (!strcmp(device_name, eth_dev->device->name)) + _rte_eth_dev_callback_process(eth_dev, + RTE_ETH_EVENT_INTR_RMV, + NULL); + break; + case RTE_DEV_EVENT_ADD: + ethdev_log(INFO, "The device: %s has been added!\n", + device_name); + break; + default: + break; + } +} + +int __rte_experimental +rte_eth_dev_event_handler_install(struct rte_eth_dev *eth_dev) +{ + int result = 0; + + result = rte_dev_event_callback_register(eth_dev->device->name, + eth_dev_event_callback, eth_dev); + if (result) + RTE_LOG(ERR, EAL, "device event callback register failed for " + "device:%s!\n", eth_dev->device->name); + + return result; +} + +int __rte_experimental +rte_eth_dev_event_handler_uninstall(struct rte_eth_dev *eth_dev) +{ + int result = 0; + + result = rte_dev_event_callback_unregister(eth_dev->device->name, + eth_dev_event_callback, eth_dev); + if (result) + RTE_LOG(ERR, EAL, "device event callback unregister failed for" + " device:%s!\n", eth_dev->device->name); + + return result; +} + RTE_INIT(ethdev_init_log); static void ethdev_init_log(void) diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index c9c825e..3de1cd4 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -82,6 +82,38 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev); void _rte_eth_dev_reset(struct rte_eth_dev *dev); /** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Implement a helper to install the device event handler for the specific + * ether device. + * + * @param dev + * Pointer to struct rte_eth_dev. + * + * @return + * - 0 on success, negative on error + */ +int __rte_experimental +rte_eth_dev_event_handler_install(struct rte_eth_dev *dev); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Implement a helper to uninstall the device event handler for the specific + * ether device. + * + * @param dev + * Pointer to struct rte_eth_dev. + * + * @return + * - 0 on success, negative on error + */ +int __rte_experimental +rte_eth_dev_event_handler_uninstall(struct rte_eth_dev *dev); + +/** * @internal Executes all the user application registered callbacks for * the specific device. It is for DPDK internal user only. User * application should not call it directly. From patchwork Tue Jul 10 12:51:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 42709 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 4D3641B42D; Tue, 10 Jul 2018 14:54:01 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id A190A1B3AA for ; Tue, 10 Jul 2018 14:53:59 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2018 05:53:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,334,1526367600"; d="scan'208";a="70159590" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by fmsmga004.fm.intel.com with ESMTP; 10 Jul 2018 05:53:55 -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: Tue, 10 Jul 2018 20:51:36 +0800 Message-Id: <1531227098-29564-3-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531227098-29564-1-git-send-email-jia.guo@intel.com> References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531227098-29564-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH v4 2/4] net/ixgbe: install ethdev hotplug handler 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch aim to enable hotplug detect in ixgbe PMD. Firstly it set the flags RTE_PCI_DRV_INTR_RMV in drv_flags to announce the hotplug ability, and then use rte_eth_dev_event_handler_install to install the hotplug event handler for ethdev. When eal detect the hotplug event, it will call the ethdev callback to process it. If the event is hotplug removal, it will trigger the RTE_ETH_EVENT_INTR_RMV event into ethdev callback to let app process the hotplug for this ethdev. This is an example for other driver, that if any driver support hotplug feature could be use this way to install hotplug handler. Signed-off-by: Jeff Guo --- v4->v3: change to use eal device event handler install api --- drivers/net/ixgbe/ixgbe_ethdev.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 87d2ad0..e7ae9bf 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -1678,6 +1678,9 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev) rte_intr_enable(intr_handle); ixgbevf_intr_enable(eth_dev); + /* install the dev event handler for ethdev. */ + rte_eth_dev_event_handler_install(eth_dev); + 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"); @@ -1718,6 +1721,9 @@ eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev) rte_intr_callback_unregister(intr_handle, ixgbevf_dev_interrupt_handler, eth_dev); + /* uninstall the dev event handler for ethdev. */ + rte_eth_dev_event_handler_uninstall(eth_dev); + return 0; } @@ -1801,7 +1807,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, }; From patchwork Tue Jul 10 12:51:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 42710 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 6029D1B437; Tue, 10 Jul 2018 14:54:05 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 0E8501B3AE for ; Tue, 10 Jul 2018 14:54:01 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2018 05:54:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,334,1526367600"; d="scan'208";a="70159604" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by fmsmga004.fm.intel.com with ESMTP; 10 Jul 2018 05:53:59 -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: Tue, 10 Jul 2018 20:51:37 +0800 Message-Id: <1531227098-29564-4-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531227098-29564-1-git-send-email-jia.guo@intel.com> References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531227098-29564-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH v4 3/4] net/i40e: install hotplug handler 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch aim to enable hotplug detect in i40e PMD. Firstly it set the flags RTE_PCI_DRV_INTR_RMV in drv_flags to announce the hotplug ability, and then use rte_eth_dev_event_handler_install to install the hotplug event handler for ethdev. When eal detect the hotplug event, it will call the ethdev callback to process it. If the event is hotplug removal, it will trigger the RTE_ETH_EVENT_INTR_RMV event into ethdev callback to let app process the hotplug for this ethdev. This is an example for other driver, that if any driver support hotplug feature could be use this way to install hotplug handler. Signed-off-by: Jeff Guo Acked-by: Qi Zhang --- v4->v3: change to use eal device event handler install api --- drivers/net/i40e/i40e_ethdev.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 13c5d32..8fccf04 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, }; @@ -1442,6 +1442,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); + /* install the dev event handler for ethdev. */ + rte_eth_dev_event_handler_install(dev); + /* configure and enable device interrupt */ i40e_pf_config_irq0(hw, TRUE); i40e_pf_enable_irq0(hw); @@ -1674,6 +1677,9 @@ eth_i40e_dev_uninit(struct rte_eth_dev *dev) /* Remove all Traffic Manager configuration */ i40e_tm_conf_uninit(dev); + /* uninstall the dev event handler for ethdev. */ + rte_eth_dev_event_handler_uninstall(dev); + return 0; } From patchwork Tue Jul 10 12:51:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Jia" X-Patchwork-Id: 42711 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 258531B43F; Tue, 10 Jul 2018 14:54:08 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id CC9BF1B438 for ; Tue, 10 Jul 2018 14:54:04 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2018 05:54:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,334,1526367600"; d="scan'208";a="70159616" Received: from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain) ([10.67.104.10]) by fmsmga004.fm.intel.com with ESMTP; 10 Jul 2018 05:54:01 -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: Tue, 10 Jul 2018 20:51:38 +0800 Message-Id: <1531227098-29564-5-git-send-email-jia.guo@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531227098-29564-1-git-send-email-jia.guo@intel.com> References: <1530787185-5915-1-git-send-email-jia.guo@intel.com> <1531227098-29564-1-git-send-email-jia.guo@intel.com> Subject: [dpdk-dev] [PATCH v4 4/4] testpmd: remove the dev event callback register 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" Since now we can use driver to management the eal event for hotplug, so no need to register dev event callback in app anymore. This patch remove the related code. Signed-off-by: Jeff Guo Acked-by: Wenzhuo Lu --- v4->v3: no change --- app/test-pmd/testpmd.c | 76 -------------------------------------------------- 1 file changed, 76 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 24c1998..10ed660 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -400,12 +400,6 @@ static void check_all_ports_link_status(uint32_t port_mask); static int eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, void *ret_param); -static void eth_dev_event_callback(char *device_name, - enum rte_dev_event_type type, - void *param); -static int eth_dev_event_callback_register(void); -static int eth_dev_event_callback_unregister(void); - /* * Check if all the ports are started. @@ -1915,39 +1909,6 @@ reset_port(portid_t pid) printf("Done\n"); } -static int -eth_dev_event_callback_register(void) -{ - int ret; - - /* register the device event callback */ - ret = rte_dev_event_callback_register(NULL, - eth_dev_event_callback, NULL); - if (ret) { - printf("Failed to register device event callback\n"); - return -1; - } - - return 0; -} - - -static int -eth_dev_event_callback_unregister(void) -{ - int ret; - - /* unregister the device event callback */ - ret = rte_dev_event_callback_unregister(NULL, - eth_dev_event_callback, NULL); - if (ret < 0) { - printf("Failed to unregister device event callback\n"); - return -1; - } - - return 0; -} - void attach_port(char *identifier) { @@ -2049,10 +2010,6 @@ pmd_test_exit(void) RTE_LOG(ERR, EAL, "fail to stop device event monitor."); - ret = eth_dev_event_callback_unregister(); - if (ret) - RTE_LOG(ERR, EAL, - "fail to unregister all event callbacks."); } printf("\nBye...\n"); @@ -2191,37 +2148,6 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, return 0; } -/* This function is used by the interrupt thread */ -static void -eth_dev_event_callback(char *device_name, enum rte_dev_event_type type, - __rte_unused void *arg) -{ - 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: - 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. - */ - break; - case RTE_DEV_EVENT_ADD: - RTE_LOG(ERR, EAL, "The device: %s has been added!\n", - device_name); - /* TODO: After finish kernel driver binding, - * begin to attach port. - */ - break; - default: - break; - } -} - static int set_tx_queue_stats_mapping_registers(portid_t port_id, struct rte_port *port) { @@ -2735,8 +2661,6 @@ main(int argc, char** argv) rte_errno = EINVAL; return -1; } - eth_dev_event_callback_register(); - } if (start_port(RTE_PORT_ALL) != 0)