From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00085.outbound.protection.outlook.com [40.107.0.85]) by dpdk.org (Postfix) with ESMTP id 899EE1B03C for ; Fri, 19 Jan 2018 13:51:40 +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=FGdto/6tKVd8Wg6cMdKFA80QdDlZDYiO0uR+hQ8sMA0=; b=yeJLvw07fMl2VADcSo81OrzvySvmJ9NwoNz3WCpBl70wpBlR+1qsY1Dcj3IqSd9d3g3uZ5HiRQay1LjeqQaIWQJXYwAIh6qzJX91Aut2wC6uXR4wkDISIPz5+AFvWBOGJfaKuOYZkvipKrdZPvVl/niLNM9qqSARDjOLRm8FDV8= Received: from AM6PR0502MB3797.eurprd05.prod.outlook.com (52.133.21.26) by AM6PR0502MB3766.eurprd05.prod.outlook.com (52.133.21.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.428.17; Fri, 19 Jan 2018 12:51:36 +0000 Received: from AM6PR0502MB3797.eurprd05.prod.outlook.com ([fe80::6c28:c6b3:de94:a733]) by AM6PR0502MB3797.eurprd05.prod.outlook.com ([fe80::6c28:c6b3:de94:a733%13]) with mapi id 15.20.0428.014; Fri, 19 Jan 2018 12:51:36 +0000 From: Matan Azrad To: "Ananyev, Konstantin" , Thomas Monjalon , Gaetan Rivet , "Wu, Jingjing" CC: "dev@dpdk.org" , Neil Horman , "Richardson, Bruce" Thread-Topic: [PATCH v3 7/7] app/testpmd: adjust ethdev port ownership Thread-Index: AQHTkSJSs9wv4iQCB0Cv+2LP7vySOKN7IsfQ Date: Fri, 19 Jan 2018 12:51:35 +0000 Message-ID: References: <1515318351-4756-1-git-send-email-matan@mellanox.com> <1516293317-30748-1-git-send-email-matan@mellanox.com> <1516293317-30748-8-git-send-email-matan@mellanox.com> <2601191342CEEE43887BDE71AB97725886280A68@irsmsx105.ger.corp.intel.com> In-Reply-To: <2601191342CEEE43887BDE71AB97725886280A68@irsmsx105.ger.corp.intel.com> Accept-Language: en-US, he-IL Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=matan@mellanox.com; x-originating-ip: [85.64.136.190] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM6PR0502MB3766; 7:WUIWj+alOuzYH23ASajyVWG1WE8APIlqWjTs3L8cJJfmD6hZnwEj3+TAZHn1RqAhFc/4Wcn4Hd3NcEAYDA7AzkU/Qv0aekezq7mhDgH/RbZ0dNx8EuUuyHKEeytphBZuVS7E0GPNHYzFlWnqpQ4/sKhdLEWHTsC03DTSGn07UcnEf7m0RRqLn5dhuB5YcpPPVN4VK8gQmp4fZuEZ+E/V3BDFKpEdOmqJxK69r2aveU851ChS20Cjbk0ZuxGnrm+l x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-correlation-id: 2fb6a33f-b32e-46a0-586d-08d55f3b6036 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(3008032)(48565401081)(2017052603307)(7153060)(7193020); SRVR:AM6PR0502MB3766; x-ms-traffictypediagnostic: AM6PR0502MB3766: x-ld-processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(60795455431006)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(5005006)(8121501046)(3002001)(3231023)(2400077)(944501161)(93006095)(93001095)(10201501046)(6055026)(6041268)(20161123558120)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(6072148)(201708071742011); SRVR:AM6PR0502MB3766; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:AM6PR0502MB3766; x-forefront-prvs: 0557CBAD84 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(376002)(346002)(39380400002)(39860400002)(366004)(396003)(57704003)(13464003)(199004)(189003)(3846002)(6116002)(3660700001)(66066001)(305945005)(7736002)(3280700002)(7696005)(26005)(2900100001)(99286004)(93886005)(86362001)(14454004)(68736007)(5660300001)(2906002)(76176011)(59450400001)(55016002)(25786009)(9686003)(4326008)(6246003)(106356001)(53936002)(8676002)(81156014)(5890100001)(8936002)(53546011)(53946003)(2950100002)(33656002)(81166006)(5250100002)(102836004)(54906003)(110136005)(97736004)(316002)(105586002)(229853002)(74316002)(6506007)(478600001)(6436002)(559001)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM6PR0502MB3766; H:AM6PR0502MB3797.eurprd05.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:3; LANG:en; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: B0/a6ACSkTbMQVvJWfqVZXOVaFrJiSGAMc/4pH5KC8EJ2abNbRJI3WvYTlEY47KPwC9C18/KN8tJ6QXY3rtdxg== spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2fb6a33f-b32e-46a0-586d-08d55f3b6036 X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Jan 2018 12:51:36.1551 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR0502MB3766 Subject: Re: [dpdk-dev] [PATCH v3 7/7] 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: Fri, 19 Jan 2018 12:51:40 -0000 Hi Konstantin From: Ananyev, Konstantin, Friday, January 19, 2018 2:38 PM > To: Matan Azrad ; Thomas Monjalon > ; Gaetan Rivet ; Wu, > Jingjing > Cc: dev@dpdk.org; Neil Horman ; Richardson, > Bruce > Subject: RE: [PATCH v3 7/7] app/testpmd: adjust ethdev port ownership >=20 > Hi Matan, >=20 > > -----Original Message----- > > From: Matan Azrad [mailto:matan@mellanox.com] > > Sent: Thursday, January 18, 2018 4:35 PM > > To: Thomas Monjalon ; Gaetan Rivet > > ; Wu, Jingjing > > Cc: dev@dpdk.org; Neil Horman ; Richardson, > > Bruce ; Ananyev, Konstantin > > > > Subject: [PATCH v3 7/7] app/testpmd: adjust ethdev port ownership > > > > 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 | 89 +++++++++++++++++++------------------= --- > ----- > > app/test-pmd/cmdline_flow.c | 2 +- > > app/test-pmd/config.c | 37 ++++++++++--------- > > app/test-pmd/parameters.c | 4 +- > > app/test-pmd/testpmd.c | 63 ++++++++++++++++++++------------ > > app/test-pmd/testpmd.h | 3 ++ > > 6 files changed, 103 insertions(+), 95 deletions(-) > > > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index > > 31919ba..6199c64 100644 > > --- a/app/test-pmd/cmdline.c > > +++ b/app/test-pmd/cmdline.c > > @@ -1394,7 +1394,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) { >=20 > Why do we need all these changes? > As I understand you changed definition of RTE_ETH_FOREACH_DEV(), so no > testpmd should work ok default (no_owner case). > Am I missing something here? Now, After Gaetan suggestion RTE_ETH_FOREACH_DEV(pid) will iterate over all= valid and ownerless ports. Here Testpmd wants to iterate over its owned ports. I added to Testpmd ability to take an ownership of ports as the new ownersh= ip and synchronization rules suggested, Since Tespmd is a DPDK entity which wants that no one will touch its owned = ports, It must allocate an unique ID, set owner for its ports (see in main functio= n) and recognizes them by its owner ID. =20 > Konstantin >=20 > > ports[pid].dev_conf.link_speeds =3D link_speed; > > } > > > > @@ -1902,7 +1902,7 @@ struct cmd_config_rss { > > struct cmd_config_rss *res =3D parsed_result; > > struct rte_eth_rss_conf rss_conf =3D { .rss_key_len =3D 0, }; > > int diag; > > - uint8_t i; > > + uint16_t pid; > > > > if (!strcmp(res->value, "all")) > > rss_conf.rss_hf =3D ETH_RSS_IP | ETH_RSS_TCP | @@ -1936,12 > +1936,12 > > @@ struct cmd_config_rss { > > return; > > } > > rss_conf.rss_key =3D NULL; > > - for (i =3D 0; i < rte_eth_dev_count(); i++) { > > - diag =3D rte_eth_dev_rss_hash_update(i, &rss_conf); > > + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { > > + diag =3D 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)); > > } > > } > > > > @@ -3686,10 +3686,9 @@ struct cmd_csum_result { > > uint64_t csum_offloads =3D 0; > > struct rte_eth_dev_info dev_info; > > > > - if (port_id_is_invalid(res->port_id, ENABLED_WARN)) { > > - printf("invalid port %d\n", res->port_id); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > + > > if (!port_is_stopped(res->port_id)) { > > printf("Please stop port %d first\n", res->port_id); > > return; > > @@ -4364,8 +4363,8 @@ struct cmd_gso_show_result { { > > struct cmd_gso_show_result *res =3D parsed_result; > > > > - if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { > > - printf("invalid port id %u\n", res->cmd_pid); > > + if (port_id_is_invalid(res->cmd_pid, ENABLED_WARN)) { > > + printf("invalid/not owned port id %u\n", res->cmd_pid); > > return; > > } > > if (!strcmp(res->cmd_keyword, "gso")) { @@ -5375,7 +5374,12 @@ > > static void cmd_create_bonded_device_parsed(void *parsed_result, > > port_id); > > > > /* Update number of ports */ > > - nb_ports =3D rte_eth_dev_count(); > > + if (rte_eth_dev_owner_set(port_id, &my_owner) !=3D 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); > > } > > @@ -5484,10 +5488,8 @@ static void > cmd_set_bond_mon_period_parsed(void *parsed_result, > > struct cmd_set_bond_mon_period_result *res =3D parsed_result; > > int ret; > > > > - if (res->port_num >=3D nb_ports) { > > - printf("Port id %d must be less than %d\n", res->port_num, > nb_ports); > > + if (port_id_is_invalid(res->port_num, ENABLED_WARN)) > > return; > > - } > > > > ret =3D rte_eth_bond_link_monitoring_set(res->port_num, > > res->period_ms); > > > > @@ -5545,11 +5547,8 @@ struct > cmd_set_bonding_agg_mode_policy_result { > > struct cmd_set_bonding_agg_mode_policy_result *res =3D > parsed_result; > > uint8_t policy =3D AGG_BANDWIDTH; > > > > - if (res->port_num >=3D nb_ports) { > > - printf("Port id %d must be less than %d\n", > > - res->port_num, nb_ports); > > + if (port_id_is_invalid(res->port_num, ENABLED_WARN)) > > return; > > - } > > > > if (!strcmp(res->policy, "bandwidth")) > > policy =3D AGG_BANDWIDTH; > > @@ -5808,7 +5807,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 > > @@ -5888,7 +5887,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 > > @@ -6622,31 +6621,31 @@ static void cmd_showportall_parsed(void > *parsed_result, > > struct cmd_showportall_result *res =3D 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); > > } > > > > @@ -10698,10 +10697,8 @@ struct cmd_flow_director_mask_result { > > struct rte_eth_fdir_masks *mask; > > struct rte_port *port; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > port =3D &ports[res->port_id]; > > /** Check if the port is not started **/ @@ -10899,10 +10896,8 @@ > > struct cmd_flow_director_flex_mask_result { > > uint16_t i; > > int ret; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > port =3D &ports[res->port_id]; > > /** Check if the port is not started **/ @@ -11053,12 +11048,10 @@ > > struct cmd_flow_director_flexpayload_result { > > struct cmd_flow_director_flexpayload_result *res =3D parsed_result; > > struct rte_eth_flex_payload_cfg flex_cfg; > > struct rte_port *port; > > - int ret =3D 0; > > + int ret; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > port =3D &ports[res->port_id]; > > /** Check if the port is not started **/ @@ -11774,7 +11767,7 @@ > > struct cmd_config_l2_tunnel_eth_type_result { > > entry.l2_tunnel_type =3D str2fdir_l2_tunnel_type(res- > >l2_tunnel_type); > > entry.ether_type =3D 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); > > } > > } > > @@ -11890,7 +11883,7 @@ struct cmd_config_l2_tunnel_en_dis_result { > > else > > en =3D 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, > > @@ -14440,10 +14433,8 @@ struct cmd_ddp_add_result { > > int file_num; > > int ret =3D -ENOTSUP; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > if (!all_ports_stopped()) { > > printf("Please stop all ports first\n"); @@ -14522,10 +14513,8 > @@ > > struct cmd_ddp_del_result { > > uint32_t size; > > int ret =3D -ENOTSUP; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > if (!all_ports_stopped()) { > > printf("Please stop all ports first\n"); @@ -14837,10 +14826,8 > @@ > > struct cmd_ddp_get_list_result { #endif > > int ret =3D -ENOTSUP; > > > > - if (res->port_id > nb_ports) { > > - printf("Invalid port, range is [0, %d]\n", nb_ports - 1); > > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > > return; > > - } > > > > #ifdef RTE_LIBRTE_I40E_PMD > > size =3D PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4; @@ -16296,7 > +16283,7 > > @@ struct cmd_cmdfile_result { > > if (id =3D=3D (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 =3D=3D 0) > > ports[pid].need_reconfig =3D dev; > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > > index 561e057..e55490f 100644 > > --- a/app/test-pmd/cmdline_flow.c > > +++ b/app/test-pmd/cmdline_flow.c > > @@ -2652,7 +2652,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 =3D=3D ent) > > return snprintf(buf, size, "%u", p); > > ++i; > > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index > > 957b820..43b9a7d 100644 > > --- a/app/test-pmd/config.c > > +++ b/app/test-pmd/config.c > > @@ -156,7 +156,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; > > @@ -236,7 +236,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; > > @@ -253,10 +253,9 @@ struct rss_type_info { > > struct rte_eth_xstat_name *xstats_names; > > > > 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 (port_id_is_invalid(port_id, ENABLED_WARN)) > > return; > > - } > > > > /* Get count */ > > cnt_xstats =3D rte_eth_xstats_get_names(port_id, NULL, 0); @@ - > 321,7 > > +320,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 +438,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; > > @@ -756,10 +755,15 @@ struct rss_type_info { int > > port_id_is_invalid(portid_t port_id, enum print_warning warning) { > > + struct rte_eth_dev_owner owner; > > + int ret; > > + > > if (port_id =3D=3D (portid_t)RTE_PORT_ALL) > > return 0; > > > > - if (rte_eth_dev_is_valid_port(port_id)) > > + ret =3D rte_eth_dev_owner_get(port_id, &owner); > > + > > + if (ret =3D=3D 0 && owner.id =3D=3D my_owner.id) > > return 0; > > > > if (warning =3D=3D ENABLED_WARN) > > @@ -2373,7 +2377,7 @@ struct igb_ring_desc_16_bytes { > > return; > > } > > nb_pt =3D 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++] =3D i; > > @@ -2512,10 +2516,9 @@ 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); > > + if (port_id_is_invalid(port_id, ENABLED_WARN)) > > return; > > - } > > + > > if (test_done =3D=3D 0) { > > printf("Before enable/disable GRO," > > " please stop forwarding first\n"); @@ - > 2574,10 +2577,9 @@ struct > > igb_ring_desc_16_bytes { > > > > param =3D &gro_ports[port_id].param; > > > > - if (!rte_eth_dev_is_valid_port(port_id)) { > > - printf("Invalid port id %u.\n", port_id); > > + if (port_id_is_invalid(port_id, ENABLED_WARN)) > > return; > > - } > > + > > if (gro_ports[port_id].enable) { > > printf("GRO type: TCP/IPv4\n"); > > if (gro_flush_cycles =3D=3D GRO_DEFAULT_FLUSH_CYCLES) { @@ > -2595,10 > > +2597,9 @@ 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); > > + if (port_id_is_invalid(port_id, ENABLED_WARN)) > > return; > > - } > > + > > if (strcmp(mode, "on") =3D=3D 0) { > > if (test_done =3D=3D 0) { > > printf("before enabling GSO," > > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c > > index 878c112..0e57b46 100644 > > --- a/app/test-pmd/parameters.c > > +++ b/app/test-pmd/parameters.c > > @@ -398,7 +398,7 @@ > > if (port_id_is_invalid(port_id, ENABLED_WARN) || > > port_id =3D=3D (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; > > @@ -459,7 +459,7 @@ > > if (port_id_is_invalid(port_id, ENABLED_WARN) || > > port_id =3D=3D (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 > > c066cf9..83f5e84 100644 > > --- a/app/test-pmd/testpmd.c > > +++ b/app/test-pmd/testpmd.c > > @@ -108,6 +108,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 <=3D nb_cfg_lcores <=3D nb_lcores > > * nb_fwd_ports <=3D nb_cfg_ports <=3D nb_ports > > @@ -449,7 +454,7 @@ static int eth_event_callback(portid_t port_id, > > portid_t pt_id; > > int i =3D 0; > > > > - RTE_ETH_FOREACH_DEV(pt_id) > > + RTE_ETH_FOREACH_DEV_OWNED_BY(pt_id, my_owner.id) > > fwd_ports_ids[i++] =3D pt_id; > > > > nb_cfg_ports =3D nb_ports; > > @@ -573,7 +578,7 @@ static int eth_event_callback(portid_t port_id, > > fwd_lcores[lc_id]->cpuid_idx =3D lc_id; > > } > > > > - RTE_ETH_FOREACH_DEV(pid) { > > + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { > > port =3D &ports[pid]; > > /* Apply default Tx configuration for all ports */ > > port->dev_conf.txmode =3D tx_mode; > > @@ -706,7 +711,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 =3D &ports[pid]; > > if (nb_rxq > port->dev_info.max_rx_queues) { > > printf("Fail: nb_rxq(%d) is greater than " > > @@ -1000,9 +1005,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 =3D rte_eth_dev_count(); > > tics_datum =3D rte_rdtsc(); > > tics_per_1sec =3D rte_get_timer_hz(); > > #endif > > @@ -1017,11 +1021,10 @@ static int eth_event_callback(portid_t port_id, > > tics_current =3D rte_rdtsc(); > > if (tics_current - tics_datum >=3D tics_per_1sec) { > > /* Periodic bitrate calculation */ > > - for (idx_port =3D 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 =3D tics_current; > > } > > } > > @@ -1359,7 +1362,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 =3D &ports[pi]; > > /* Check if there is a port which is not started */ > > if ((port->port_status !=3D RTE_PORT_STARTED) && @@ - > 1387,7 +1390,7 > > @@ static int eth_event_callback(portid_t port_id, { > > portid_t pi; > > > > - RTE_ETH_FOREACH_DEV(pi) { > > + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { > > if (!port_is_stopped(pi)) > > return 0; > > } > > @@ -1434,7 +1437,7 @@ static int eth_event_callback(portid_t port_id, > > > > if(dcb_config) > > dcb_test =3D 1; > > - RTE_ETH_FOREACH_DEV(pi) { > > + RTE_ETH_FOREACH_DEV_OWNED_BY(pi, my_owner.id) { > > if (pid !=3D pi && pid !=3D (portid_t)RTE_PORT_ALL) > > continue; > > > > @@ -1620,7 +1623,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 !=3D pi && pid !=3D (portid_t)RTE_PORT_ALL) > > continue; > > > > @@ -1663,7 +1666,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 !=3D pi && pid !=3D (portid_t)RTE_PORT_ALL) > > continue; > > > > @@ -1714,7 +1717,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 !=3D pi && pid !=3D (portid_t)RTE_PORT_ALL) > > continue; > > > > @@ -1759,6 +1762,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) !=3D 0) { > > + printf("Error: cannot own new attached port %d\n", pi); > > + return; > > + } > > + nb_ports++; > > + > > socket_id =3D (unsigned)rte_eth_dev_socket_id(pi); > > /* if socket_id is invalid, set to 0 */ > > if (check_socket_id(socket_id) < 0) > > @@ -1766,8 +1775,6 @@ static int eth_event_callback(portid_t port_id, > > reconfig(pi, socket_id); > > rte_eth_promiscuous_enable(pi); > > > > - nb_ports =3D rte_eth_dev_count(); > > - > > ports[pi].port_status =3D RTE_PORT_STOPPED; > > > > printf("Port %d is attached. Now total ports is %d\n", pi, > > nb_ports); @@ -1781,6 +1788,9 @@ static int > > eth_event_callback(portid_t port_id, > > > > printf("Detaching a port...\n"); > > > > + if (port_id_is_invalid(port_id, ENABLED_WARN)) > > + return; > > + > > if (!port_is_closed(port_id)) { > > printf("Please close port first\n"); > > return; > > @@ -1794,7 +1804,7 @@ static int eth_event_callback(portid_t port_id, > > return; > > } > > > > - nb_ports =3D rte_eth_dev_count(); > > + nb_ports--; > > > > printf("Port '%s' is detached. Now total ports is %d\n", > > name, nb_ports); > > @@ -1812,7 +1822,7 @@ static int eth_event_callback(portid_t port_id, > > > > if (ports !=3D NULL) { > > no_link_check =3D 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); > > @@ -1844,7 +1854,7 @@ struct pmd_test_command { > > fflush(stdout); > > for (count =3D 0; count <=3D MAX_CHECK_TIME; count++) { > > all_ports_up =3D 1; > > - RTE_ETH_FOREACH_DEV(portid) { > > + RTE_ETH_FOREACH_DEV_OWNED_BY(portid, my_owner.id) > { > > if ((port_mask & (1 << portid)) =3D=3D 0) > > continue; > > memset(&link, 0, sizeof(link)); > > @@ -1936,6 +1946,8 @@ struct pmd_test_command { > > > > switch (type) { > > case RTE_ETH_EVENT_INTR_RMV: > > + if (port_id_is_invalid(port_id, ENABLED_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"); @@ > > -2068,7 +2080,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 =3D &ports[pid]; > > port->dev_conf.fdir_conf =3D fdir_conf; > > if (nb_rxq > 1) { > > @@ -2383,7 +2395,12 @@ uint8_t port_is_bonding_slave(portid_t > slave_pid) > > rte_pdump_init(NULL); > > #endif > > > > - nb_ports =3D (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(port_id) > > + if (rte_eth_dev_owner_set(port_id, &my_owner) =3D=3D 0) > > + nb_ports++; > > if (nb_ports =3D=3D 0) > > TESTPMD_LOG(WARNING, "No probed ethernet > devices\n"); > > > > @@ -2431,7 +2448,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 > > 9c739e5..2d253b9 100644 > > --- a/app/test-pmd/testpmd.h > > +++ b/app/test-pmd/testpmd.h > > @@ -50,6 +50,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; > > @@ -361,6 +363,7 @@ struct queue_stats_mappings { > > * nb_fwd_ports <=3D nb_cfg_ports <=3D 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