From patchwork Wed Oct 24 13:41:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 47348 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 57EBB54AE; Wed, 24 Oct 2018 15:41:23 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id DCD134F9B for ; Wed, 24 Oct 2018 15:41:21 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 4101622098; Wed, 24 Oct 2018 09:41:21 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 24 Oct 2018 09:41:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=thdhTkqKrT j5EmbPiC+bFmfk8ejMfF3sJgWytHufI9o=; b=oogakdTVaVDhmKLUlFlIw+5cFj W3U2UHDcxzboyycO1wRElpTsF3MxxqvGxSKZ8G1zZ54AkedxVFDCdxT/ne1evuGX OEprApzQwDuePYIrjMoK16XTW90CLZuhNgWCIb1+RgCXCYyN4xiviWx12ydxN7mI 5iQg8hsthcROziK6U= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=thdhTkqKrTj5EmbPiC+bFmfk8ejMfF3sJgWytHufI9o=; b=gcAWw7D0 8dmtZ2tb5FNuIO48gvVan4IW71m7DJZFHPVLF/jd8wnC1GkPmH6nUjrimiXnS9FL lSf+TdGiV3G+CkT1zstopmHBlCpGyQX1UerIHEVwTh8gFxR95pmhSTsd2tYvXZGR IvXCMccPianOkifo25jewkMaPIY9q7XP5XBk0V9TQjLKisz8EPk2+d7YwQ22WTVm rTDvK0Yjc53D5VAqhfz2mpvEaGkEHKCtv3YvpsBhWiVVyBbk/5SizQnNGaLOU2xO O8qDaA+JFuwYPVVEaqzb+k2irww7nTmG4cS9qi6wjog5sPWATxYPEZkyjd8wJzNE pTJKDoPBeMKrJg== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id C677FE4122; Wed, 24 Oct 2018 09:41:19 -0400 (EDT) From: Thomas Monjalon To: bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com Date: Wed, 24 Oct 2018 15:41:07 +0200 Message-Id: <20181024134111.26771-2-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181024134111.26771-1-thomas@monjalon.net> References: <20181024134111.26771-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 1/5] app/testpmd: check not detaching device twice 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" The command "port detach" is removing the EAL rte_device of the ethdev port specified as parameter. The function name and some comments are updated to make clear that we are detaching the whole device. After detaching, the pointer, which maps a port to its device, is reset. This way, it is possible to check whether a port is still associated to a (not removed) device. Signed-off-by: Thomas Monjalon Acked-by: Bernard Iremonger --- app/test-pmd/cmdline.c | 2 +- app/test-pmd/testpmd.c | 35 ++++++++++++++++++++++++++++------- app/test-pmd/testpmd.h | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 3b469ac64..f041a01aa 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -1305,7 +1305,7 @@ static void cmd_operate_detach_port_parsed(void *parsed_result, struct cmd_operate_detach_port_result *res = parsed_result; if (!strcmp(res->keyword, "detach")) - detach_port(res->port_id); + detach_port_device(res->port_id); else printf("Unknown parameter\n"); } diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 14647fa19..56e408cdf 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2351,10 +2351,19 @@ setup_attached_port(portid_t pi) } void -detach_port(portid_t port_id) +detach_port_device(portid_t port_id) { + struct rte_device *dev; + portid_t sibling; + printf("Removing a device...\n"); + dev = rte_eth_devices[port_id].device; + if (dev == NULL) { + printf("Device already removed\n"); + return; + } + if (ports[port_id].port_status != RTE_PORT_CLOSED) { if (ports[port_id].port_status != RTE_PORT_STOPPED) { printf("Port not stopped\n"); @@ -2365,15 +2374,27 @@ detach_port(portid_t port_id) port_flow_flush(port_id); } - if (rte_dev_remove(rte_eth_devices[port_id].device) != 0) { - TESTPMD_LOG(ERR, "Failed to detach port %u\n", port_id); + if (rte_dev_remove(dev) != 0) { + TESTPMD_LOG(ERR, "Failed to detach device %s\n", dev->name); return; } + for (sibling = 0; sibling < RTE_MAX_ETHPORTS; sibling++) { + if (rte_eth_devices[sibling].device != dev) + continue; + /* reset mapping between old ports and removed device */ + rte_eth_devices[sibling].device = NULL; + if (ports[sibling].port_status != RTE_PORT_CLOSED) { + /* sibling ports are forced to be closed */ + ports[sibling].port_status = RTE_PORT_CLOSED; + printf("Port %u is closed\n", sibling); + } + } + remove_unused_fwd_ports(); - printf("Port %u is detached. Now total ports is %d\n", - port_id, nb_ports); + printf("Device of port %u is detached\n", port_id); + printf("Now total ports is %d\n", nb_ports); printf("Done\n"); return; } @@ -2406,7 +2427,7 @@ pmd_test_exit(void) */ device = rte_eth_devices[pt_id].device; if (device && !strcmp(device->driver->name, "net_virtio_user")) - detach_port(pt_id); + detach_port_device(pt_id); } } @@ -2518,7 +2539,7 @@ rmv_event_callback(void *arg) stop_port(port_id); no_link_check = org_no_link_check; close_port(port_id); - detach_port(port_id); + detach_port_device(port_id); if (need_to_start) start_packet_forwarding(0); } diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 3da728cad..646e44940 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -712,7 +712,7 @@ void stop_port(portid_t pid); void close_port(portid_t pid); void reset_port(portid_t pid); void attach_port(char *identifier); -void detach_port(portid_t port_id); +void detach_port_device(portid_t port_id); int all_ports_stopped(void); int port_is_stopped(portid_t port_id); int port_is_started(portid_t port_id); From patchwork Wed Oct 24 13:41:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 47349 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 7577A5B2C; Wed, 24 Oct 2018 15:41:27 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 160C95689 for ; Wed, 24 Oct 2018 15:41:24 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id A98CD22054; Wed, 24 Oct 2018 09:41:23 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 24 Oct 2018 09:41:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=YxpnhGGxJ7 PwgVW9pPQRxAyw6MrTml7DYrA5C48kWU8=; b=fsBMe1vvg+zEX07zCphYvWfI9B jRO8EOGqMp4Yoj+5feUFDfgsabhLW+zE9q0x485flKDg/cgPnO18aiS2lkI4ydMf I0dmh9ihn3rvtF4BLsVU4bD9Vp9lTwS7wG87ZGy87OnmW/FspqIh+8H0Wbzv9Bjn hQYs18TYfwBVK/i9E= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=YxpnhGGxJ7PwgVW9pPQRxAyw6MrTml7DYrA5C48kWU8=; b=SrYUJVI+ RHo/4Q7DE9OdD5J+M0nnWWVDbPLWcbtyrSJ4V6AlsUNIfIeuT8Ntbi16E0YYELwh ppNK8MfFelEhQ+2xO1JiAbgKPsi0I9ZmSHF3lrC7WeBut5Brz4uBFhUXY8E9yz/B HXC88brYdywdqvdTXW2YTCNRLNsRnSB6o2DF65DMj1I8b5U34wJKeGAPpyadfE0m 1ycENrWIsgCirzjSigSdLvyTZ55b0+zuvXYseGWgbNVVMJ7evXfrrWdNxvI0s5vu wxvdtvdDxlDvPEdiViOoy9iv6jXNuNbe7RG8CHIVcgL7IkkIUo6U5j9md8wSYNTD ywdgqAjcNz1qGQ== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 7358EE4122; Wed, 24 Oct 2018 09:41:22 -0400 (EDT) From: Thomas Monjalon To: bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com Date: Wed, 24 Oct 2018 15:41:08 +0200 Message-Id: <20181024134111.26771-3-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181024134111.26771-1-thomas@monjalon.net> References: <20181024134111.26771-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 2/5] app/testpmd: merge ports list update functions 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" The arrays ports_ids and fwd_ports_ids require the same kind of update when some ports are removed or added. The functions update_fwd_ports() and remove_unused_fwd_ports() are merged in the new function remove_invalid_ports(). The part for adding new port is moved into setup_attached_port(). Signed-off-by: Thomas Monjalon Acked-by: Bernard Iremonger --- app/test-pmd/testpmd.c | 74 +++++++++++++----------------------------- 1 file changed, 22 insertions(+), 52 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 56e408cdf..21627ecb6 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -1609,31 +1609,6 @@ launch_packet_forwarding(lcore_function_t *pkt_fwd_on_lcore) } } -/* - * Update the forward ports list. - */ -void -update_fwd_ports(portid_t new_pid) -{ - unsigned int i; - unsigned int new_nb_fwd_ports = 0; - int move = 0; - - for (i = 0; i < nb_fwd_ports; ++i) { - if (port_id_is_invalid(fwd_ports_ids[i], DISABLED_WARN)) - move = 1; - else if (move) - fwd_ports_ids[new_nb_fwd_ports++] = fwd_ports_ids[i]; - else - new_nb_fwd_ports++; - } - if (new_pid < RTE_MAX_ETHPORTS) - fwd_ports_ids[new_nb_fwd_ports++] = new_pid; - - nb_fwd_ports = new_nb_fwd_ports; - nb_cfg_ports = new_nb_fwd_ports; -} - /* * Launch packet forwarding configuration. */ @@ -2188,28 +2163,25 @@ stop_port(portid_t pid) } static void -remove_unused_fwd_ports(void) +remove_invalid_ports_in(portid_t *array, portid_t *total) { - int i; - int last_port_idx = nb_ports - 1; + portid_t i; + portid_t new_total = 0; - for (i = 0; i <= last_port_idx; i++) { /* iterate in ports_ids */ - if (rte_eth_devices[ports_ids[i]].state != RTE_ETH_DEV_UNUSED) - continue; - /* skip unused ports at the end */ - while (i <= last_port_idx && - rte_eth_devices[ports_ids[last_port_idx]].state - == RTE_ETH_DEV_UNUSED) - last_port_idx--; - if (last_port_idx < i) - break; - /* overwrite unused port with last valid port */ - ports_ids[i] = ports_ids[last_port_idx]; - /* decrease ports count */ - last_port_idx--; - } - nb_ports = rte_eth_dev_count_avail(); - update_fwd_ports(RTE_MAX_ETHPORTS); + for (i = 0; i < *total; i++) + if (!port_id_is_invalid(array[i], DISABLED_WARN)) { + array[new_total] = array[i]; + new_total++; + } + *total = new_total; +} + +static void +remove_invalid_ports(void) +{ + remove_invalid_ports_in(ports_ids, &nb_ports); + remove_invalid_ports_in(fwd_ports_ids, &nb_fwd_ports); + nb_cfg_ports = nb_fwd_ports; } void @@ -2254,7 +2226,7 @@ close_port(portid_t pid) port_flow_flush(pi); rte_eth_dev_close(pi); - remove_unused_fwd_ports(); + remove_invalid_ports(); if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_HANDLING, RTE_PORT_CLOSED) == 0) @@ -2339,13 +2311,11 @@ setup_attached_port(portid_t pi) reconfig(pi, socket_id); rte_eth_promiscuous_enable(pi); - ports_ids[nb_ports] = pi; - nb_ports = rte_eth_dev_count_avail(); - + ports_ids[nb_ports++] = pi; + fwd_ports_ids[nb_fwd_ports++] = pi; + nb_cfg_ports = nb_fwd_ports; ports[pi].port_status = RTE_PORT_STOPPED; - update_fwd_ports(pi); - printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports); printf("Done\n"); } @@ -2391,7 +2361,7 @@ detach_port_device(portid_t port_id) } } - remove_unused_fwd_ports(); + remove_invalid_ports(); printf("Device of port %u is detached\n", port_id); printf("Now total ports is %d\n", nb_ports); From patchwork Wed Oct 24 13:41:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 47350 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 715735F11; Wed, 24 Oct 2018 15:41:29 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id BEAD65B26 for ; Wed, 24 Oct 2018 15:41:26 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 62F6121B2A; Wed, 24 Oct 2018 09:41:26 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 24 Oct 2018 09:41:26 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=AkuBXU0gBz XSH9zePCBaOYQnimpb2QYAfZSNFfOjFZg=; b=kL+PJavtKdaHWwQ+GSIIshS6XY t6Yno+2Sng451egguKsi1SaBWcvkPLKdlrirZ6otwq93noa0zBG0YrD1SI2QROtZ ZwjndudFgy66xHsHMAz1yDnkQZscpAPNGd43tu5KZgMP1uCCId9+bMRlqgjcDJNc pMCg+ODnmZPPQz24A= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=AkuBXU0gBzXSH9zePCBaOYQnimpb2QYAfZSNFfOjFZg=; b=nIqNECwI o7VSshvJp2R+L2URG084jW3bnyo0GLl0Qf2aRHiFxDtVT8VVPX831HHFlcbS4QwW 1q2YPPy50ome2YAysR5lcQA1sxISYcO2oShIs3Qz50dfikA4CKPZap4VeSsui9Bp lhnI3eZTjZUW/QGSEK/cnQcU45PmJyXp+9reuXjqSV41tdda/oWv/sl4i72TGT3j VoVPdp1GT2nuA9WraUzBHYx6qhzJFAAg5XeYlnB3MSSAWpQZMuDB6GpUBTv3Z9D4 V1aC7SBLdkTbex2jUqoqxOncZt2LefAo5UXecwblTD/v8eL7l679Y+ktBFp6JmF7 nT74Z53geryyZg== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 12791E44D4; Wed, 24 Oct 2018 09:41:24 -0400 (EDT) From: Thomas Monjalon To: bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com Date: Wed, 24 Oct 2018 15:41:09 +0200 Message-Id: <20181024134111.26771-4-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181024134111.26771-1-thomas@monjalon.net> References: <20181024134111.26771-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 3/5] app/testpmd: check not configuring port twice 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" It is possible to request probing of a device twice, and possibly get new ports for this device. However, the ports which were already probed and setup must not be setup again. That's why it is checked whether the port is already part of fwd_ports_ids array at the beginning of the function setup_attached_port(). Signed-off-by: Thomas Monjalon Acked-by: Bernard Iremonger --- app/test-pmd/testpmd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 21627ecb6..72b91adf5 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2295,8 +2295,11 @@ attach_port(char *identifier) return; } - RTE_ETH_FOREACH_MATCHING_DEV(pi, identifier, &iterator) + RTE_ETH_FOREACH_MATCHING_DEV(pi, identifier, &iterator) { + if (port_is_forwarding(pi)) + continue; /* port was already attached before */ setup_attached_port(pi); + } } static void From patchwork Wed Oct 24 13:41:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 47351 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 CC7CA5F1C; Wed, 24 Oct 2018 15:41:32 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id AF0995B34 for ; Wed, 24 Oct 2018 15:41:28 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 52F3F22053; Wed, 24 Oct 2018 09:41:28 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 24 Oct 2018 09:41:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=heHdSNecwY +1ZNw9gEMQKRUdlyOCbjLEv7MpqBlFmK8=; b=RJfhPpYuFhwQ6d68vKjGgybubL c7uWDPwU1fnYG+uCupNuIovyFVvrLn0rJYTUtp90MA3GGusAd1jYxw9bPb/crrCu qx0WF0nWn9Psr+uOikd1n25k1d4meZujDp6WES/z9kyUGRhjCfrFVrdNTU0tNnH3 tsCn4d63zQgbEcX54= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=heHdSNecwY+1ZNw9gEMQKRUdlyOCbjLEv7MpqBlFmK8=; b=GRd3wsxw gAa1eLFPVGhwwGc8Tql6zGFyUxw8wNTL9sVNkMJphV+H36eXPakdx9yLaZu7PdEm aDkbthtEp6W+ScLc7+M1QLu7q2hFEWCSCgs8WdFK32ka5epzbFOzTJ06nc5PvZgf +xThldebcIiLfTGiyoLBGYJSIxlD2z9TeOUTRY5n2nz2N/vlZaezd9v6phtSFRvQ 6TkBG19qe5HC8JfYq+QR5PQqXtOjADPiJls4F3GJ+yvzIQn/xy74PDl4BxdnmSCQ bMiKqSrJRjUpLglb4lOReifhJuP/6pM0MQzzmCDeXpXTvEdx/UegJTASPvIvP8+2 AoU2U8KQhjXQ1g== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 001C1E43AC; Wed, 24 Oct 2018 09:41:26 -0400 (EDT) From: Thomas Monjalon To: bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com Date: Wed, 24 Oct 2018 15:41:10 +0200 Message-Id: <20181024134111.26771-5-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181024134111.26771-1-thomas@monjalon.net> References: <20181024134111.26771-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 4/5] app/testpmd: move ethdev events registration 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" The callback for ethdev events was registered on port start, so it was missing some events. It is now registered at the beginning of the main function. Signed-off-by: Thomas Monjalon --- app/test-pmd/testpmd.c | 72 ++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 72b91adf5..6eb416e7a 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -345,6 +345,21 @@ uint8_t rmv_interrupt = 1; /* enabled by default */ uint8_t hot_plug = 0; /**< hotplug disabled by default. */ +/* Pretty printing of ethdev events */ +static const char * const eth_event_desc[] = { + [RTE_ETH_EVENT_UNKNOWN] = "unknown", + [RTE_ETH_EVENT_INTR_LSC] = "LSC", + [RTE_ETH_EVENT_QUEUE_STATE] = "queue state", + [RTE_ETH_EVENT_INTR_RESET] = "interrupt reset", + [RTE_ETH_EVENT_VF_MBOX] = "VF mbox", + [RTE_ETH_EVENT_IPSEC] = "IPsec", + [RTE_ETH_EVENT_MACSEC] = "MACsec", + [RTE_ETH_EVENT_INTR_RMV] = "device removal", + [RTE_ETH_EVENT_NEW] = "device probed", + [RTE_ETH_EVENT_DESTROY] = "device released", + [RTE_ETH_EVENT_MAX] = NULL, +}; + /* * Display or mask ether events * Default to all events except VF_MBOX @@ -1934,7 +1949,6 @@ start_port(portid_t pid) queueid_t qi; struct rte_port *port; struct ether_addr mac_addr; - enum rte_eth_event_type event_type; if (port_id_is_invalid(pid, ENABLED_WARN)) return 0; @@ -2090,20 +2104,6 @@ start_port(portid_t pid) need_check_link_status = 1; } - for (event_type = RTE_ETH_EVENT_UNKNOWN; - event_type < RTE_ETH_EVENT_MAX; - event_type++) { - diag = rte_eth_dev_callback_register(RTE_ETH_ALL, - event_type, - eth_event_callback, - NULL); - if (diag) { - printf("Failed to setup even callback for event %d\n", - event_type); - return -1; - } - } - if (need_check_link_status == 1 && !no_link_check) check_all_ports_link_status(RTE_PORT_ALL); else if (need_check_link_status == 0) @@ -2522,20 +2522,6 @@ static int eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, void *ret_param) { - static const char * const event_desc[] = { - [RTE_ETH_EVENT_UNKNOWN] = "Unknown", - [RTE_ETH_EVENT_INTR_LSC] = "LSC", - [RTE_ETH_EVENT_QUEUE_STATE] = "Queue state", - [RTE_ETH_EVENT_INTR_RESET] = "Interrupt reset", - [RTE_ETH_EVENT_VF_MBOX] = "VF Mbox", - [RTE_ETH_EVENT_IPSEC] = "IPsec", - [RTE_ETH_EVENT_MACSEC] = "MACsec", - [RTE_ETH_EVENT_INTR_RMV] = "device removal", - [RTE_ETH_EVENT_NEW] = "device probed", - [RTE_ETH_EVENT_DESTROY] = "device released", - [RTE_ETH_EVENT_MAX] = NULL, - }; - RTE_SET_USED(param); RTE_SET_USED(ret_param); @@ -2545,7 +2531,7 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, fflush(stderr); } else if (event_print_mask & (UINT32_C(1) << type)) { printf("\nPort %" PRIu16 ": %s event\n", port_id, - event_desc[type]); + eth_event_desc[type]); fflush(stdout); } @@ -2564,6 +2550,28 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, return 0; } +static int +register_eth_event_callback(void) +{ + int ret; + enum rte_eth_event_type event; + + for (event = RTE_ETH_EVENT_UNKNOWN; + event < RTE_ETH_EVENT_MAX; event++) { + ret = rte_eth_dev_callback_register(RTE_ETH_ALL, + event, + eth_event_callback, + NULL); + if (ret != 0) { + TESTPMD_LOG(ERR, "Failed to register callback for " + "%s event\n", eth_event_desc[event]); + return -1; + } + } + + return 0; +} + /* This function is used by the interrupt thread */ static void eth_dev_event_callback(const char *device_name, enum rte_dev_event_type type, @@ -3048,6 +3056,10 @@ main(int argc, char** argv) rte_panic("Cannot register log type"); rte_log_set_level(testpmd_logtype, RTE_LOG_DEBUG); + ret = register_eth_event_callback(); + if (ret != 0) + rte_panic("Cannot register for ethdev events"); + #ifdef RTE_LIBRTE_PDUMP /* initialize packet capture framework */ rte_pdump_init(NULL); From patchwork Wed Oct 24 13:41:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 47352 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 08CD46C9B; Wed, 24 Oct 2018 15:41:37 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 431E55592 for ; Wed, 24 Oct 2018 15:41:31 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id AC2D621F16; Wed, 24 Oct 2018 09:41:30 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Wed, 24 Oct 2018 09:41:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=mesmtp; bh=ys2q0K6BlC Hx2l0cmVaeSRgUF86VfXkgXHZvHqsN57Q=; b=FtcLTBKraYo4snABbmYC+X91RP qupKoBVgQIX7DJX1odrDtsLJet1BGAKq/Yqlqs1Th7HnVBlFiDMQ3fGxyEp0OdHt TRjD5XbtII52kRYCZ9JnxVC3tBayj4/QUjargVfkzrNfdlbnaJQO8Hdn4ctVNFTx hLnEa1r9VgZKRxX6o= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=ys2q0K6BlCHx2l0cmVaeSRgUF86VfXkgXHZvHqsN57Q=; b=JdT1u/RB gmQ44puPW3EFUiR5TMx/kNgMr1pgovnN7LQ6wKN2rLpBUNhkLZnoaO4ZAk0ZDzXO Tm9Fgku4ECdG+6fIOwMDD1Tn+rodsRhPkxXBo8bA0b2cXXcmJn9dubtJ5yDgdgmz S+ZwUYTs8v5kH9pD4uA6IFoguUgKuCcT30fGjeAJGEvdwwAzryfn5sGf3CzKbsVG /djLRAw4cX7QxKbQDq++RiM3Cs5pq1R57BoLerrNB4lfI8WFC+2RLW8ZRFRuePY+ FTWOMPgG96bYshP4VAzcIjK5/S80LiLqzmQT5YhdOR/Jqb6vcHOTjKsi4Bctb+Oo zbSS7cD/J0bGCw== X-ME-Sender: X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 662E6E4122; Wed, 24 Oct 2018 09:41:29 -0400 (EDT) From: Thomas Monjalon To: bernard.iremonger@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, ophirmu@mellanox.com, wisamm@mellanox.com, ferruh.yigit@intel.com, arybchenko@solarflare.com Date: Wed, 24 Oct 2018 15:41:11 +0200 Message-Id: <20181024134111.26771-6-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181024134111.26771-1-thomas@monjalon.net> References: <20181024134111.26771-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 5/5] app/testpmd: setup attached ports on probe event 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" After probing is done, each new port must be setup. The new ports are currently guessed by iterating on ports matching the devargs string used for probing. When probing a port, it is possible that one more port probing get triggered (e.g. PF is automatically probed when probing a VF representor). Such automatic probing will be caught only on event. The iterator loop may be replaced by a call from the event callback. In order to be able to test both modes, a command is added to choose between iterator and event modes. Signed-off-by: Thomas Monjalon --- app/test-pmd/cmdline.c | 57 +++++++++++++++++++++ app/test-pmd/testpmd.c | 27 ++++++++-- app/test-pmd/testpmd.h | 4 ++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 9 ++++ 4 files changed, 93 insertions(+), 4 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f041a01aa..148bd6366 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -280,6 +280,9 @@ static void cmd_help_long_parsed(void *parsed_result, "set portlist (x[,y]*)\n" " Set the list of forwarding ports.\n\n" + "set port setup on (iterator|event)\n" + " Select how attached port is retrieved for setup.\n\n" + "set tx loopback (port_id) (on|off)\n" " Enable or disable tx loopback.\n\n" @@ -1249,6 +1252,59 @@ cmdline_parse_inst_t cmd_operate_specific_port = { }, }; +/* *** enable port setup (after attach) via iterator or event *** */ +struct cmd_set_port_setup_on_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t port; + cmdline_fixed_string_t setup; + cmdline_fixed_string_t on; + cmdline_fixed_string_t mode; +}; + +static void cmd_set_port_setup_on_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_port_setup_on_result *res = parsed_result; + + if (strcmp(res->mode, "event") == 0) + setup_on_probe_event = true; + else if (strcmp(res->mode, "iterator") == 0) + setup_on_probe_event = false; + else + printf("Unknown mode\n"); +} + +cmdline_parse_token_string_t cmd_set_port_setup_on_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, + set, "set"); +cmdline_parse_token_string_t cmd_set_port_setup_on_port = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, + port, "port"); +cmdline_parse_token_string_t cmd_set_port_setup_on_setup = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, + setup, "setup"); +cmdline_parse_token_string_t cmd_set_port_setup_on_on = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, + on, "on"); +cmdline_parse_token_string_t cmd_set_port_setup_on_mode = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result, + mode, "iterator#event"); + +cmdline_parse_inst_t cmd_set_port_setup_on = { + .f = cmd_set_port_setup_on_parsed, + .data = NULL, + .help_str = "set port setup on iterator|event", + .tokens = { + (void *)&cmd_set_port_setup_on_set, + (void *)&cmd_set_port_setup_on_port, + (void *)&cmd_set_port_setup_on_setup, + (void *)&cmd_set_port_setup_on_on, + (void *)&cmd_set_port_setup_on_mode, + NULL, + }, +}; + /* *** attach a specified port *** */ struct cmd_operate_attach_port_result { cmdline_fixed_string_t port; @@ -17796,6 +17852,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_operate_specific_port, (cmdline_parse_inst_t *)&cmd_operate_attach_port, (cmdline_parse_inst_t *)&cmd_operate_detach_port, + (cmdline_parse_inst_t *)&cmd_set_port_setup_on, (cmdline_parse_inst_t *)&cmd_config_speed_all, (cmdline_parse_inst_t *)&cmd_config_speed_specific, (cmdline_parse_inst_t *)&cmd_config_loopback_all, diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 6eb416e7a..abecb58bf 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -345,6 +345,9 @@ uint8_t rmv_interrupt = 1; /* enabled by default */ uint8_t hot_plug = 0; /**< hotplug disabled by default. */ +/* After attach, port setup is called on event or by iterator */ +bool setup_on_probe_event = true; + /* Pretty printing of ethdev events */ static const char * const eth_event_desc[] = { [RTE_ETH_EVENT_UNKNOWN] = "unknown", @@ -2280,7 +2283,7 @@ reset_port(portid_t pid) void attach_port(char *identifier) { - portid_t pi = 0; + portid_t pi; struct rte_dev_iterator iterator; printf("Attaching a new port...\n"); @@ -2295,7 +2298,19 @@ attach_port(char *identifier) return; } + /* first attach mode: event */ + if (setup_on_probe_event) { + /* new ports are detected on RTE_ETH_EVENT_NEW event */ + for (pi = 0; pi < RTE_MAX_ETHPORTS; pi++) + if (ports[pi].port_status == RTE_PORT_HANDLING && + ports[pi].need_setup != 0) + setup_attached_port(pi); + return; + } + + /* second attach mode: iterator */ RTE_ETH_FOREACH_MATCHING_DEV(pi, identifier, &iterator) { + /* setup ports matching the devargs used for probing */ if (port_is_forwarding(pi)) continue; /* port was already attached before */ setup_attached_port(pi); @@ -2317,6 +2332,7 @@ setup_attached_port(portid_t pi) ports_ids[nb_ports++] = pi; fwd_ports_ids[nb_fwd_ports++] = pi; nb_cfg_ports = nb_fwd_ports; + ports[pi].need_setup = 0; ports[pi].port_status = RTE_PORT_STOPPED; printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports); @@ -2535,11 +2551,14 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, fflush(stdout); } - if (port_id_is_invalid(port_id, DISABLED_WARN)) - return 0; - switch (type) { + case RTE_ETH_EVENT_NEW: + ports[port_id].need_setup = 1; + ports[port_id].port_status = RTE_PORT_HANDLING; + break; case RTE_ETH_EVENT_INTR_RMV: + if (port_id_is_invalid(port_id, DISABLED_WARN)) + break; if (rte_eal_alarm_set(100000, rmv_event_callback, (void *)(intptr_t)port_id)) fprintf(stderr, "Could not set up deferred device removal\n"); diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 646e44940..28f13f630 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -5,6 +5,8 @@ #ifndef _TESTPMD_H_ #define _TESTPMD_H_ +#include + #include #include #include @@ -179,6 +181,7 @@ struct rte_port { uint8_t tx_queue_stats_mapping_enabled; uint8_t rx_queue_stats_mapping_enabled; volatile uint16_t port_status; /**< port started or not */ + uint8_t need_setup; /**< port just attached */ uint8_t need_reconfig; /**< need reconfiguring port or not */ uint8_t need_reconfig_queues; /**< need reconfiguring queues or not */ uint8_t rss_flag; /**< enable rss or not */ @@ -326,6 +329,7 @@ extern uint8_t lsc_interrupt; /**< disabled by "--no-lsc-interrupt" parameter */ extern uint8_t rmv_interrupt; /**< disabled by "--no-rmv-interrupt" parameter */ extern uint32_t event_print_mask; /**< set by "--print-event xxxx" and "--mask-event xxxx parameters */ +extern bool setup_on_probe_event; /**< disabled by port setup-on iterator */ extern uint8_t hot_plug; /**< enable by "--hot-plug" parameter */ extern int do_mlockall; /**< set by "--mlockall" or "--no-mlockall" parameter */ diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index d712bb657..8447f6c89 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -603,6 +603,15 @@ For example, to change the port forwarding: RX P=1/Q=0 (socket 0) -> TX P=3/Q=0 (socket 0) peer=02:00:00:00:00:03 RX P=3/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:02 +set port setup on +~~~~~~~~~~~~~~~~~ + +Select how to retrieve new ports created after "port attach" command. + +For each new port, a setup is done. +It will find the probed ports via RTE_ETH_FOREACH_MATCHING_DEV loop +in iterator mode, or via RTE_ETH_EVENT_NEW in event mode. + set tx loopback ~~~~~~~~~~~~~~~