Hi Matan, > -----Original Message----- > From: Matan Azrad [mailto:ma...@mellanox.com] > Sent: Thursday, January 18, 2018 4:35 PM > To: Thomas Monjalon <tho...@monjalon.net>; Gaetan Rivet > <gaetan.ri...@6wind.com>; Wu, Jingjing <jingjing...@intel.com> > Cc: dev@dpdk.org; Neil Horman <nhor...@tuxdriver.com>; Richardson, Bruce > <bruce.richard...@intel.com>; Ananyev, Konstantin > <konstantin.anan...@intel.com> > 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 <ma...@mellanox.com> > --- > 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) {
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? Konstantin > ports[pid].dev_conf.link_speeds = link_speed; > } > > @@ -1902,7 +1902,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 | > @@ -1936,12 +1936,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)); > } > } > > @@ -3686,10 +3686,9 @@ struct cmd_csum_result { > uint64_t csum_offloads = 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 = 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 = 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); > } > @@ -5484,10 +5488,8 @@ static void cmd_set_bond_mon_period_parsed(void > *parsed_result, > struct cmd_set_bond_mon_period_result *res = parsed_result; > int ret; > > - if (res->port_num >= 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 = 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 = parsed_result; > uint8_t policy = AGG_BANDWIDTH; > > - if (res->port_num >= 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 = 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 = 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 = &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 = &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 = parsed_result; > struct rte_eth_flex_payload_cfg flex_cfg; > struct rte_port *port; > - int ret = 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 = &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 = 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); > } > } > @@ -11890,7 +11883,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, > @@ -14440,10 +14433,8 @@ struct cmd_ddp_add_result { > int file_num; > int ret = -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 = -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 = -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 = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4; > @@ -16296,7 +16283,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 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 == 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 = 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 == (portid_t)RTE_PORT_ALL) > return 0; > > - if (rte_eth_dev_is_valid_port(port_id)) > + ret = rte_eth_dev_owner_get(port_id, &owner); > + > + if (ret == 0 && owner.id == my_owner.id) > return 0; > > if (warning == ENABLED_WARN) > @@ -2373,7 +2377,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; > @@ -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 == 0) { > printf("Before enable/disable GRO," > " please stop forwarding first\n"); > @@ -2574,10 +2577,9 @@ struct igb_ring_desc_16_bytes { > > param = &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 == 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") == 0) { > if (test_done == 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 == (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 == (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 <= nb_cfg_lcores <= nb_lcores > * nb_fwd_ports <= nb_cfg_ports <= nb_ports > @@ -449,7 +454,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; > @@ -573,7 +578,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]; > /* Apply default Tx configuration for all ports */ > port->dev_conf.txmode = 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 = &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 = rte_eth_dev_count(); > tics_datum = rte_rdtsc(); > tics_per_1sec = rte_get_timer_hz(); > #endif > @@ -1017,11 +1021,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; > } > } > @@ -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 = &ports[pi]; > /* Check if there is a port which is not started */ > if ((port->port_status != 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 = 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; > > @@ -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 != pi && pid != (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 != pi && pid != (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 != pi && pid != (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) != 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) > @@ -1766,8 +1775,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); > @@ -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 = 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 != 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); > @@ -1844,7 +1854,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)); > @@ -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 = &ports[pid]; > port->dev_conf.fdir_conf = 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 = (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) == 0) > + nb_ports++; > if (nb_ports == 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 <= 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