From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 47B7FA48D for ; Fri, 19 Jan 2018 13:37:47 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2018 04:37:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,381,1511856000"; d="scan'208";a="11013433" Received: from irsmsx107.ger.corp.intel.com ([163.33.3.99]) by orsmga007.jf.intel.com with ESMTP; 19 Jan 2018 04:37:44 -0800 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.236]) by IRSMSX107.ger.corp.intel.com ([169.254.10.239]) with mapi id 14.03.0319.002; Fri, 19 Jan 2018 12:37:42 +0000 From: "Ananyev, Konstantin" To: Matan Azrad , 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: AQHTkHpyuUKMeuPQw06Oud7boKI8uKN7Inag Date: Fri, 19 Jan 2018 12:37:42 +0000 Message-ID: <2601191342CEEE43887BDE71AB97725886280A68@irsmsx105.ger.corp.intel.com> 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> In-Reply-To: <1516293317-30748-8-git-send-email-matan@mellanox.com> Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZWNlMzU3NmYtNDdmMy00YmY5LTlhYjEtNzU4M2ExYThmYTA3IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE2LjUuOS4zIiwiVHJ1c3RlZExhYmVsSGFzaCI6IkRlTFFrN1wvTVNYc3B0cGEwWkF5Z3FhSXVNdWxIVFJNYjV1TDBIcG9GRkFBPSJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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:37:49 -0000 Hi Matan, > -----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 >=20 > Testpmd should not use ethdev ports which are managed by other DPDK > entities. >=20 > 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. >=20 > 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(-) >=20 > 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; >=20 > - RTE_ETH_FOREACH_DEV(pid) { > + RTE_ETH_FOREACH_DEV_OWNED_BY(pid, my_owner.id) { 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?=20 Konstantin > ports[pid].dev_conf.link_speeds =3D link_speed; > } >=20 > @@ -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; >=20 > 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)); > } > } >=20 > @@ -3686,10 +3686,9 @@ struct cmd_csum_result { > uint64_t csum_offloads =3D 0; > struct rte_eth_dev_info dev_info; >=20 > - 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; >=20 > - 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); >=20 > /* 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 *p= arsed_result, > struct cmd_set_bond_mon_period_result *res =3D parsed_result; > int ret; >=20 > - 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; > - } >=20 > ret =3D rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms)= ; >=20 > @@ -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; >=20 > - 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; > - } >=20 > if (!strcmp(res->policy, "bandwidth")) > policy =3D AGG_BANDWIDTH; > @@ -5808,7 +5807,7 @@ static void cmd_set_promisc_mode_parsed(void *parse= d_result, >=20 > /* 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 *pars= ed_result, >=20 > /* 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_r= esult, > 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); > } >=20 > @@ -10698,10 +10697,8 @@ struct cmd_flow_director_mask_result { > struct rte_eth_fdir_masks *mask; > struct rte_port *port; >=20 > - 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; > - } >=20 > 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; >=20 > - 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; > - } >=20 > 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; >=20 > - 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; > - } >=20 > 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; >=20 > - 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; >=20 > - 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; >=20 > - 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; > - } >=20 > 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; >=20 > - 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; > - } >=20 > 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; >=20 > - 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; > - } >=20 > #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; >=20 > - 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 *, >=20 > (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 { >=20 > 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 { >=20 > 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; >=20 > 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; > - } >=20 > /* Get count */ > cnt_xstats =3D rte_eth_xstats_get_names(port_id, NULL, 0); > @@ -321,7 +320,7 @@ struct rss_type_info { >=20 > 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 { >=20 > 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; >=20 > - 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; >=20 > 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 { >=20 > param =3D &gro_ports[port_id].param; >=20 > - 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. */ >=20 > /* > + * 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; >=20 > - RTE_ETH_FOREACH_DEV(pt_id) > + RTE_ETH_FOREACH_DEV_OWNED_BY(pt_id, my_owner.id) > fwd_ports_ids[i++] =3D pt_id; >=20 > 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; > } >=20 > - 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; >=20 > /* 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; >=20 > - 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; >=20 > - 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; >=20 > - 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, >=20 > 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; >=20 > @@ -1620,7 +1623,7 @@ static int eth_event_callback(portid_t port_id, >=20 > printf("Stopping ports...\n"); >=20 > - 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; >=20 > @@ -1663,7 +1666,7 @@ static int eth_event_callback(portid_t port_id, >=20 > printf("Closing ports...\n"); >=20 > - 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; >=20 > @@ -1714,7 +1717,7 @@ static int eth_event_callback(portid_t port_id, >=20 > printf("Resetting ports...\n"); >=20 > - 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; >=20 > @@ -1759,6 +1762,12 @@ static int eth_event_callback(portid_t port_id, > if (rte_eth_dev_attach(identifier, &pi)) > return; >=20 > + 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); >=20 > - nb_ports =3D rte_eth_dev_count(); > - > ports[pi].port_status =3D RTE_PORT_STOPPED; >=20 > 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, >=20 > printf("Detaching a port...\n"); >=20 > + 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; > } >=20 > - nb_ports =3D rte_eth_dev_count(); > + nb_ports--; >=20 > 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, >=20 > 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 { >=20 > 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; >=20 > - 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 >=20 > - 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"); >=20 > @@ -2431,7 +2448,7 @@ uint8_t port_is_bonding_slave(portid_t slave_pid) > rte_exit(EXIT_FAILURE, "Start ports failed\n"); >=20 > /* 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); >=20 > /* 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 >=20 > +#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 t= ime. */ > +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