From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-eopbgr30057.outbound.protection.outlook.com [40.107.3.57]) by dpdk.org (Postfix) with ESMTP id 558A637B7 for ; Tue, 28 Nov 2017 12:58:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=JetxVRdI3HKX7AXSUAPe5ElZxBAAOMa5YyFKWb30WS0=; b=AyEYV19bX5c9vElJBWVTcU3R782kX784krredzGKkltUeImIMSrXow83Z1VAQHS0bq4AqQv6VTKDQz/IHGw90RxA5F/kbU3m9/vVC+YFy0brUzsMZxUS8QVWEVXMgxk7rT1BBaS+kA8iPITLqckuNcb4SjZpn2hoZvWz7YNwEYY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=matan@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR0502MB3663.eurprd05.prod.outlook.com (2603:10a6:803:f::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.4; Tue, 28 Nov 2017 11:58:29 +0000 From: Matan Azrad To: Thomas Monjalon , Gaetan Rivet , Jingjing Wu Cc: dev@dpdk.org Date: Tue, 28 Nov 2017 11:58:01 +0000 Message-Id: <1511870281-15282-6-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1511870281-15282-1-git-send-email-matan@mellanox.com> References: <1511870281-15282-1-git-send-email-matan@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR0801CA0078.eurprd08.prod.outlook.com (2603:10a6:800:7d::22) To VI1PR0502MB3663.eurprd05.prod.outlook.com (2603:10a6:803:f::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b7d5ab8d-09d0-429a-2766-08d5365757d4 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603258); SRVR:VI1PR0502MB3663; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3663; 3:jUPvbEaj/DrXqwO5Cwej7TVvvbc9IPLT76/QvwoQxbZPo5AJQvkUmjLSyXZtZGPh2AwdiOeh/aDQ/1i4hsK1Pmov0xKDqN15sC5evk7RQl8N8CDoLv1WqVNTv3sRfIxFfSOVQKVrkGnTycaUqQljR4ugpcm2gbSVOMZMpHdKnp899chjmyMmjPfdnVwFhPEHj11Hheqvf5cFB50n02IupCI0cjwrdvPOp6/tWIhnvAzZcEHjx2FMRrCv9FzLAt4b; 25:qENURzUjIdtXGeceCZYS8SL4LzqtvLMs+Ds00iqUpic4rghSIJ2wbGw0W80t5FlDZ6VnpwZcaXNssbvFzNkwkFkA0vmdMWV93qAwVtMI0ltIV2BHte8FHAqL0nHFRWEi3zb7nY3bAMh8EHceSzAj0SS2N5JGdq3lyPbkqpD1gcY6lWD0P21W959yeju9uuiyZfmK5bgxQqqZjWHZHegFKDP27U5qmknjMnaSmbtnd58cFHwHV0HimrDyPPnv6i9kn7XvcdU14hPNP5y7SUi1Po2iSrPjYnXvCK5N7a0eUvZZbhKjEOWBwcmjfo5WXJ/2uJP0t9NBML8atG05maH42pfsGKfmDS2b0A36oNJXNOU=; 31:GI50U+baPy9Yh1dC0ggHf1SpoPIBxxlj61/VmOlesgzi7MgQMYMBVT635yKeC/koqeAcshoCrL43MiHQYHtvVx19aNbb/XO35qQoR5hmRBVaekC0YCDhTeMqSYtOZWx9IF7DZTN5bBCrPtSVAKuPnIBp9tpW8Sj/7k7dkXFtgwTzrHwrLMwvqiAcTQPFv7LEndKslKMiUe6+XXI3RxP9kJh2C7PU1nvypnxB4UwzLy4= X-MS-TrafficTypeDiagnostic: VI1PR0502MB3663: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3663; 20:eexhG9mW9oNE6qyJjUpsVvZQLPamEBUJORGraGHYbbteGN8PxjDoWNvq357ZcxgNiilf91K8XQBwtxaDCjTT/kCaoEDjzn8Oahlg6CEQn+l2LhfUn70H8TlrnjNGXloNlmOk+cVrzWPoosQg81t6JveXKEKCS0H/3v8xKaaMYDVhBMZk37t+TY/NGlZqgHpAqLVpK9KIgBxAYtYqLEuwp1dX+iXBZWyqksylRnYeZMAXXTuPtjkd04iGSjD6y4nLmU9rwJQUIfJD2XuLMWIiKqNZ+87eAvztu4PDlbeESLRaNo5j1f1eN8bqviaBZEI43o5C0b+ZA+fUaOuaJKN5oATYQBxUFnrveiYlDF/CZv2B/nEdIZIH8Vr128Wun+sIPX4QO2bBRlM3GckeNeIgpMme91arjFRaGE/3D7Xl0/cwAifuerHJ7/svhYSO70Qcs3N7gYdO2Qlqb2n/T6091BlhUr9pvb0kXD4OCzh/k5+L40dGHZgr5UtRiYfyxRfO; 4:fIdYjjNDqDh137U+v5V5B6CXs2K19jC/XX7JXIupLI56aVmoaXYeflDgkfqRkoE77mOYL4A0l/AUTypoqoVRKBJUBB9+XuuZTujd67P1BZXLBQkVyzBDtAOgQ23K6DWS0s4D4V+wbm+PyF1i1yh1pwx86XPhqJ2g+Axnj7meiUxYCPh6nZ1QxTYCO2lO9QAXxLOmIt+AMZKbAhNxDZrEQuZ7i9AxHK9B5HlUQFPq3nbE77CjVeLF6lsf33cMMUPknGz1YLJJUBqPGHsXNx+y33vwn+acWMln0/0LgA7QuoLACrWIzJIL9uE1NltgyTK9 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(60795455431006); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(3231022)(6055026)(6041248)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123560025)(6072148)(201708071742011); SRVR:VI1PR0502MB3663; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0502MB3663; X-Forefront-PRVS: 0505147DDB X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(979002)(6009001)(376002)(39860400002)(346002)(366004)(199003)(189002)(4720700003)(50226002)(189998001)(8936002)(3846002)(97736004)(110136005)(5890100001)(2950100002)(6666003)(6116002)(47776003)(316002)(5660300001)(16586007)(50986999)(105586002)(305945005)(76176999)(16526018)(106356001)(66066001)(21086003)(81156014)(69596002)(48376002)(50466002)(101416001)(4326008)(52116002)(55016002)(7696005)(25786009)(2906002)(51416003)(8676002)(33646002)(53936002)(68736007)(36756003)(86362001)(478600001)(33026002)(7736002)(81166006)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0502MB3663; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0502MB3663; 23:bCQ4COhgmSzMt7jjEwfXC/ap4QWzsZQzWTehCnN?= =?us-ascii?Q?YCnXI8yvjKSGX1Vp69/1M9NkNcWIU3FEaTpMVoeku4SJIHe50JYxvqi/+/5I?= =?us-ascii?Q?JApA+Ag4kNuICa/g5sYly6O9QehYqUmw5RGmhgyC+UELBwNRjFgg+wSj6Z8a?= =?us-ascii?Q?htq9QNXh2GfJhGgAz4tIonFnmjR1Qg6UovJLMLSHpqBFhCpIXj2iaMtPy0ab?= =?us-ascii?Q?nxRgk+IfRvZ350NNNNz3ySFzbOmOFm3Pm0IIxzm6aYQrdpWFPyN3StjUkU9R?= =?us-ascii?Q?POaRtC1oeJe+pjor6jnPybkJgylQgeX+leNPa5anUTImDs8e2t57gi0JNaQO?= =?us-ascii?Q?htYPZqmyRCX+ynjZyOCuz7SKHhO4GW9TlokHZ4ztAlKZOuaL2zqamAGb5vHz?= =?us-ascii?Q?sifvjbyz/A1Prqr/tZPa2ruw6/nfTtsaJpqreN/OXN992v5L3hk/GQA6Hj+z?= =?us-ascii?Q?l+LuifAQMXy1+RFfeR/LIqle3PzNV5sDRosJzv4anGuwBg1gF3cw8iS6g5Za?= =?us-ascii?Q?0DtCNAitJfkQP2jC2HtHaNm14w2FpOEOyGSRmPU3p8xPZKP3nISJkkJBa011?= =?us-ascii?Q?lAQAQsVQdqg3BaJ4FmYk1aJ3zxr1tU9TNGRtwAk+/vzPDc1fFI0txJcYEu99?= =?us-ascii?Q?1eG5x9lFzvymDcGbfkH5xMwH8nN/ds1q2x0Pj2hdi/3GUOBiw4KL22vnplC3?= =?us-ascii?Q?16m9BdWDYNo7YWEm537LkPgE1Qgzq1ebVYQRXERCILdnGJZI1syps0FqH1Fv?= =?us-ascii?Q?MREnGDmNlRULzKRbuKBPr8dRdlbTB5+jZW8lhE+iRdmXqXM43vi5XKnfAENa?= =?us-ascii?Q?sv1tKUXz0/MoKKt+rYgAeCoWfDqbzgAeLvPh5/HGC6ZOyrQ+bJIAFN7FBexI?= =?us-ascii?Q?GDCtzMdocWdYL5EUxBpTsrSwSaYRfGOEOnYH3sLdQyI/u9bZsRWD8G3rZ7kn?= =?us-ascii?Q?pURbQp4HL22/6mLXCUdwhkwDwUkDiqljDppdBXG/Tl5+c75P/uxJjg7AmR+7?= =?us-ascii?Q?VaZ8SBRDb7M1bcFVw7gXHl3Qmxh6qi/0TJUmtG9QQlJxltht5DJU1d99Rwg4?= =?us-ascii?Q?xsl8XEHXwiG2sWGnBGB79xpQTixXQ+cKfCYHo0mkH7W2Bp8HcHqtkXTZPl1g?= =?us-ascii?Q?Bpxj30MglaDE++gmq6qkmy2RU949iQd2Z1fguIGQzTsfLb+IjKfqOCcvUzby?= =?us-ascii?Q?4bw4QY4sVjkCOvoiGA4GgT4aBWGvP3wtp+Ot8e8dgFf0QetnNyn/Al6+HJQn?= =?us-ascii?Q?y68rvEcfgP3XCFRiOh7+8Wp09TKwbiPTX4gCMXA7aa5TZ820apColN/k0l4D?= =?us-ascii?Q?HceUBOv1N35FTGVA4n+v54Jw=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3663; 6:2H9NaCUgKKvNq3s/3rlwnPxIsa38pTiOCIGqxihPRz69VKztbgGvD1ocvx2fr5N7qkO41NgvrJ+Soo/7h8bKiHh9dgrh1p/odYQRdjfnE6QttvakzRSrPHDmnY+Wcc/v0MRJftQ8i6rRaDrNOVVOIxHkyTl0QCawhpELWOP5TUbDLSLOSmtqbuornF1HWErqlVYSbgJRbP9UNJJzCP4JezUuQbtojTWig2ThAwTHULaPMnt3lVTvgm8pmn1ZjhK/TKPvZzMxNLXMrKqZ6K4FU5tfhkrxY5VcXCm222hi83lnhCdjbKSHbt+WQ0fARF8OPYcLNHKsNx3mXoHV30PJ9AOz2vKt1LwbxWX/xCY3v+Q=; 5:ypE2EaNOE3Gfbdq7w639FfKWpvl/GK6z+OTAuSEWDSCeSOuqmLcaU9tXr2MdDc9Pfz+53dCFjXqcF4CiRAmlzVyqTAm4UjPSZwnEaoFRs83AeVYgq+nOImBhH3UqjpDu2AFhsWWJD1k2lA3GVS1KilbBL1GKcbu0iZ2dGCnro68=; 24:BvByvbfahQgQvC2GPTX9gCWcZavs4cM/3YncS3IvxlhPjv9qWRemxUzQWY7fpZ4pW5VEyt2Z8rP/T7w2BtMufFJL6oDwAkCStupctFMdSF8=; 7:AJjI657oXtQUO5QU626QPnA32MEYVntQQPVxacNx7YwQzHxr0GTNzYAk3prB0Pdz804PcGmLMJnpUGYW+vW+nG7VnouQDORuE0f7G453extV0G2erVIhy8O3GAIS2g+N68NXTBm1i+koCbfKN5aF9Z7BZhRLCagn77G6BiMilDQzwXOhVSV4cl51JVWqRWJQff7MM5RYhw/LsSQ/D9p767Z7pKVHASL9Kz+FH2vk7IPpVDPgmDaIRiXWYZp5RFWT SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Nov 2017 11:58:29.9806 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b7d5ab8d-09d0-429a-2766-08d5365757d4 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB3663 Subject: [dpdk-dev] [PATCH 5/5] app/testpmd: adjust ethdev port ownership 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: Tue, 28 Nov 2017 11:58:32 -0000 Testpmd should not use ethdev ports which are managed by other DPDK entities. Set Testpmd ownership to each port which is not used by other entity and prevent any usage of ethdev ports which are not owned by Testpmd. Signed-off-by: Matan Azrad --- app/test-pmd/cmdline.c | 100 +++++++++++++++++++++++++++----------------- app/test-pmd/cmdline_flow.c | 2 +- app/test-pmd/config.c | 40 +++++++++++------- app/test-pmd/parameters.c | 4 +- app/test-pmd/testpmd.c | 65 ++++++++++++++++++---------- app/test-pmd/testpmd.h | 3 ++ 6 files changed, 135 insertions(+), 79 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f71d963..2878cfc 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -1357,7 +1357,7 @@ struct cmd_config_speed_all { &link_speed) < 0) return; - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { ports[pid].dev_conf.link_speeds = link_speed; } @@ -1851,7 +1851,7 @@ struct cmd_config_rss { struct cmd_config_rss *res = parsed_result; struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, }; int diag; - uint8_t i; + uint16_t pid; if (!strcmp(res->value, "all")) rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | @@ -1885,12 +1885,12 @@ struct cmd_config_rss { return; } rss_conf.rss_key = NULL; - for (i = 0; i < rte_eth_dev_count(); i++) { - diag = rte_eth_dev_rss_hash_update(i, &rss_conf); + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { + diag = rte_eth_dev_rss_hash_update(pid, &rss_conf); if (diag < 0) printf("Configuration of RSS hash at ethernet port %d " "failed with error (%d): %s.\n", - i, -diag, strerror(-diag)); + pid, -diag, strerror(-diag)); } } @@ -4281,9 +4281,11 @@ struct cmd_gso_show_result { __attribute__((unused)) void *data) { struct cmd_gso_show_result *res = parsed_result; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->cmd_pid); - if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { - printf("invalid port id %u\n", res->cmd_pid); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->cmd_pid); return; } if (!strcmp(res->cmd_keyword, "gso")) { @@ -5293,7 +5295,12 @@ static void cmd_create_bonded_device_parsed(void *parsed_result, port_id); /* Update number of ports */ - nb_ports = rte_eth_dev_count(); + if (rte_eth_dev_owner_set(port_id, &my_owner) != 0) { + printf("Error: cannot own new attached port %d\n", + port_id); + return; + } + nb_ports++; reconfig(port_id, res->socket); rte_eth_promiscuous_enable(port_id); } @@ -5401,9 +5408,11 @@ static void cmd_set_bond_mon_period_parsed(void *parsed_result, { struct cmd_set_bond_mon_period_result *res = parsed_result; int ret; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_num); - if (res->port_num >= nb_ports) { - printf("Port id %d must be less than %d\n", res->port_num, nb_ports); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_num); return; } @@ -5462,10 +5471,11 @@ struct cmd_set_bonding_agg_mode_policy_result { { struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result; uint8_t policy = AGG_BANDWIDTH; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_num); - if (res->port_num >= nb_ports) { - printf("Port id %d must be less than %d\n", - res->port_num, nb_ports); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_num); return; } @@ -5726,7 +5736,7 @@ static void cmd_set_promisc_mode_parsed(void *parsed_result, /* all ports */ if (allports) { - RTE_ETH_FOREACH_DEV(i) { + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) { if (enable) rte_eth_promiscuous_enable(i); else @@ -5806,7 +5816,7 @@ static void cmd_set_allmulti_mode_parsed(void *parsed_result, /* all ports */ if (allports) { - RTE_ETH_FOREACH_DEV(i) { + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) { if (enable) rte_eth_allmulticast_enable(i); else @@ -6540,31 +6550,31 @@ static void cmd_showportall_parsed(void *parsed_result, struct cmd_showportall_result *res = parsed_result; if (!strcmp(res->show, "clear")) { if (!strcmp(res->what, "stats")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) nic_stats_clear(i); else if (!strcmp(res->what, "xstats")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) nic_xstats_clear(i); } else if (!strcmp(res->what, "info")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) port_infos_display(i); else if (!strcmp(res->what, "stats")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) nic_stats_display(i); else if (!strcmp(res->what, "xstats")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) nic_xstats_display(i); else if (!strcmp(res->what, "fdir")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) fdir_get_infos(i); else if (!strcmp(res->what, "stat_qmap")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) nic_stats_mapping_display(i); else if (!strcmp(res->what, "dcb_tc")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) port_dcb_info_display(i); else if (!strcmp(res->what, "cap")) - RTE_ETH_FOREACH_DEV(i) + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) port_offload_cap_display(i); } @@ -10483,9 +10493,11 @@ struct cmd_flow_director_mask_result { struct cmd_flow_director_mask_result *res = parsed_result; struct rte_eth_fdir_masks *mask; struct rte_port *port; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -10684,9 +10696,11 @@ struct cmd_flow_director_flex_mask_result { uint32_t flow_type_mask; uint16_t i; int ret; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -10840,9 +10854,11 @@ struct cmd_flow_director_flexpayload_result { struct rte_eth_flex_payload_cfg flex_cfg; struct rte_port *port; int ret = 0; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -11560,7 +11576,7 @@ struct cmd_config_l2_tunnel_eth_type_result { entry.l2_tunnel_type = str2fdir_l2_tunnel_type(res->l2_tunnel_type); entry.ether_type = res->eth_type_val; - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { rte_eth_dev_l2_tunnel_eth_type_conf(pid, &entry); } } @@ -11676,7 +11692,7 @@ struct cmd_config_l2_tunnel_en_dis_result { else en = 0; - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { rte_eth_dev_l2_tunnel_offload_set(pid, &entry, ETH_L2_TUNNEL_ENABLE_MASK, @@ -14202,9 +14218,11 @@ struct cmd_ddp_add_result { char *file_fld[2]; int file_num; int ret = -ENOTSUP; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -14284,9 +14302,11 @@ struct cmd_ddp_del_result { uint8_t *buff; uint32_t size; int ret = -ENOTSUP; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -14599,9 +14619,11 @@ struct cmd_ddp_get_list_result { uint32_t i; #endif int ret = -ENOTSUP; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(res->port_id); - if (res->port_id > nb_ports) { - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", res->port_id); return; } @@ -15821,7 +15843,7 @@ struct cmd_cmdfile_result { if (id == (portid_t)RTE_PORT_ALL) { portid_t pid; - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { /* check if need_reconfig has been set to 1 */ if (ports[pid].need_reconfig == 0) ports[pid].need_reconfig = dev; diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index df16d2a..bc2a16b 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -2621,7 +2621,7 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *, (void)ctx; (void)token; - RTE_ETH_FOREACH_DEV(p) { + RTE_ETH_FOREACH_DEV_OWNED_BY(p, my_owner.id) { if (buf && i == ent) return snprintf(buf, size, "%u", p); ++i; diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index cd2ac11..6da471e 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -155,7 +155,7 @@ struct rss_type_info { if (port_id_is_invalid(port_id, ENABLED_WARN)) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return; @@ -235,7 +235,7 @@ struct rss_type_info { if (port_id_is_invalid(port_id, ENABLED_WARN)) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return; @@ -250,10 +250,11 @@ struct rss_type_info { struct rte_eth_xstat *xstats; int cnt_xstats, idx_xstat; struct rte_eth_xstat_name *xstats_names; + const struct rte_eth_dev_owner *owner = rte_eth_dev_owner_get(port_id); printf("###### NIC extended statistics for port %-2d\n", port_id); - if (!rte_eth_dev_is_valid_port(port_id)) { - printf("Error: Invalid port number %i\n", port_id); + if (owner == NULL || owner->id != my_owner.id) { + printf("Error: invalid/not owned port number %i\n", port_id); return; } @@ -320,7 +321,7 @@ struct rss_type_info { if (port_id_is_invalid(port_id, ENABLED_WARN)) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return; @@ -439,7 +440,7 @@ struct rss_type_info { if (port_id_is_invalid(port_id, ENABLED_WARN)) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return; @@ -727,7 +728,10 @@ struct rss_type_info { if (port_id == (portid_t)RTE_PORT_ALL) return 0; - if (rte_eth_dev_is_valid_port(port_id)) + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(port_id); + + if (owner != NULL && owner->id == my_owner.id) return 0; if (warning == ENABLED_WARN) @@ -2309,7 +2313,7 @@ struct igb_ring_desc_16_bytes { return; } nb_pt = 0; - RTE_ETH_FOREACH_DEV(i) { + RTE_ETH_FOREACH_DEV_OWNED_BY(i, my_owner.id) { if (! ((uint64_t)(1ULL << i) & portmask)) continue; portlist[nb_pt++] = i; @@ -2448,8 +2452,11 @@ struct igb_ring_desc_16_bytes { void setup_gro(const char *onoff, portid_t port_id) { - if (!rte_eth_dev_is_valid_port(port_id)) { - printf("invalid port id %u\n", port_id); + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(port_id); + + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", port_id); return; } if (test_done == 0) { @@ -2507,11 +2514,13 @@ struct igb_ring_desc_16_bytes { { struct rte_gro_param *param; uint32_t max_pkts_num; + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(port_id); param = &gro_ports[port_id].param; - if (!rte_eth_dev_is_valid_port(port_id)) { - printf("Invalid port id %u.\n", port_id); + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", port_id); return; } if (gro_ports[port_id].enable) { @@ -2531,8 +2540,11 @@ struct igb_ring_desc_16_bytes { void setup_gso(const char *mode, portid_t port_id) { - if (!rte_eth_dev_is_valid_port(port_id)) { - printf("invalid port id %u\n", port_id); + const struct rte_eth_dev_owner *owner = + rte_eth_dev_owner_get(port_id); + + if (owner == NULL || owner->id != my_owner.id) { + printf("invalid/not owned port id %u\n", port_id); return; } if (strcmp(mode, "on") == 0) { diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index 84e7a63..63c533c 100644 --- a/app/test-pmd/parameters.c +++ b/app/test-pmd/parameters.c @@ -428,7 +428,7 @@ if (port_id_is_invalid(port_id, ENABLED_WARN) || port_id == (portid_t)RTE_PORT_ALL) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return -1; @@ -489,7 +489,7 @@ if (port_id_is_invalid(port_id, ENABLED_WARN) || port_id == (portid_t)RTE_PORT_ALL) { printf("Valid port range is [0"); - RTE_ETH_FOREACH_DEV(pid) + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) printf(", %d", pid); printf("]\n"); return -1; diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index c3ab448..a687c80 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -136,6 +136,11 @@ lcoreid_t nb_lcores; /**< Number of probed logical cores. */ /* + * My port owner structure used to own Ethernet ports. + */ +struct rte_eth_dev_owner my_owner; /**< Unique owner. */ + +/* * Test Forwarding Configuration. * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores * nb_fwd_ports <= nb_cfg_ports <= nb_ports @@ -483,7 +488,7 @@ static int eth_event_callback(portid_t port_id, portid_t pt_id; int i = 0; - RTE_ETH_FOREACH_DEV(pt_id) + RTE_ETH_FOREACH_DEV_OWNED_BY(pt_id, my_owner.id) fwd_ports_ids[i++] = pt_id; nb_cfg_ports = nb_ports; @@ -607,7 +612,7 @@ static int eth_event_callback(portid_t port_id, fwd_lcores[lc_id]->cpuid_idx = lc_id; } - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { port = &ports[pid]; rte_eth_dev_info_get(pid, &port->dev_info); @@ -733,7 +738,7 @@ static int eth_event_callback(portid_t port_id, queueid_t q; /* set socket id according to numa or not */ - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { port = &ports[pid]; if (nb_rxq > port->dev_info.max_rx_queues) { printf("Fail: nb_rxq(%d) is greater than " @@ -1027,9 +1032,8 @@ static int eth_event_callback(portid_t port_id, uint64_t tics_per_1sec; uint64_t tics_datum; uint64_t tics_current; - uint8_t idx_port, cnt_ports; + uint16_t idx_port; - cnt_ports = rte_eth_dev_count(); tics_datum = rte_rdtsc(); tics_per_1sec = rte_get_timer_hz(); #endif @@ -1044,11 +1048,10 @@ static int eth_event_callback(portid_t port_id, tics_current = rte_rdtsc(); if (tics_current - tics_datum >= tics_per_1sec) { /* Periodic bitrate calculation */ - for (idx_port = 0; - idx_port < cnt_ports; - idx_port++) + RTE_ETH_FOREACH_DEV_OWNED_BY(idx_port, + my_owner.id) rte_stats_bitrate_calc(bitrate_data, - idx_port); + idx_port); tics_datum = tics_current; } } @@ -1386,7 +1389,7 @@ static int eth_event_callback(portid_t port_id, portid_t pi; struct rte_port *port; - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { port = &ports[pi]; /* Check if there is a port which is not started */ if ((port->port_status != RTE_PORT_STARTED) && @@ -1404,7 +1407,7 @@ static int eth_event_callback(portid_t port_id, portid_t pi; struct rte_port *port; - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { port = &ports[pi]; if ((port->port_status != RTE_PORT_STOPPED) && (port->slave_flag == 0)) @@ -1453,7 +1456,7 @@ static int eth_event_callback(portid_t port_id, if(dcb_config) dcb_test = 1; - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { if (pid != pi && pid != (portid_t)RTE_PORT_ALL) continue; @@ -1634,7 +1637,7 @@ static int eth_event_callback(portid_t port_id, printf("Stopping ports...\n"); - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { if (pid != pi && pid != (portid_t)RTE_PORT_ALL) continue; @@ -1677,7 +1680,7 @@ static int eth_event_callback(portid_t port_id, printf("Closing ports...\n"); - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { if (pid != pi && pid != (portid_t)RTE_PORT_ALL) continue; @@ -1728,7 +1731,7 @@ static int eth_event_callback(portid_t port_id, printf("Resetting ports...\n"); - RTE_ETH_FOREACH_DEV(pi) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { if (pid != pi && pid != (portid_t)RTE_PORT_ALL) continue; @@ -1773,6 +1776,12 @@ static int eth_event_callback(portid_t port_id, if (rte_eth_dev_attach(identifier, &pi)) return; + if (rte_eth_dev_owner_set(pi, &my_owner) != 0) { + printf("Error: cannot own new attached port %d\n", pi); + return; + } + nb_ports++; + socket_id = (unsigned)rte_eth_dev_socket_id(pi); /* if socket_id is invalid, set to 0 */ if (check_socket_id(socket_id) < 0) @@ -1780,8 +1789,6 @@ static int eth_event_callback(portid_t port_id, reconfig(pi, socket_id); rte_eth_promiscuous_enable(pi); - nb_ports = rte_eth_dev_count(); - ports[pi].port_status = RTE_PORT_STOPPED; printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports); @@ -1792,9 +1799,16 @@ static int eth_event_callback(portid_t port_id, detach_port(portid_t port_id) { char name[RTE_ETH_NAME_MAX_LEN]; + const struct rte_eth_dev_owner *owner = rte_eth_dev_owner_get(port_id); printf("Detaching a port...\n"); + if (owner == NULL || owner->id != my_owner.id) { + printf("Failed to detach invalid/not owned port id %u\n", + port_id); + return; + } + if (!port_is_closed(port_id)) { printf("Please close port first\n"); return; @@ -1808,7 +1822,7 @@ static int eth_event_callback(portid_t port_id, return; } - nb_ports = rte_eth_dev_count(); + nb_ports--; printf("Port '%s' is detached. Now total ports is %d\n", name, nb_ports); @@ -1826,7 +1840,7 @@ static int eth_event_callback(portid_t port_id, if (ports != NULL) { no_link_check = 1; - RTE_ETH_FOREACH_DEV(pt_id) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pt_id, my_owner.id) { printf("\nShutting down port %d...\n", pt_id); fflush(stdout); stop_port(pt_id); @@ -1858,7 +1872,7 @@ struct pmd_test_command { fflush(stdout); for (count = 0; count <= MAX_CHECK_TIME; count++) { all_ports_up = 1; - RTE_ETH_FOREACH_DEV(portid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(portid, my_owner.id) { if ((port_mask & (1 << portid)) == 0) continue; memset(&link, 0, sizeof(link)); @@ -2083,7 +2097,7 @@ struct pmd_test_command { portid_t pid; struct rte_port *port; - RTE_ETH_FOREACH_DEV(pid) { + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { port = &ports[pid]; port->dev_conf.rxmode = rx_mode; port->dev_conf.fdir_conf = fdir_conf; @@ -2394,7 +2408,12 @@ uint8_t port_is_bonding_slave(portid_t slave_pid) rte_pdump_init(NULL); #endif - nb_ports = (portid_t) rte_eth_dev_count(); + if (rte_eth_dev_owner_new(&my_owner.id)) + rte_panic("Failed to get unique owner identifier\n"); + snprintf(my_owner.name, sizeof(my_owner.name), TESTPMD_OWNER_NAME); + RTE_ETH_FOREACH_DEV_OWNED_BY(port_id, RTE_ETH_DEV_NO_OWNER) + if (rte_eth_dev_owner_set(port_id, &my_owner) == 0) + nb_ports++; if (nb_ports == 0) RTE_LOG(WARNING, EAL, "No probed ethernet devices\n"); @@ -2442,7 +2461,7 @@ uint8_t port_is_bonding_slave(portid_t slave_pid) rte_exit(EXIT_FAILURE, "Start ports failed\n"); /* set all ports to promiscuous mode by default */ - RTE_ETH_FOREACH_DEV(port_id) + RTE_ETH_FOREACH_DEV_OWNED_BY(port_id, my_owner.id) rte_eth_promiscuous_enable(port_id); /* Init metrics library */ diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 1639d27..7db7d72 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -79,6 +79,8 @@ #define NUMA_NO_CONFIG 0xFF #define UMA_NO_CONFIG 0xFF +#define TESTPMD_OWNER_NAME "TestPMD" + typedef uint8_t lcoreid_t; typedef uint16_t portid_t; typedef uint16_t queueid_t; @@ -409,6 +411,7 @@ struct queue_stats_mappings { * nb_fwd_ports <= nb_cfg_ports <= nb_ports */ extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ +extern struct rte_eth_dev_owner my_owner; /**< Unique owner. */ extern portid_t nb_cfg_ports; /**< Number of configured ports. */ extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; -- 1.8.3.1