[02/51] app/testpmd: check status of getting ethdev info

Message ID 1566915962-5472-3-git-send-email-arybchenko@solarflare.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series ethdev: change rte_eth_dev_info_get() return value to int |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Andrew Rybchenko Aug. 27, 2019, 2:25 p.m. UTC
  From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>

Add eth_dev_info_get_print_err() which is a wrapper for
rte_eth_dev_info_get() printing error if rte_eth_dev_info_get()
fails and returning its status code.

Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 app/test-pmd/cmdline.c      | 119 ++++++++++++++++++++++++++++++++++++--------
 app/test-pmd/cmdline_flow.c |   5 +-
 app/test-pmd/config.c       |  78 ++++++++++++++++++++++++-----
 app/test-pmd/parameters.c   |   8 ++-
 app/test-pmd/testpmd.c      |  30 ++++++++---
 app/test-pmd/testpmd.h      |   3 ++
 app/test-pmd/util.c         |  28 ++++++++++-
 7 files changed, 228 insertions(+), 43 deletions(-)
  

Comments

Ferruh Yigit Sept. 2, 2019, 12:40 p.m. UTC | #1
On 8/27/2019 3:25 PM, Andrew Rybchenko wrote:
> From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> 
> Add eth_dev_info_get_print_err() which is a wrapper for
> rte_eth_dev_info_get() printing error if rte_eth_dev_info_get()
> fails and returning its status code.
> 
> Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>

<...>

> @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
>  	struct rte_eth_dev_info dev_info;
>  	uint8_t hash_key_size;
>  	uint32_t key_len;
> +	int ret;
>  
>  	memset(&dev_info, 0, sizeof(dev_info));

It should be in different most probably, but the 'memset' before
'rte_eth_dev_info_get()' looks redundant, since API does the same.

<...>

> @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {
>  {
>  	struct rte_eth_dev_info dev_info;
>  
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	eth_dev_info_get_print_err(port_id, &dev_info);

Should we check the return value here too? And return 'dev_info' immediately on
error instead of going on.

<...>

> @@ -1136,7 +1139,10 @@ struct extmem_param {
>  		/* Apply default TxRx configuration for all ports */
>  		port->dev_conf.txmode = tx_mode;
>  		port->dev_conf.rxmode = rx_mode;
> -		rte_eth_dev_info_get(pid, &port->dev_info);
> +
> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> +		if (ret != 0)
> +			return;

What do you think 'rte_exit()' here instead of 'return', 'init_config()' doesn't
return error, and returning from init will assume everyting setup, 0 number of
queues for any port eventually will cause an exit in the app, better to fail
where error occurs.
  
Andrew Rybchenko Sept. 3, 2019, 11:59 a.m. UTC | #2
On 9/2/19 3:40 PM, Ferruh Yigit wrote:
> On 8/27/2019 3:25 PM, Andrew Rybchenko wrote:
>> From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>>
>> Add eth_dev_info_get_print_err() which is a wrapper for
>> rte_eth_dev_info_get() printing error if rte_eth_dev_info_get()
>> fails and returning its status code.
>>
>> Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> <...>
>
>> @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
>>   	struct rte_eth_dev_info dev_info;
>>   	uint8_t hash_key_size;
>>   	uint32_t key_len;
>> +	int ret;
>>   
>>   	memset(&dev_info, 0, sizeof(dev_info));
> It should be in different most probably, but the 'memset' before
> 'rte_eth_dev_info_get()' looks redundant, since API does the same.

I'll add pre-patch to fix it everywhere I found.

> <...>
>
>> @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {
>>   {
>>   	struct rte_eth_dev_info dev_info;
>>   
>> -	rte_eth_dev_info_get(port_id, &dev_info);
>> +	eth_dev_info_get_print_err(port_id, &dev_info);
> Should we check the return value here too? And return 'dev_info' immediately on
> error instead of going on.

Thanks, missed it.

Also there are two more cases in testpmd to get maximum number
of Rx/Tx queue. I'll skip port and continue if device info get fails.

> <...>
>
>> @@ -1136,7 +1139,10 @@ struct extmem_param {
>>   		/* Apply default TxRx configuration for all ports */
>>   		port->dev_conf.txmode = tx_mode;
>>   		port->dev_conf.rxmode = rx_mode;
>> -		rte_eth_dev_info_get(pid, &port->dev_info);
>> +
>> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
>> +		if (ret != 0)
>> +			return;
> What do you think 'rte_exit()' here instead of 'return', 'init_config()' doesn't
> return error, and returning from init will assume everyting setup, 0 number of
> queues for any port eventually will cause an exit in the app, better to fail
> where error occurs.

I agree. I've considered to skip the port and continue with other port, but
it is better to catch such problems earlier instead of hiding behind complex
logic.

Thanks, Andrew.
  
Zhao1, Wei Sept. 30, 2019, 8:43 a.m. UTC | #3
Hi, Ivan Ilchenko and Andrew Rybchenko

An error is cause by this patch,  it is very easy to reappear.
You only need to bind a ixgbe nic driver , and run up testpmd:
./x86_64-native-linuxapp-gcc/app/testpmd  -c 0xff -n 4 -- -i --portmask=0xff  --rxq=8 --txq=8 --port-topology=loop

Then input a rte_flow rss action cmd:
flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / end actions rss queues 4 5 end / end
bad arguments  

so, rte_flow action rss can not be used after this patch.
 

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Andrew Rybchenko
> Sent: Tuesday, August 27, 2019 10:25 PM
> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>; Adrien Mazarguil
> <adrien.mazarguil@6wind.com>
> Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> Subject: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
> ethdev info
> 
> From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> 
> Add eth_dev_info_get_print_err() which is a wrapper for
> rte_eth_dev_info_get() printing error if rte_eth_dev_info_get() fails and
> returning its status code.
> 
> Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
>  app/test-pmd/cmdline.c      | 119
> ++++++++++++++++++++++++++++++++++++--------
>  app/test-pmd/cmdline_flow.c |   5 +-
>  app/test-pmd/config.c       |  78 ++++++++++++++++++++++++-----
>  app/test-pmd/parameters.c   |   8 ++-
>  app/test-pmd/testpmd.c      |  30 ++++++++---
>  app/test-pmd/testpmd.h      |   3 ++
>  app/test-pmd/util.c         |  28 ++++++++++-
>  7 files changed, 228 insertions(+), 43 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 56783aa..d4ab143 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -2273,6 +2273,7 @@ struct cmd_config_rss {
>  	int all_updated = 1;
>  	int diag;
>  	uint16_t i;
> +	int ret;
> 
>  	if (!strcmp(res->value, "all"))
>  		rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | @@ -2312,7
> +2313,10 @@ struct cmd_config_rss {
>  	RTE_ETH_FOREACH_DEV(i) {
>  		struct rte_eth_rss_conf local_rss_conf;
> 
> -		rte_eth_dev_info_get(i, &dev_info);
> +		ret = eth_dev_info_get_print_err(i, &dev_info);
> +		if (ret != 0)
> +			return;
> +
>  		if (use_default)
>  			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
> 
> @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
>  	struct rte_eth_dev_info dev_info;
>  	uint8_t hash_key_size;
>  	uint32_t key_len;
> +	int ret;
> 
>  	memset(&dev_info, 0, sizeof(dev_info));
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (dev_info.hash_key_size > 0 &&
>  			dev_info.hash_key_size <= sizeof(hash_key))
>  		hash_key_size = dev_info.hash_key_size; @@ -2945,7
> +2953,10 @@ struct cmd_config_rss_reta {
>  	struct cmd_config_rss_reta *res = parsed_result;
> 
>  	memset(&dev_info, 0, sizeof(dev_info));
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (dev_info.reta_size == 0) {
>  		printf("Redirection table size is 0 which is "
>  					"invalid for RSS\n");
> @@ -3063,9 +3074,13 @@ struct cmd_showport_reta {
>  	struct rte_eth_rss_reta_entry64 reta_conf[8];
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t max_reta_size;
> +	int ret;
> 
>  	memset(&dev_info, 0, sizeof(dev_info));
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	max_reta_size = RTE_MIN(dev_info.reta_size,
> ETH_RSS_RETA_SIZE_512);
>  	if (res->size == 0 || res->size > max_reta_size) {
>  		printf("Invalid redirection table size: %u (1-%u)\n", @@ -
> 3292,6 +3307,7 @@ struct cmd_config_burst {
>  	struct cmd_config_burst *res = parsed_result;
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t rec_nb_pkts;
> +	int ret;
> 
>  	if (!all_ports_stopped()) {
>  		printf("Please stop all ports first\n"); @@ -3305,7 +3321,10
> @@ struct cmd_config_burst {
>  			 * size for all ports, so assume all ports are the same
>  			 * NIC model and use the values from Port 0.
>  			 */
> -			rte_eth_dev_info_get(0, &dev_info);
> +			ret = eth_dev_info_get_print_err(0, &dev_info);
> +			if (ret != 0)
> +				return;
> +
>  			rec_nb_pkts =
> dev_info.default_rxportconf.burst_size;
> 
>  			if (rec_nb_pkts == 0) {
> @@ -4375,6 +4394,7 @@ struct cmd_csum_result {  {
>  	struct rte_eth_dev_info dev_info;
>  	uint64_t tx_offloads;
> +	int ret;
> 
>  	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
>  	printf("Parse tunnel is %s\n",
> @@ -4393,7 +4413,10 @@ struct cmd_csum_result {
>  		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ?
> "hw" : "sw");
> 
>  	/* display warnings if configuration is not supported by the NIC */
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
>  		(dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
>  		printf("Warning: hardware IP checksum enabled but not "
> @@ -4447,6 +4470,7 @@ struct cmd_csum_result {
>  	int hw = 0;
>  	uint64_t csum_offloads = 0;
>  	struct rte_eth_dev_info dev_info;
> +	int ret;
> 
>  	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
>  		printf("invalid port %d\n", res->port_id); @@ -4457,7
> +4481,10 @@ struct cmd_csum_result {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (!strcmp(res->mode, "set")) {
> 
>  		if (!strcmp(res->hwsw, "hw"))
> @@ -4645,6 +4672,7 @@ struct cmd_tso_set_result {  {
>  	struct cmd_tso_set_result *res = parsed_result;
>  	struct rte_eth_dev_info dev_info;
> +	int ret;
> 
>  	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
>  		return;
> @@ -4656,7 +4684,10 @@ struct cmd_tso_set_result {
>  	if (!strcmp(res->mode, "set"))
>  		ports[res->port_id].tso_segsz = res->tso_segsz;
> 
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if ((ports[res->port_id].tso_segsz != 0) &&
>  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO)
> == 0) {
>  		printf("Error: TSO is not supported by port %d\n", @@ -
> 4677,7 +4708,10 @@ struct cmd_tso_set_result {
>  	cmd_config_queue_tx_offloads(&ports[res->port_id]);
> 
>  	/* display warnings if configuration is not supported by the NIC */
> -	rte_eth_dev_info_get(res->port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if ((ports[res->port_id].tso_segsz != 0) &&
>  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO)
> == 0) {
>  		printf("Warning: TSO enabled but not "
> @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {  {
>  	struct rte_eth_dev_info dev_info;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	eth_dev_info_get_print_err(port_id, &dev_info);
> +
>  	if (!(dev_info.tx_offload_capa &
> DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
>  		printf("Warning: VXLAN TUNNEL TSO not supported
> therefore "
>  		       "not enabled for port %d\n", port_id); @@ -11184,7
> +11219,11 @@ struct cmd_flow_director_result {
>  			struct rte_eth_dev_info dev_info;
> 
>  			memset(&dev_info, 0, sizeof(dev_info));
> -			rte_eth_dev_info_get(res->port_id, &dev_info);
> +			ret = eth_dev_info_get_print_err(res->port_id,
> +						&dev_info);
> +			if (ret != 0)
> +				return;
> +
>  			errno = 0;
>  			vf_id = strtoul(res->pf_vf + 2, &end, 10);
>  			if (errno != 0 || *end != '\0' ||
> @@ -14176,7 +14215,10 @@ struct cmd_macsec_offload_on_result {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT)
> {  #ifdef RTE_LIBRTE_IXGBE_PMD
>  		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); @@ -
> 14270,7 +14312,10 @@ struct cmd_macsec_offload_off_result {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT)
> {  #ifdef RTE_LIBRTE_IXGBE_PMD
>  		ret = rte_pmd_ixgbe_macsec_disable(port_id);
> @@ -17980,8 +18025,12 @@ struct cmd_rx_offload_get_capa_result {
>  	portid_t port_id = res->port_id;
>  	uint64_t queue_offloads;
>  	uint64_t port_offloads;
> +	int ret;
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
>  	queue_offloads = dev_info.rx_queue_offload_capa;
>  	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
> 
> @@ -18053,6 +18102,7 @@ struct cmd_rx_offload_get_configuration_result
> {
>  	uint64_t queue_offloads;
>  	uint16_t nb_rx_queues;
>  	int q;
> +	int ret;
> 
>  	printf("Rx Offloading Configuration of port %d :\n", port_id);
> 
> @@ -18061,7 +18111,10 @@ struct
> cmd_rx_offload_get_configuration_result {
>  	print_rx_offloads(port_offloads);
>  	printf("\n");
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	nb_rx_queues = dev_info.nb_rx_queues;
>  	for (q = 0; q < nb_rx_queues; q++) {
>  		queue_offloads = port->rx_conf[q].offloads; @@ -18160,6
> +18213,7 @@ struct cmd_config_per_port_rx_offload_result {
>  	uint64_t single_offload;
>  	uint16_t nb_rx_queues;
>  	int q;
> +	int ret;
> 
>  	if (port->port_status != RTE_PORT_STOPPED) {
>  		printf("Error: Can't config offload when Port %d "
> @@ -18173,7 +18227,10 @@ struct cmd_config_per_port_rx_offload_result
> {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	nb_rx_queues = dev_info.nb_rx_queues;
>  	if (!strcmp(res->on_off, "on")) {
>  		port->dev_conf.rxmode.offloads |= single_offload; @@ -
> 18261,6 +18318,7 @@ struct cmd_config_per_queue_rx_offload_result {
>  	uint16_t queue_id = res->queue_id;
>  	struct rte_port *port = &ports[port_id];
>  	uint64_t single_offload;
> +	int ret;
> 
>  	if (port->port_status != RTE_PORT_STOPPED) {
>  		printf("Error: Can't config offload when Port %d "
> @@ -18268,7 +18326,10 @@ struct
> cmd_config_per_queue_rx_offload_result {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (queue_id >= dev_info.nb_rx_queues) {
>  		printf("Error: input queue_id should be 0 ... "
>  		       "%d\n", dev_info.nb_rx_queues - 1); @@ -18374,8
> +18435,12 @@ struct cmd_tx_offload_get_capa_result {
>  	portid_t port_id = res->port_id;
>  	uint64_t queue_offloads;
>  	uint64_t port_offloads;
> +	int ret;
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
>  	queue_offloads = dev_info.tx_queue_offload_capa;
>  	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
> 
> @@ -18447,6 +18512,7 @@ struct cmd_tx_offload_get_configuration_result
> {
>  	uint64_t queue_offloads;
>  	uint16_t nb_tx_queues;
>  	int q;
> +	int ret;
> 
>  	printf("Tx Offloading Configuration of port %d :\n", port_id);
> 
> @@ -18455,7 +18521,10 @@ struct
> cmd_tx_offload_get_configuration_result {
>  	print_tx_offloads(port_offloads);
>  	printf("\n");
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	nb_tx_queues = dev_info.nb_tx_queues;
>  	for (q = 0; q < nb_tx_queues; q++) {
>  		queue_offloads = port->tx_conf[q].offloads; @@ -18559,6
> +18628,7 @@ struct cmd_config_per_port_tx_offload_result {
>  	uint64_t single_offload;
>  	uint16_t nb_tx_queues;
>  	int q;
> +	int ret;
> 
>  	if (port->port_status != RTE_PORT_STOPPED) {
>  		printf("Error: Can't config offload when Port %d "
> @@ -18572,7 +18642,10 @@ struct cmd_config_per_port_tx_offload_result
> {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	nb_tx_queues = dev_info.nb_tx_queues;
>  	if (!strcmp(res->on_off, "on")) {
>  		port->dev_conf.txmode.offloads |= single_offload; @@ -
> 18663,6 +18736,7 @@ struct cmd_config_per_queue_tx_offload_result {
>  	uint16_t queue_id = res->queue_id;
>  	struct rte_port *port = &ports[port_id];
>  	uint64_t single_offload;
> +	int ret;
> 
>  	if (port->port_status != RTE_PORT_STOPPED) {
>  		printf("Error: Can't config offload when Port %d "
> @@ -18670,7 +18744,10 @@ struct
> cmd_config_per_queue_tx_offload_result {
>  		return;
>  	}
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (queue_id >= dev_info.nb_tx_queues) {
>  		printf("Error: input queue_id should be 0 ... "
>  		       "%d\n", dev_info.nb_tx_queues - 1); diff --git
> a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index
> 4958713..369426c 100644
> --- a/app/test-pmd/cmdline_flow.c
> +++ b/app/test-pmd/cmdline_flow.c
> @@ -3550,7 +3550,10 @@ static int comp_vc_action_rss_queue(struct
> context *, const struct token *,
>  	    ctx->port != (portid_t)RTE_PORT_ALL) {
>  		struct rte_eth_dev_info info;
> 
> -		rte_eth_dev_info_get(ctx->port, &info);
> +		ret = rte_eth_dev_info_get(ctx->port, &info);
> +		if (ret != 0)
> +			return ret;
> +
>  		action_rss_data->conf.key_len =
>  			RTE_MIN(sizeof(action_rss_data->key),
>  				info.hash_key_size);
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> 1a5a5c1..0ef7c36 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -471,6 +471,7 @@ static int bus_match_all(const struct rte_bus *bus,
> const void *data)
>  	static const char *info_border = "*********************";
>  	uint16_t mtu;
>  	char name[RTE_ETH_NAME_MAX_LEN];
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
>  		print_valid_ports();
> @@ -479,7 +480,11 @@ static int bus_match_all(const struct rte_bus *bus,
> const void *data)
>  	port = &ports[port_id];
>  	rte_eth_link_get_nowait(port_id, &link);
>  	memset(&dev_info, 0, sizeof(dev_info));
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	printf("\n%s Infos for port %-2d %s\n",
>  	       info_border, port_id, info_border);
>  	rte_eth_macaddr_get(port_id, &mac_addr); @@ -618,6 +623,7 @@
> static int bus_match_all(const struct rte_bus *bus, const void *data)
>  	struct rte_eth_link link;
>  	struct rte_eth_dev_info dev_info;
>  	char name[RTE_ETH_NAME_MAX_LEN];
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
>  		print_valid_ports();
> @@ -625,7 +631,11 @@ static int bus_match_all(const struct rte_bus *bus,
> const void *data)
>  	}
> 
>  	rte_eth_link_get_nowait(port_id, &link);
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	rte_eth_dev_get_name_by_port(port_id, name);
>  	rte_eth_macaddr_get(port_id, &mac_addr);
> 
> @@ -642,11 +652,14 @@ static int bus_match_all(const struct rte_bus *bus,
> const void *data)  {
>  	struct rte_eth_dev_info dev_info;
>  	static const char *info_border = "************";
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> 
>  	printf("\n%s Port %d supported offload features: %s\n",
>  		info_border, port_id, info_border);
> @@ -1140,10 +1153,15 @@ void print_valid_ports(void)  {
>  	int diag;
>  	struct rte_eth_dev_info dev_info;
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) {
>  		printf("Set MTU failed. MTU:%u is not in valid range, min:%u
> - max:%u\n",
>  			mtu, dev_info.min_mtu, dev_info.max_mtu); @@ -
> 1618,13 +1636,17 @@ struct igb_ring_desc_16_bytes {  #endif
>  			   uint16_t desc_id)
>  {
> +	int ret;
>  	struct igb_ring_desc_16_bytes *ring =
>  		(struct igb_ring_desc_16_bytes *)ring_mz->addr;  #ifndef
> RTE_LIBRTE_I40E_16BYTE_RX_DESC
>  	struct rte_eth_dev_info dev_info;
> 
>  	memset(&dev_info, 0, sizeof(dev_info));
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (strstr(dev_info.driver_name, "i40e") != NULL) {
>  		/* 32 bytes RX descriptor, i40e only */
>  		struct igb_ring_desc_32_bytes *ring = @@ -1834,11 +1856,15
> @@ struct igb_ring_desc_16_bytes {
>  	int diag;
>  	struct rte_eth_dev_info dev_info;
>  	uint8_t hash_key_size;
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if (dev_info.hash_key_size > 0 &&
>  			dev_info.hash_key_size <= sizeof(rss_key))
>  		hash_key_size = dev_info.hash_key_size; @@ -2796,11
> +2822,15 @@ struct igb_ring_desc_16_bytes {  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> 
> -	rte_eth_dev_info_get(portid, &dev_info);
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
>  		if (!ports[portid].rx_dump_cb[queue])
>  			ports[portid].rx_dump_cb[queue] =
> @@ -2813,10 +2843,15 @@ struct igb_ring_desc_16_bytes {  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(portid, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>  		if (!ports[portid].tx_dump_cb[queue])
>  			ports[portid].tx_dump_cb[queue] =
> @@ -2829,10 +2864,15 @@ struct igb_ring_desc_16_bytes {  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(portid, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
>  		if (ports[portid].rx_dump_cb[queue]) {
>  			rte_eth_remove_rx_callback(portid, queue, @@ -
> 2846,10 +2886,15 @@ struct igb_ring_desc_16_bytes {  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(portid, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>  		if (ports[portid].tx_dump_cb[queue]) {
>  			rte_eth_remove_tx_callback(portid, queue, @@ -
> 3037,6 +3082,7 @@ struct igb_ring_desc_16_bytes {  tx_vlan_set(portid_t
> port_id, uint16_t vlan_id)  {
>  	struct rte_eth_dev_info dev_info;
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> @@ -3048,7 +3094,11 @@ struct igb_ring_desc_16_bytes {
>  		printf("Error, as QinQ has been enabled.\n");
>  		return;
>  	}
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT)
> == 0) {
>  		printf("Error: vlan insert is not supported by port %d\n",
>  			port_id);
> @@ -3064,6 +3114,7 @@ struct igb_ring_desc_16_bytes
> {  tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)  {
>  	struct rte_eth_dev_info dev_info;
> +	int ret;
> 
>  	if (port_id_is_invalid(port_id, ENABLED_WARN))
>  		return;
> @@ -3072,7 +3123,10 @@ struct igb_ring_desc_16_bytes {
>  	if (vlan_id_is_invalid(vlan_id_outer))
>  		return;
> 
> -	rte_eth_dev_info_get(port_id, &dev_info);
> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT)
> == 0) {
>  		printf("Error: qinq insert not supported by port %d\n",
>  			port_id);
> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c index
> 5244872..6c78dca 100644
> --- a/app/test-pmd/parameters.c
> +++ b/app/test-pmd/parameters.c
> @@ -562,6 +562,7 @@
>  	uint64_t tx_offloads = tx_mode.offloads;
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t rec_nb_pkts;
> +	int ret;
> 
>  	static struct option lgopts[] = {
>  		{ "help",			0, 0, 0 },
> @@ -1050,7 +1051,12 @@
>  					 * value, on the assumption that all
>  					 * ports are of the same NIC model.
>  					 */
> -					rte_eth_dev_info_get(0, &dev_info);
> +					ret = eth_dev_info_get_print_err(
> +								0,
> +								&dev_info);
> +					if (ret != 0)
> +						return;
> +
>  					rec_nb_pkts = dev_info
> 
> 	.default_rxportconf.burst_size;
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> e8e2a39..0117236 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1016,7 +1016,8 @@ struct extmem_param {
>  	struct rte_eth_dev_info dev_info;
> 
>  	RTE_ETH_FOREACH_DEV(pi) {
> -		rte_eth_dev_info_get(pi, &dev_info);
> +		eth_dev_info_get_print_err(pi, &dev_info);
> +
>  		if (dev_info.max_rx_queues < allowed_max_rxq) {
>  			allowed_max_rxq = dev_info.max_rx_queues;
>  			*pid = pi;
> @@ -1062,7 +1063,8 @@ struct extmem_param {
>  	struct rte_eth_dev_info dev_info;
> 
>  	RTE_ETH_FOREACH_DEV(pi) {
> -		rte_eth_dev_info_get(pi, &dev_info);
> +		eth_dev_info_get_print_err(pi, &dev_info);
> +
>  		if (dev_info.max_tx_queues < allowed_max_txq) {
>  			allowed_max_txq = dev_info.max_tx_queues;
>  			*pid = pi;
> @@ -1109,6 +1111,7 @@ struct extmem_param {
>  	uint16_t data_size;
>  	bool warning = 0;
>  	int k;
> +	int ret;
> 
>  	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
> 
> @@ -1136,7 +1139,10 @@ struct extmem_param {
>  		/* Apply default TxRx configuration for all ports */
>  		port->dev_conf.txmode = tx_mode;
>  		port->dev_conf.rxmode = rx_mode;
> -		rte_eth_dev_info_get(pid, &port->dev_info);
> +
> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> +		if (ret != 0)
> +			return;
> 
>  		if (!(port->dev_info.tx_offload_capa &
>  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE)) @@ -1295,10
> +1301,14 @@ struct extmem_param {  reconfig(portid_t new_port_id,
> unsigned socket_id)  {
>  	struct rte_port *port;
> +	int ret;
> 
>  	/* Reconfiguration of Ethernet ports. */
>  	port = &ports[new_port_id];
> -	rte_eth_dev_info_get(new_port_id, &port->dev_info);
> +
> +	ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
> +	if (ret != 0)
> +		return;
> 
>  	/* set flag to initialize port/queue */
>  	port->need_reconfig = 1;
> @@ -2927,11 +2937,16 @@ struct pmd_test_command {  {
>  	portid_t pid;
>  	struct rte_port *port;
> +	int ret;
> 
>  	RTE_ETH_FOREACH_DEV(pid) {
>  		port = &ports[pid];
>  		port->dev_conf.fdir_conf = fdir_conf;
> -		rte_eth_dev_info_get(pid, &port->dev_info);
> +
> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> +		if (ret != 0)
> +			return;
> +
>  		if (nb_rxq > 1) {
>  			port->dev_conf.rx_adv_conf.rss_conf.rss_key =
> NULL;
>  			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = @@ -
> 3106,7 +3121,10 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
>  	retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
>  	if (retval < 0)
>  		return retval;
> -	rte_eth_dev_info_get(pid, &rte_port->dev_info);
> +
> +	retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
> +	if (retval != 0)
> +		return retval;
> 
>  	/* If dev_info.vmdq_pool_base is greater than 0,
>  	 * the queue id of vmdq pools is started after pf queues.
> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> ce13eb8..d73955d 100644
> --- a/app/test-pmd/testpmd.h
> +++ b/app/test-pmd/testpmd.h
> @@ -822,6 +822,9 @@ void port_rss_hash_key_update(portid_t port_id,
> char rss_type[],  void setup_gro_flush_cycles(uint8_t cycles);  void
> show_gro(portid_t port_id);  void setup_gso(const char *mode, portid_t
> port_id);
> +int eth_dev_info_get_print_err(uint16_t port_id,
> +			struct rte_eth_dev_info *dev_info);
> +
> 
>  /* Functions to manage the set of filtered Multicast MAC addresses */  void
> mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr); diff --
> git a/app/test-pmd/util.c b/app/test-pmd/util.c index 18dfdca..009d226
> 100644
> --- a/app/test-pmd/util.c
> +++ b/app/test-pmd/util.c
> @@ -194,10 +194,15 @@
>  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(portid, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>  		if (!ports[portid].tx_set_md_cb[queue])
>  			ports[portid].tx_set_md_cb[queue] =
> @@ -210,10 +215,15 @@
>  {
>  	struct rte_eth_dev_info dev_info;
>  	uint16_t queue;
> +	int ret;
> 
>  	if (port_id_is_invalid(portid, ENABLED_WARN))
>  		return;
> -	rte_eth_dev_info_get(portid, &dev_info);
> +
> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> +	if (ret != 0)
> +		return;
> +
>  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>  		if (ports[portid].tx_set_md_cb[queue]) {
>  			rte_eth_remove_tx_callback(portid, queue, @@ -
> 221,3 +231,17 @@
>  			ports[portid].tx_set_md_cb[queue] = NULL;
>  		}
>  }
> +
> +int
> +eth_dev_info_get_print_err(uint16_t port_id,
> +					struct rte_eth_dev_info *dev_info) {
> +	int ret;
> +
> +	ret = rte_eth_dev_info_get(port_id, dev_info);
> +	if (ret != 0)
> +		printf("Error during getting device (port %u) info: %s\n",
> +				port_id, strerror(-ret));
> +
> +	return ret;
> +}
> --
> 1.8.3.1
  
Qi Zhang Sept. 30, 2019, 8:49 a.m. UTC | #4
The issue has been fixed in below patch 
http://patchwork.dpdk.org/patch/60091/


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Zhao1, Wei
> Sent: Monday, September 30, 2019 4:44 PM
> To: Andrew Rybchenko <arybchenko@solarflare.com>; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Iremonger,
> Bernard <bernard.iremonger@intel.com>; Adrien Mazarguil
> <adrien.mazarguil@6wind.com>
> Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> Subject: Re: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
> ethdev info
> 
> Hi, Ivan Ilchenko and Andrew Rybchenko
> 
> An error is cause by this patch,  it is very easy to reappear.
> You only need to bind a ixgbe nic driver , and run up testpmd:
> ./x86_64-native-linuxapp-gcc/app/testpmd  -c 0xff -n 4 -- -i --portmask=0xff
> --rxq=8 --txq=8 --port-topology=loop
> 
> Then input a rte_flow rss action cmd:
> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / end actions
> rss queues 4 5 end / end bad arguments
> 
> so, rte_flow action rss can not be used after this patch.
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Andrew Rybchenko
> > Sent: Tuesday, August 27, 2019 10:25 PM
> > To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> > <jingjing.wu@intel.com>; Iremonger, Bernard
> > <bernard.iremonger@intel.com>; Adrien Mazarguil
> > <adrien.mazarguil@6wind.com>
> > Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > Subject: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
> > ethdev info
> >
> > From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> >
> > Add eth_dev_info_get_print_err() which is a wrapper for
> > rte_eth_dev_info_get() printing error if rte_eth_dev_info_get() fails
> > and returning its status code.
> >
> > Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > ---
> >  app/test-pmd/cmdline.c      | 119
> > ++++++++++++++++++++++++++++++++++++--------
> >  app/test-pmd/cmdline_flow.c |   5 +-
> >  app/test-pmd/config.c       |  78 ++++++++++++++++++++++++-----
> >  app/test-pmd/parameters.c   |   8 ++-
> >  app/test-pmd/testpmd.c      |  30 ++++++++---
> >  app/test-pmd/testpmd.h      |   3 ++
> >  app/test-pmd/util.c         |  28 ++++++++++-
> >  7 files changed, 228 insertions(+), 43 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > 56783aa..d4ab143 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -2273,6 +2273,7 @@ struct cmd_config_rss {
> >  	int all_updated = 1;
> >  	int diag;
> >  	uint16_t i;
> > +	int ret;
> >
> >  	if (!strcmp(res->value, "all"))
> >  		rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | @@ -2312,7
> > +2313,10 @@ struct cmd_config_rss {
> >  	RTE_ETH_FOREACH_DEV(i) {
> >  		struct rte_eth_rss_conf local_rss_conf;
> >
> > -		rte_eth_dev_info_get(i, &dev_info);
> > +		ret = eth_dev_info_get_print_err(i, &dev_info);
> > +		if (ret != 0)
> > +			return;
> > +
> >  		if (use_default)
> >  			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
> >
> > @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint8_t hash_key_size;
> >  	uint32_t key_len;
> > +	int ret;
> >
> >  	memset(&dev_info, 0, sizeof(dev_info));
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (dev_info.hash_key_size > 0 &&
> >  			dev_info.hash_key_size <= sizeof(hash_key))
> >  		hash_key_size = dev_info.hash_key_size; @@ -2945,7
> > +2953,10 @@ struct cmd_config_rss_reta {
> >  	struct cmd_config_rss_reta *res = parsed_result;
> >
> >  	memset(&dev_info, 0, sizeof(dev_info));
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (dev_info.reta_size == 0) {
> >  		printf("Redirection table size is 0 which is "
> >  					"invalid for RSS\n");
> > @@ -3063,9 +3074,13 @@ struct cmd_showport_reta {
> >  	struct rte_eth_rss_reta_entry64 reta_conf[8];
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t max_reta_size;
> > +	int ret;
> >
> >  	memset(&dev_info, 0, sizeof(dev_info));
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
> >  	if (res->size == 0 || res->size > max_reta_size) {
> >  		printf("Invalid redirection table size: %u (1-%u)\n", @@ -
> > 3292,6 +3307,7 @@ struct cmd_config_burst {
> >  	struct cmd_config_burst *res = parsed_result;
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t rec_nb_pkts;
> > +	int ret;
> >
> >  	if (!all_ports_stopped()) {
> >  		printf("Please stop all ports first\n"); @@ -3305,7 +3321,10 @@
> > struct cmd_config_burst {
> >  			 * size for all ports, so assume all ports are the same
> >  			 * NIC model and use the values from Port 0.
> >  			 */
> > -			rte_eth_dev_info_get(0, &dev_info);
> > +			ret = eth_dev_info_get_print_err(0, &dev_info);
> > +			if (ret != 0)
> > +				return;
> > +
> >  			rec_nb_pkts =
> > dev_info.default_rxportconf.burst_size;
> >
> >  			if (rec_nb_pkts == 0) {
> > @@ -4375,6 +4394,7 @@ struct cmd_csum_result {  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint64_t tx_offloads;
> > +	int ret;
> >
> >  	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
> >  	printf("Parse tunnel is %s\n",
> > @@ -4393,7 +4413,10 @@ struct cmd_csum_result {
> >  		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ?
> > "hw" : "sw");
> >
> >  	/* display warnings if configuration is not supported by the NIC */
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
> >  		(dev_info.tx_offload_capa &
> > DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
> >  		printf("Warning: hardware IP checksum enabled but not "
> > @@ -4447,6 +4470,7 @@ struct cmd_csum_result {
> >  	int hw = 0;
> >  	uint64_t csum_offloads = 0;
> >  	struct rte_eth_dev_info dev_info;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
> >  		printf("invalid port %d\n", res->port_id); @@ -4457,7
> > +4481,10 @@ struct cmd_csum_result {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (!strcmp(res->mode, "set")) {
> >
> >  		if (!strcmp(res->hwsw, "hw"))
> > @@ -4645,6 +4672,7 @@ struct cmd_tso_set_result {  {
> >  	struct cmd_tso_set_result *res = parsed_result;
> >  	struct rte_eth_dev_info dev_info;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
> >  		return;
> > @@ -4656,7 +4684,10 @@ struct cmd_tso_set_result {
> >  	if (!strcmp(res->mode, "set"))
> >  		ports[res->port_id].tso_segsz = res->tso_segsz;
> >
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if ((ports[res->port_id].tso_segsz != 0) &&
> >  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
> >  		printf("Error: TSO is not supported by port %d\n", @@ -
> > 4677,7 +4708,10 @@ struct cmd_tso_set_result {
> >  	cmd_config_queue_tx_offloads(&ports[res->port_id]);
> >
> >  	/* display warnings if configuration is not supported by the NIC */
> > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if ((ports[res->port_id].tso_segsz != 0) &&
> >  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
> >  		printf("Warning: TSO enabled but not "
> > @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {  {
> >  	struct rte_eth_dev_info dev_info;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	eth_dev_info_get_print_err(port_id, &dev_info);
> > +
> >  	if (!(dev_info.tx_offload_capa &
> > DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
> >  		printf("Warning: VXLAN TUNNEL TSO not supported therefore "
> >  		       "not enabled for port %d\n", port_id); @@ -11184,7
> > +11219,11 @@ struct cmd_flow_director_result {
> >  			struct rte_eth_dev_info dev_info;
> >
> >  			memset(&dev_info, 0, sizeof(dev_info));
> > -			rte_eth_dev_info_get(res->port_id, &dev_info);
> > +			ret = eth_dev_info_get_print_err(res->port_id,
> > +						&dev_info);
> > +			if (ret != 0)
> > +				return;
> > +
> >  			errno = 0;
> >  			vf_id = strtoul(res->pf_vf + 2, &end, 10);
> >  			if (errno != 0 || *end != '\0' ||
> > @@ -14176,7 +14215,10 @@ struct cmd_macsec_offload_on_result {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
> > #ifdef RTE_LIBRTE_IXGBE_PMD
> >  		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); @@ -
> > 14270,7 +14312,10 @@ struct cmd_macsec_offload_off_result {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
> > #ifdef RTE_LIBRTE_IXGBE_PMD
> >  		ret = rte_pmd_ixgbe_macsec_disable(port_id);
> > @@ -17980,8 +18025,12 @@ struct cmd_rx_offload_get_capa_result {
> >  	portid_t port_id = res->port_id;
> >  	uint64_t queue_offloads;
> >  	uint64_t port_offloads;
> > +	int ret;
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> >  	queue_offloads = dev_info.rx_queue_offload_capa;
> >  	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
> >
> > @@ -18053,6 +18102,7 @@ struct cmd_rx_offload_get_configuration_result
> > {
> >  	uint64_t queue_offloads;
> >  	uint16_t nb_rx_queues;
> >  	int q;
> > +	int ret;
> >
> >  	printf("Rx Offloading Configuration of port %d :\n", port_id);
> >
> > @@ -18061,7 +18111,10 @@ struct
> > cmd_rx_offload_get_configuration_result {
> >  	print_rx_offloads(port_offloads);
> >  	printf("\n");
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	nb_rx_queues = dev_info.nb_rx_queues;
> >  	for (q = 0; q < nb_rx_queues; q++) {
> >  		queue_offloads = port->rx_conf[q].offloads; @@ -18160,6
> > +18213,7 @@ struct cmd_config_per_port_rx_offload_result {
> >  	uint64_t single_offload;
> >  	uint16_t nb_rx_queues;
> >  	int q;
> > +	int ret;
> >
> >  	if (port->port_status != RTE_PORT_STOPPED) {
> >  		printf("Error: Can't config offload when Port %d "
> > @@ -18173,7 +18227,10 @@ struct cmd_config_per_port_rx_offload_result
> > {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	nb_rx_queues = dev_info.nb_rx_queues;
> >  	if (!strcmp(res->on_off, "on")) {
> >  		port->dev_conf.rxmode.offloads |= single_offload; @@ -
> > 18261,6 +18318,7 @@ struct cmd_config_per_queue_rx_offload_result {
> >  	uint16_t queue_id = res->queue_id;
> >  	struct rte_port *port = &ports[port_id];
> >  	uint64_t single_offload;
> > +	int ret;
> >
> >  	if (port->port_status != RTE_PORT_STOPPED) {
> >  		printf("Error: Can't config offload when Port %d "
> > @@ -18268,7 +18326,10 @@ struct
> > cmd_config_per_queue_rx_offload_result {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (queue_id >= dev_info.nb_rx_queues) {
> >  		printf("Error: input queue_id should be 0 ... "
> >  		       "%d\n", dev_info.nb_rx_queues - 1); @@ -18374,8
> > +18435,12 @@ struct cmd_tx_offload_get_capa_result {
> >  	portid_t port_id = res->port_id;
> >  	uint64_t queue_offloads;
> >  	uint64_t port_offloads;
> > +	int ret;
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> >  	queue_offloads = dev_info.tx_queue_offload_capa;
> >  	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
> >
> > @@ -18447,6 +18512,7 @@ struct cmd_tx_offload_get_configuration_result
> > {
> >  	uint64_t queue_offloads;
> >  	uint16_t nb_tx_queues;
> >  	int q;
> > +	int ret;
> >
> >  	printf("Tx Offloading Configuration of port %d :\n", port_id);
> >
> > @@ -18455,7 +18521,10 @@ struct
> > cmd_tx_offload_get_configuration_result {
> >  	print_tx_offloads(port_offloads);
> >  	printf("\n");
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	nb_tx_queues = dev_info.nb_tx_queues;
> >  	for (q = 0; q < nb_tx_queues; q++) {
> >  		queue_offloads = port->tx_conf[q].offloads; @@ -18559,6
> > +18628,7 @@ struct cmd_config_per_port_tx_offload_result {
> >  	uint64_t single_offload;
> >  	uint16_t nb_tx_queues;
> >  	int q;
> > +	int ret;
> >
> >  	if (port->port_status != RTE_PORT_STOPPED) {
> >  		printf("Error: Can't config offload when Port %d "
> > @@ -18572,7 +18642,10 @@ struct cmd_config_per_port_tx_offload_result
> > {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	nb_tx_queues = dev_info.nb_tx_queues;
> >  	if (!strcmp(res->on_off, "on")) {
> >  		port->dev_conf.txmode.offloads |= single_offload; @@ -
> > 18663,6 +18736,7 @@ struct cmd_config_per_queue_tx_offload_result {
> >  	uint16_t queue_id = res->queue_id;
> >  	struct rte_port *port = &ports[port_id];
> >  	uint64_t single_offload;
> > +	int ret;
> >
> >  	if (port->port_status != RTE_PORT_STOPPED) {
> >  		printf("Error: Can't config offload when Port %d "
> > @@ -18670,7 +18744,10 @@ struct
> > cmd_config_per_queue_tx_offload_result {
> >  		return;
> >  	}
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (queue_id >= dev_info.nb_tx_queues) {
> >  		printf("Error: input queue_id should be 0 ... "
> >  		       "%d\n", dev_info.nb_tx_queues - 1); diff --git
> > a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index
> > 4958713..369426c 100644
> > --- a/app/test-pmd/cmdline_flow.c
> > +++ b/app/test-pmd/cmdline_flow.c
> > @@ -3550,7 +3550,10 @@ static int comp_vc_action_rss_queue(struct
> > context *, const struct token *,
> >  	    ctx->port != (portid_t)RTE_PORT_ALL) {
> >  		struct rte_eth_dev_info info;
> >
> > -		rte_eth_dev_info_get(ctx->port, &info);
> > +		ret = rte_eth_dev_info_get(ctx->port, &info);
> > +		if (ret != 0)
> > +			return ret;
> > +
> >  		action_rss_data->conf.key_len =
> >  			RTE_MIN(sizeof(action_rss_data->key),
> >  				info.hash_key_size);
> > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > 1a5a5c1..0ef7c36 100644
> > --- a/app/test-pmd/config.c
> > +++ b/app/test-pmd/config.c
> > @@ -471,6 +471,7 @@ static int bus_match_all(const struct rte_bus
> > *bus, const void *data)
> >  	static const char *info_border = "*********************";
> >  	uint16_t mtu;
> >  	char name[RTE_ETH_NAME_MAX_LEN];
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
> >  		print_valid_ports();
> > @@ -479,7 +480,11 @@ static int bus_match_all(const struct rte_bus
> > *bus, const void *data)
> >  	port = &ports[port_id];
> >  	rte_eth_link_get_nowait(port_id, &link);
> >  	memset(&dev_info, 0, sizeof(dev_info));
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	printf("\n%s Infos for port %-2d %s\n",
> >  	       info_border, port_id, info_border);
> >  	rte_eth_macaddr_get(port_id, &mac_addr); @@ -618,6 +623,7 @@ static
> > int bus_match_all(const struct rte_bus *bus, const void *data)
> >  	struct rte_eth_link link;
> >  	struct rte_eth_dev_info dev_info;
> >  	char name[RTE_ETH_NAME_MAX_LEN];
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
> >  		print_valid_ports();
> > @@ -625,7 +631,11 @@ static int bus_match_all(const struct rte_bus
> > *bus, const void *data)
> >  	}
> >
> >  	rte_eth_link_get_nowait(port_id, &link);
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	rte_eth_dev_get_name_by_port(port_id, name);
> >  	rte_eth_macaddr_get(port_id, &mac_addr);
> >
> > @@ -642,11 +652,14 @@ static int bus_match_all(const struct rte_bus
> > *bus, const void *data)  {
> >  	struct rte_eth_dev_info dev_info;
> >  	static const char *info_border = "************";
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> >
> >  	printf("\n%s Port %d supported offload features: %s\n",
> >  		info_border, port_id, info_border); @@ -1140,10 +1153,15 @@ void
> > print_valid_ports(void)  {
> >  	int diag;
> >  	struct rte_eth_dev_info dev_info;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) {
> >  		printf("Set MTU failed. MTU:%u is not in valid range, min:%u
> > - max:%u\n",
> >  			mtu, dev_info.min_mtu, dev_info.max_mtu); @@ -
> > 1618,13 +1636,17 @@ struct igb_ring_desc_16_bytes {  #endif
> >  			   uint16_t desc_id)
> >  {
> > +	int ret;
> >  	struct igb_ring_desc_16_bytes *ring =
> >  		(struct igb_ring_desc_16_bytes *)ring_mz->addr;  #ifndef
> > RTE_LIBRTE_I40E_16BYTE_RX_DESC
> >  	struct rte_eth_dev_info dev_info;
> >
> >  	memset(&dev_info, 0, sizeof(dev_info));
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (strstr(dev_info.driver_name, "i40e") != NULL) {
> >  		/* 32 bytes RX descriptor, i40e only */
> >  		struct igb_ring_desc_32_bytes *ring = @@ -1834,11 +1856,15 @@
> > struct igb_ring_desc_16_bytes {
> >  	int diag;
> >  	struct rte_eth_dev_info dev_info;
> >  	uint8_t hash_key_size;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if (dev_info.hash_key_size > 0 &&
> >  			dev_info.hash_key_size <= sizeof(rss_key))
> >  		hash_key_size = dev_info.hash_key_size; @@ -2796,11
> > +2822,15 @@ struct igb_ring_desc_16_bytes {  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> >
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
> >  		if (!ports[portid].rx_dump_cb[queue])
> >  			ports[portid].rx_dump_cb[queue] =
> > @@ -2813,10 +2843,15 @@ struct igb_ring_desc_16_bytes {  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> >  		if (!ports[portid].tx_dump_cb[queue])
> >  			ports[portid].tx_dump_cb[queue] =
> > @@ -2829,10 +2864,15 @@ struct igb_ring_desc_16_bytes {  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
> >  		if (ports[portid].rx_dump_cb[queue]) {
> >  			rte_eth_remove_rx_callback(portid, queue, @@ -
> > 2846,10 +2886,15 @@ struct igb_ring_desc_16_bytes {  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> >  		if (ports[portid].tx_dump_cb[queue]) {
> >  			rte_eth_remove_tx_callback(portid, queue, @@ -
> > 3037,6 +3082,7 @@ struct igb_ring_desc_16_bytes {
> > tx_vlan_set(portid_t port_id, uint16_t vlan_id)  {
> >  	struct rte_eth_dev_info dev_info;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> > @@ -3048,7 +3094,11 @@ struct igb_ring_desc_16_bytes {
> >  		printf("Error, as QinQ has been enabled.\n");
> >  		return;
> >  	}
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
> >  		printf("Error: vlan insert is not supported by port %d\n",
> >  			port_id);
> > @@ -3064,6 +3114,7 @@ struct igb_ring_desc_16_bytes {
> > tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)  {
> >  	struct rte_eth_dev_info dev_info;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> >  		return;
> > @@ -3072,7 +3123,10 @@ struct igb_ring_desc_16_bytes {
> >  	if (vlan_id_is_invalid(vlan_id_outer))
> >  		return;
> >
> > -	rte_eth_dev_info_get(port_id, &dev_info);
> > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
> >  		printf("Error: qinq insert not supported by port %d\n",
> >  			port_id);
> > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> > index 5244872..6c78dca 100644
> > --- a/app/test-pmd/parameters.c
> > +++ b/app/test-pmd/parameters.c
> > @@ -562,6 +562,7 @@
> >  	uint64_t tx_offloads = tx_mode.offloads;
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t rec_nb_pkts;
> > +	int ret;
> >
> >  	static struct option lgopts[] = {
> >  		{ "help",			0, 0, 0 },
> > @@ -1050,7 +1051,12 @@
> >  					 * value, on the assumption that all
> >  					 * ports are of the same NIC model.
> >  					 */
> > -					rte_eth_dev_info_get(0, &dev_info);
> > +					ret = eth_dev_info_get_print_err(
> > +								0,
> > +								&dev_info);
> > +					if (ret != 0)
> > +						return;
> > +
> >  					rec_nb_pkts = dev_info
> >
> > 	.default_rxportconf.burst_size;
> >
> > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> > e8e2a39..0117236 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1016,7 +1016,8 @@ struct extmem_param {
> >  	struct rte_eth_dev_info dev_info;
> >
> >  	RTE_ETH_FOREACH_DEV(pi) {
> > -		rte_eth_dev_info_get(pi, &dev_info);
> > +		eth_dev_info_get_print_err(pi, &dev_info);
> > +
> >  		if (dev_info.max_rx_queues < allowed_max_rxq) {
> >  			allowed_max_rxq = dev_info.max_rx_queues;
> >  			*pid = pi;
> > @@ -1062,7 +1063,8 @@ struct extmem_param {
> >  	struct rte_eth_dev_info dev_info;
> >
> >  	RTE_ETH_FOREACH_DEV(pi) {
> > -		rte_eth_dev_info_get(pi, &dev_info);
> > +		eth_dev_info_get_print_err(pi, &dev_info);
> > +
> >  		if (dev_info.max_tx_queues < allowed_max_txq) {
> >  			allowed_max_txq = dev_info.max_tx_queues;
> >  			*pid = pi;
> > @@ -1109,6 +1111,7 @@ struct extmem_param {
> >  	uint16_t data_size;
> >  	bool warning = 0;
> >  	int k;
> > +	int ret;
> >
> >  	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
> >
> > @@ -1136,7 +1139,10 @@ struct extmem_param {
> >  		/* Apply default TxRx configuration for all ports */
> >  		port->dev_conf.txmode = tx_mode;
> >  		port->dev_conf.rxmode = rx_mode;
> > -		rte_eth_dev_info_get(pid, &port->dev_info);
> > +
> > +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> > +		if (ret != 0)
> > +			return;
> >
> >  		if (!(port->dev_info.tx_offload_capa &
> >  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE)) @@ -1295,10
> > +1301,14 @@ struct extmem_param {  reconfig(portid_t new_port_id,
> > unsigned socket_id)  {
> >  	struct rte_port *port;
> > +	int ret;
> >
> >  	/* Reconfiguration of Ethernet ports. */
> >  	port = &ports[new_port_id];
> > -	rte_eth_dev_info_get(new_port_id, &port->dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
> > +	if (ret != 0)
> > +		return;
> >
> >  	/* set flag to initialize port/queue */
> >  	port->need_reconfig = 1;
> > @@ -2927,11 +2937,16 @@ struct pmd_test_command {  {
> >  	portid_t pid;
> >  	struct rte_port *port;
> > +	int ret;
> >
> >  	RTE_ETH_FOREACH_DEV(pid) {
> >  		port = &ports[pid];
> >  		port->dev_conf.fdir_conf = fdir_conf;
> > -		rte_eth_dev_info_get(pid, &port->dev_info);
> > +
> > +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> > +		if (ret != 0)
> > +			return;
> > +
> >  		if (nb_rxq > 1) {
> >  			port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
> >  			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = @@ -
> > 3106,7 +3121,10 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
> >  	retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
> >  	if (retval < 0)
> >  		return retval;
> > -	rte_eth_dev_info_get(pid, &rte_port->dev_info);
> > +
> > +	retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
> > +	if (retval != 0)
> > +		return retval;
> >
> >  	/* If dev_info.vmdq_pool_base is greater than 0,
> >  	 * the queue id of vmdq pools is started after pf queues.
> > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> > ce13eb8..d73955d 100644
> > --- a/app/test-pmd/testpmd.h
> > +++ b/app/test-pmd/testpmd.h
> > @@ -822,6 +822,9 @@ void port_rss_hash_key_update(portid_t port_id,
> > char rss_type[],  void setup_gro_flush_cycles(uint8_t cycles);  void
> > show_gro(portid_t port_id);  void setup_gso(const char *mode, portid_t
> > port_id);
> > +int eth_dev_info_get_print_err(uint16_t port_id,
> > +			struct rte_eth_dev_info *dev_info);
> > +
> >
> >  /* Functions to manage the set of filtered Multicast MAC addresses */
> > void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr);
> > diff -- git a/app/test-pmd/util.c b/app/test-pmd/util.c index
> > 18dfdca..009d226
> > 100644
> > --- a/app/test-pmd/util.c
> > +++ b/app/test-pmd/util.c
> > @@ -194,10 +194,15 @@
> >  {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> >  		if (!ports[portid].tx_set_md_cb[queue])
> >  			ports[portid].tx_set_md_cb[queue] = @@ -210,10 +215,15 @@
> {
> >  	struct rte_eth_dev_info dev_info;
> >  	uint16_t queue;
> > +	int ret;
> >
> >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> >  		return;
> > -	rte_eth_dev_info_get(portid, &dev_info);
> > +
> > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > +	if (ret != 0)
> > +		return;
> > +
> >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> >  		if (ports[portid].tx_set_md_cb[queue]) {
> >  			rte_eth_remove_tx_callback(portid, queue, @@ -
> > 221,3 +231,17 @@
> >  			ports[portid].tx_set_md_cb[queue] = NULL;
> >  		}
> >  }
> > +
> > +int
> > +eth_dev_info_get_print_err(uint16_t port_id,
> > +					struct rte_eth_dev_info *dev_info) {
> > +	int ret;
> > +
> > +	ret = rte_eth_dev_info_get(port_id, dev_info);
> > +	if (ret != 0)
> > +		printf("Error during getting device (port %u) info: %s\n",
> > +				port_id, strerror(-ret));
> > +
> > +	return ret;
> > +}
> > --
> > 1.8.3.1
  
Andrew Rybchenko Oct. 1, 2019, 8:09 a.m. UTC | #5
On 9/30/19 11:49 AM, Zhang, Qi Z wrote:
> The issue has been fixed in below patch
> http://patchwork.dpdk.org/patch/60091/

Thanks for the fix,
Andrew.

>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Zhao1, Wei
>> Sent: Monday, September 30, 2019 4:44 PM
>> To: Andrew Rybchenko <arybchenko@solarflare.com>; Lu, Wenzhuo
>> <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>; Iremonger,
>> Bernard <bernard.iremonger@intel.com>; Adrien Mazarguil
>> <adrien.mazarguil@6wind.com>
>> Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>> Subject: Re: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
>> ethdev info
>>
>> Hi, Ivan Ilchenko and Andrew Rybchenko
>>
>> An error is cause by this patch,  it is very easy to reappear.
>> You only need to bind a ixgbe nic driver , and run up testpmd:
>> ./x86_64-native-linuxapp-gcc/app/testpmd  -c 0xff -n 4 -- -i --portmask=0xff
>> --rxq=8 --txq=8 --port-topology=loop
>>
>> Then input a rte_flow rss action cmd:
>> flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / end actions
>> rss queues 4 5 end / end bad arguments
>>
>> so, rte_flow action rss can not be used after this patch.
>>
>>
>>> -----Original Message-----
>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Andrew Rybchenko
>>> Sent: Tuesday, August 27, 2019 10:25 PM
>>> To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
>>> <jingjing.wu@intel.com>; Iremonger, Bernard
>>> <bernard.iremonger@intel.com>; Adrien Mazarguil
>>> <adrien.mazarguil@6wind.com>
>>> Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>>> Subject: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
>>> ethdev info
>>>
>>> From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>>>
>>> Add eth_dev_info_get_print_err() which is a wrapper for
>>> rte_eth_dev_info_get() printing error if rte_eth_dev_info_get() fails
>>> and returning its status code.
>>>
>>> Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
>>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
>>> ---
>>>   app/test-pmd/cmdline.c      | 119
>>> ++++++++++++++++++++++++++++++++++++--------
>>>   app/test-pmd/cmdline_flow.c |   5 +-
>>>   app/test-pmd/config.c       |  78 ++++++++++++++++++++++++-----
>>>   app/test-pmd/parameters.c   |   8 ++-
>>>   app/test-pmd/testpmd.c      |  30 ++++++++---
>>>   app/test-pmd/testpmd.h      |   3 ++
>>>   app/test-pmd/util.c         |  28 ++++++++++-
>>>   7 files changed, 228 insertions(+), 43 deletions(-)
>>>
>>> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
>>> 56783aa..d4ab143 100644
>>> --- a/app/test-pmd/cmdline.c
>>> +++ b/app/test-pmd/cmdline.c
>>> @@ -2273,6 +2273,7 @@ struct cmd_config_rss {
>>>   	int all_updated = 1;
>>>   	int diag;
>>>   	uint16_t i;
>>> +	int ret;
>>>
>>>   	if (!strcmp(res->value, "all"))
>>>   		rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | @@ -2312,7
>>> +2313,10 @@ struct cmd_config_rss {
>>>   	RTE_ETH_FOREACH_DEV(i) {
>>>   		struct rte_eth_rss_conf local_rss_conf;
>>>
>>> -		rte_eth_dev_info_get(i, &dev_info);
>>> +		ret = eth_dev_info_get_print_err(i, &dev_info);
>>> +		if (ret != 0)
>>> +			return;
>>> +
>>>   		if (use_default)
>>>   			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
>>>
>>> @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint8_t hash_key_size;
>>>   	uint32_t key_len;
>>> +	int ret;
>>>
>>>   	memset(&dev_info, 0, sizeof(dev_info));
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (dev_info.hash_key_size > 0 &&
>>>   			dev_info.hash_key_size <= sizeof(hash_key))
>>>   		hash_key_size = dev_info.hash_key_size; @@ -2945,7
>>> +2953,10 @@ struct cmd_config_rss_reta {
>>>   	struct cmd_config_rss_reta *res = parsed_result;
>>>
>>>   	memset(&dev_info, 0, sizeof(dev_info));
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (dev_info.reta_size == 0) {
>>>   		printf("Redirection table size is 0 which is "
>>>   					"invalid for RSS\n");
>>> @@ -3063,9 +3074,13 @@ struct cmd_showport_reta {
>>>   	struct rte_eth_rss_reta_entry64 reta_conf[8];
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t max_reta_size;
>>> +	int ret;
>>>
>>>   	memset(&dev_info, 0, sizeof(dev_info));
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
>>>   	if (res->size == 0 || res->size > max_reta_size) {
>>>   		printf("Invalid redirection table size: %u (1-%u)\n", @@ -
>>> 3292,6 +3307,7 @@ struct cmd_config_burst {
>>>   	struct cmd_config_burst *res = parsed_result;
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t rec_nb_pkts;
>>> +	int ret;
>>>
>>>   	if (!all_ports_stopped()) {
>>>   		printf("Please stop all ports first\n"); @@ -3305,7 +3321,10 @@
>>> struct cmd_config_burst {
>>>   			 * size for all ports, so assume all ports are the same
>>>   			 * NIC model and use the values from Port 0.
>>>   			 */
>>> -			rte_eth_dev_info_get(0, &dev_info);
>>> +			ret = eth_dev_info_get_print_err(0, &dev_info);
>>> +			if (ret != 0)
>>> +				return;
>>> +
>>>   			rec_nb_pkts =
>>> dev_info.default_rxportconf.burst_size;
>>>
>>>   			if (rec_nb_pkts == 0) {
>>> @@ -4375,6 +4394,7 @@ struct cmd_csum_result {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint64_t tx_offloads;
>>> +	int ret;
>>>
>>>   	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
>>>   	printf("Parse tunnel is %s\n",
>>> @@ -4393,7 +4413,10 @@ struct cmd_csum_result {
>>>   		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ?
>>> "hw" : "sw");
>>>
>>>   	/* display warnings if configuration is not supported by the NIC */
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
>>>   		(dev_info.tx_offload_capa &
>>> DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
>>>   		printf("Warning: hardware IP checksum enabled but not "
>>> @@ -4447,6 +4470,7 @@ struct cmd_csum_result {
>>>   	int hw = 0;
>>>   	uint64_t csum_offloads = 0;
>>>   	struct rte_eth_dev_info dev_info;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
>>>   		printf("invalid port %d\n", res->port_id); @@ -4457,7
>>> +4481,10 @@ struct cmd_csum_result {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (!strcmp(res->mode, "set")) {
>>>
>>>   		if (!strcmp(res->hwsw, "hw"))
>>> @@ -4645,6 +4672,7 @@ struct cmd_tso_set_result {  {
>>>   	struct cmd_tso_set_result *res = parsed_result;
>>>   	struct rte_eth_dev_info dev_info;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
>>>   		return;
>>> @@ -4656,7 +4684,10 @@ struct cmd_tso_set_result {
>>>   	if (!strcmp(res->mode, "set"))
>>>   		ports[res->port_id].tso_segsz = res->tso_segsz;
>>>
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if ((ports[res->port_id].tso_segsz != 0) &&
>>>   		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
>>>   		printf("Error: TSO is not supported by port %d\n", @@ -
>>> 4677,7 +4708,10 @@ struct cmd_tso_set_result {
>>>   	cmd_config_queue_tx_offloads(&ports[res->port_id]);
>>>
>>>   	/* display warnings if configuration is not supported by the NIC */
>>> -	rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if ((ports[res->port_id].tso_segsz != 0) &&
>>>   		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
>>>   		printf("Warning: TSO enabled but not "
>>> @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	eth_dev_info_get_print_err(port_id, &dev_info);
>>> +
>>>   	if (!(dev_info.tx_offload_capa &
>>> DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
>>>   		printf("Warning: VXLAN TUNNEL TSO not supported therefore "
>>>   		       "not enabled for port %d\n", port_id); @@ -11184,7
>>> +11219,11 @@ struct cmd_flow_director_result {
>>>   			struct rte_eth_dev_info dev_info;
>>>
>>>   			memset(&dev_info, 0, sizeof(dev_info));
>>> -			rte_eth_dev_info_get(res->port_id, &dev_info);
>>> +			ret = eth_dev_info_get_print_err(res->port_id,
>>> +						&dev_info);
>>> +			if (ret != 0)
>>> +				return;
>>> +
>>>   			errno = 0;
>>>   			vf_id = strtoul(res->pf_vf + 2, &end, 10);
>>>   			if (errno != 0 || *end != '\0' ||
>>> @@ -14176,7 +14215,10 @@ struct cmd_macsec_offload_on_result {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
>>> #ifdef RTE_LIBRTE_IXGBE_PMD
>>>   		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); @@ -
>>> 14270,7 +14312,10 @@ struct cmd_macsec_offload_off_result {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
>>> #ifdef RTE_LIBRTE_IXGBE_PMD
>>>   		ret = rte_pmd_ixgbe_macsec_disable(port_id);
>>> @@ -17980,8 +18025,12 @@ struct cmd_rx_offload_get_capa_result {
>>>   	portid_t port_id = res->port_id;
>>>   	uint64_t queue_offloads;
>>>   	uint64_t port_offloads;
>>> +	int ret;
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>>   	queue_offloads = dev_info.rx_queue_offload_capa;
>>>   	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
>>>
>>> @@ -18053,6 +18102,7 @@ struct cmd_rx_offload_get_configuration_result
>>> {
>>>   	uint64_t queue_offloads;
>>>   	uint16_t nb_rx_queues;
>>>   	int q;
>>> +	int ret;
>>>
>>>   	printf("Rx Offloading Configuration of port %d :\n", port_id);
>>>
>>> @@ -18061,7 +18111,10 @@ struct
>>> cmd_rx_offload_get_configuration_result {
>>>   	print_rx_offloads(port_offloads);
>>>   	printf("\n");
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	nb_rx_queues = dev_info.nb_rx_queues;
>>>   	for (q = 0; q < nb_rx_queues; q++) {
>>>   		queue_offloads = port->rx_conf[q].offloads; @@ -18160,6
>>> +18213,7 @@ struct cmd_config_per_port_rx_offload_result {
>>>   	uint64_t single_offload;
>>>   	uint16_t nb_rx_queues;
>>>   	int q;
>>> +	int ret;
>>>
>>>   	if (port->port_status != RTE_PORT_STOPPED) {
>>>   		printf("Error: Can't config offload when Port %d "
>>> @@ -18173,7 +18227,10 @@ struct cmd_config_per_port_rx_offload_result
>>> {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	nb_rx_queues = dev_info.nb_rx_queues;
>>>   	if (!strcmp(res->on_off, "on")) {
>>>   		port->dev_conf.rxmode.offloads |= single_offload; @@ -
>>> 18261,6 +18318,7 @@ struct cmd_config_per_queue_rx_offload_result {
>>>   	uint16_t queue_id = res->queue_id;
>>>   	struct rte_port *port = &ports[port_id];
>>>   	uint64_t single_offload;
>>> +	int ret;
>>>
>>>   	if (port->port_status != RTE_PORT_STOPPED) {
>>>   		printf("Error: Can't config offload when Port %d "
>>> @@ -18268,7 +18326,10 @@ struct
>>> cmd_config_per_queue_rx_offload_result {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (queue_id >= dev_info.nb_rx_queues) {
>>>   		printf("Error: input queue_id should be 0 ... "
>>>   		       "%d\n", dev_info.nb_rx_queues - 1); @@ -18374,8
>>> +18435,12 @@ struct cmd_tx_offload_get_capa_result {
>>>   	portid_t port_id = res->port_id;
>>>   	uint64_t queue_offloads;
>>>   	uint64_t port_offloads;
>>> +	int ret;
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>>   	queue_offloads = dev_info.tx_queue_offload_capa;
>>>   	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
>>>
>>> @@ -18447,6 +18512,7 @@ struct cmd_tx_offload_get_configuration_result
>>> {
>>>   	uint64_t queue_offloads;
>>>   	uint16_t nb_tx_queues;
>>>   	int q;
>>> +	int ret;
>>>
>>>   	printf("Tx Offloading Configuration of port %d :\n", port_id);
>>>
>>> @@ -18455,7 +18521,10 @@ struct
>>> cmd_tx_offload_get_configuration_result {
>>>   	print_tx_offloads(port_offloads);
>>>   	printf("\n");
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	nb_tx_queues = dev_info.nb_tx_queues;
>>>   	for (q = 0; q < nb_tx_queues; q++) {
>>>   		queue_offloads = port->tx_conf[q].offloads; @@ -18559,6
>>> +18628,7 @@ struct cmd_config_per_port_tx_offload_result {
>>>   	uint64_t single_offload;
>>>   	uint16_t nb_tx_queues;
>>>   	int q;
>>> +	int ret;
>>>
>>>   	if (port->port_status != RTE_PORT_STOPPED) {
>>>   		printf("Error: Can't config offload when Port %d "
>>> @@ -18572,7 +18642,10 @@ struct cmd_config_per_port_tx_offload_result
>>> {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	nb_tx_queues = dev_info.nb_tx_queues;
>>>   	if (!strcmp(res->on_off, "on")) {
>>>   		port->dev_conf.txmode.offloads |= single_offload; @@ -
>>> 18663,6 +18736,7 @@ struct cmd_config_per_queue_tx_offload_result {
>>>   	uint16_t queue_id = res->queue_id;
>>>   	struct rte_port *port = &ports[port_id];
>>>   	uint64_t single_offload;
>>> +	int ret;
>>>
>>>   	if (port->port_status != RTE_PORT_STOPPED) {
>>>   		printf("Error: Can't config offload when Port %d "
>>> @@ -18670,7 +18744,10 @@ struct
>>> cmd_config_per_queue_tx_offload_result {
>>>   		return;
>>>   	}
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (queue_id >= dev_info.nb_tx_queues) {
>>>   		printf("Error: input queue_id should be 0 ... "
>>>   		       "%d\n", dev_info.nb_tx_queues - 1); diff --git
>>> a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index
>>> 4958713..369426c 100644
>>> --- a/app/test-pmd/cmdline_flow.c
>>> +++ b/app/test-pmd/cmdline_flow.c
>>> @@ -3550,7 +3550,10 @@ static int comp_vc_action_rss_queue(struct
>>> context *, const struct token *,
>>>   	    ctx->port != (portid_t)RTE_PORT_ALL) {
>>>   		struct rte_eth_dev_info info;
>>>
>>> -		rte_eth_dev_info_get(ctx->port, &info);
>>> +		ret = rte_eth_dev_info_get(ctx->port, &info);
>>> +		if (ret != 0)
>>> +			return ret;
>>> +
>>>   		action_rss_data->conf.key_len =
>>>   			RTE_MIN(sizeof(action_rss_data->key),
>>>   				info.hash_key_size);
>>> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
>>> 1a5a5c1..0ef7c36 100644
>>> --- a/app/test-pmd/config.c
>>> +++ b/app/test-pmd/config.c
>>> @@ -471,6 +471,7 @@ static int bus_match_all(const struct rte_bus
>>> *bus, const void *data)
>>>   	static const char *info_border = "*********************";
>>>   	uint16_t mtu;
>>>   	char name[RTE_ETH_NAME_MAX_LEN];
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
>>>   		print_valid_ports();
>>> @@ -479,7 +480,11 @@ static int bus_match_all(const struct rte_bus
>>> *bus, const void *data)
>>>   	port = &ports[port_id];
>>>   	rte_eth_link_get_nowait(port_id, &link);
>>>   	memset(&dev_info, 0, sizeof(dev_info));
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	printf("\n%s Infos for port %-2d %s\n",
>>>   	       info_border, port_id, info_border);
>>>   	rte_eth_macaddr_get(port_id, &mac_addr); @@ -618,6 +623,7 @@ static
>>> int bus_match_all(const struct rte_bus *bus, const void *data)
>>>   	struct rte_eth_link link;
>>>   	struct rte_eth_dev_info dev_info;
>>>   	char name[RTE_ETH_NAME_MAX_LEN];
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
>>>   		print_valid_ports();
>>> @@ -625,7 +631,11 @@ static int bus_match_all(const struct rte_bus
>>> *bus, const void *data)
>>>   	}
>>>
>>>   	rte_eth_link_get_nowait(port_id, &link);
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	rte_eth_dev_get_name_by_port(port_id, name);
>>>   	rte_eth_macaddr_get(port_id, &mac_addr);
>>>
>>> @@ -642,11 +652,14 @@ static int bus_match_all(const struct rte_bus
>>> *bus, const void *data)  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	static const char *info_border = "************";
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>>
>>>   	printf("\n%s Port %d supported offload features: %s\n",
>>>   		info_border, port_id, info_border); @@ -1140,10 +1153,15 @@ void
>>> print_valid_ports(void)  {
>>>   	int diag;
>>>   	struct rte_eth_dev_info dev_info;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) {
>>>   		printf("Set MTU failed. MTU:%u is not in valid range, min:%u
>>> - max:%u\n",
>>>   			mtu, dev_info.min_mtu, dev_info.max_mtu); @@ -
>>> 1618,13 +1636,17 @@ struct igb_ring_desc_16_bytes {  #endif
>>>   			   uint16_t desc_id)
>>>   {
>>> +	int ret;
>>>   	struct igb_ring_desc_16_bytes *ring =
>>>   		(struct igb_ring_desc_16_bytes *)ring_mz->addr;  #ifndef
>>> RTE_LIBRTE_I40E_16BYTE_RX_DESC
>>>   	struct rte_eth_dev_info dev_info;
>>>
>>>   	memset(&dev_info, 0, sizeof(dev_info));
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (strstr(dev_info.driver_name, "i40e") != NULL) {
>>>   		/* 32 bytes RX descriptor, i40e only */
>>>   		struct igb_ring_desc_32_bytes *ring = @@ -1834,11 +1856,15 @@
>>> struct igb_ring_desc_16_bytes {
>>>   	int diag;
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint8_t hash_key_size;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if (dev_info.hash_key_size > 0 &&
>>>   			dev_info.hash_key_size <= sizeof(rss_key))
>>>   		hash_key_size = dev_info.hash_key_size; @@ -2796,11
>>> +2822,15 @@ struct igb_ring_desc_16_bytes {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>>
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
>>>   		if (!ports[portid].rx_dump_cb[queue])
>>>   			ports[portid].rx_dump_cb[queue] =
>>> @@ -2813,10 +2843,15 @@ struct igb_ring_desc_16_bytes {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>>>   		if (!ports[portid].tx_dump_cb[queue])
>>>   			ports[portid].tx_dump_cb[queue] =
>>> @@ -2829,10 +2864,15 @@ struct igb_ring_desc_16_bytes {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
>>>   		if (ports[portid].rx_dump_cb[queue]) {
>>>   			rte_eth_remove_rx_callback(portid, queue, @@ -
>>> 2846,10 +2886,15 @@ struct igb_ring_desc_16_bytes {  {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>>>   		if (ports[portid].tx_dump_cb[queue]) {
>>>   			rte_eth_remove_tx_callback(portid, queue, @@ -
>>> 3037,6 +3082,7 @@ struct igb_ring_desc_16_bytes {
>>> tx_vlan_set(portid_t port_id, uint16_t vlan_id)  {
>>>   	struct rte_eth_dev_info dev_info;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>> @@ -3048,7 +3094,11 @@ struct igb_ring_desc_16_bytes {
>>>   		printf("Error, as QinQ has been enabled.\n");
>>>   		return;
>>>   	}
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
>>>   		printf("Error: vlan insert is not supported by port %d\n",
>>>   			port_id);
>>> @@ -3064,6 +3114,7 @@ struct igb_ring_desc_16_bytes {
>>> tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)  {
>>>   	struct rte_eth_dev_info dev_info;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(port_id, ENABLED_WARN))
>>>   		return;
>>> @@ -3072,7 +3123,10 @@ struct igb_ring_desc_16_bytes {
>>>   	if (vlan_id_is_invalid(vlan_id_outer))
>>>   		return;
>>>
>>> -	rte_eth_dev_info_get(port_id, &dev_info);
>>> +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
>>>   		printf("Error: qinq insert not supported by port %d\n",
>>>   			port_id);
>>> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
>>> index 5244872..6c78dca 100644
>>> --- a/app/test-pmd/parameters.c
>>> +++ b/app/test-pmd/parameters.c
>>> @@ -562,6 +562,7 @@
>>>   	uint64_t tx_offloads = tx_mode.offloads;
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t rec_nb_pkts;
>>> +	int ret;
>>>
>>>   	static struct option lgopts[] = {
>>>   		{ "help",			0, 0, 0 },
>>> @@ -1050,7 +1051,12 @@
>>>   					 * value, on the assumption that all
>>>   					 * ports are of the same NIC model.
>>>   					 */
>>> -					rte_eth_dev_info_get(0, &dev_info);
>>> +					ret = eth_dev_info_get_print_err(
>>> +								0,
>>> +								&dev_info);
>>> +					if (ret != 0)
>>> +						return;
>>> +
>>>   					rec_nb_pkts = dev_info
>>>
>>> 	.default_rxportconf.burst_size;
>>>
>>> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
>>> e8e2a39..0117236 100644
>>> --- a/app/test-pmd/testpmd.c
>>> +++ b/app/test-pmd/testpmd.c
>>> @@ -1016,7 +1016,8 @@ struct extmem_param {
>>>   	struct rte_eth_dev_info dev_info;
>>>
>>>   	RTE_ETH_FOREACH_DEV(pi) {
>>> -		rte_eth_dev_info_get(pi, &dev_info);
>>> +		eth_dev_info_get_print_err(pi, &dev_info);
>>> +
>>>   		if (dev_info.max_rx_queues < allowed_max_rxq) {
>>>   			allowed_max_rxq = dev_info.max_rx_queues;
>>>   			*pid = pi;
>>> @@ -1062,7 +1063,8 @@ struct extmem_param {
>>>   	struct rte_eth_dev_info dev_info;
>>>
>>>   	RTE_ETH_FOREACH_DEV(pi) {
>>> -		rte_eth_dev_info_get(pi, &dev_info);
>>> +		eth_dev_info_get_print_err(pi, &dev_info);
>>> +
>>>   		if (dev_info.max_tx_queues < allowed_max_txq) {
>>>   			allowed_max_txq = dev_info.max_tx_queues;
>>>   			*pid = pi;
>>> @@ -1109,6 +1111,7 @@ struct extmem_param {
>>>   	uint16_t data_size;
>>>   	bool warning = 0;
>>>   	int k;
>>> +	int ret;
>>>
>>>   	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
>>>
>>> @@ -1136,7 +1139,10 @@ struct extmem_param {
>>>   		/* Apply default TxRx configuration for all ports */
>>>   		port->dev_conf.txmode = tx_mode;
>>>   		port->dev_conf.rxmode = rx_mode;
>>> -		rte_eth_dev_info_get(pid, &port->dev_info);
>>> +
>>> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
>>> +		if (ret != 0)
>>> +			return;
>>>
>>>   		if (!(port->dev_info.tx_offload_capa &
>>>   		      DEV_TX_OFFLOAD_MBUF_FAST_FREE)) @@ -1295,10
>>> +1301,14 @@ struct extmem_param {  reconfig(portid_t new_port_id,
>>> unsigned socket_id)  {
>>>   	struct rte_port *port;
>>> +	int ret;
>>>
>>>   	/* Reconfiguration of Ethernet ports. */
>>>   	port = &ports[new_port_id];
>>> -	rte_eth_dev_info_get(new_port_id, &port->dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>>
>>>   	/* set flag to initialize port/queue */
>>>   	port->need_reconfig = 1;
>>> @@ -2927,11 +2937,16 @@ struct pmd_test_command {  {
>>>   	portid_t pid;
>>>   	struct rte_port *port;
>>> +	int ret;
>>>
>>>   	RTE_ETH_FOREACH_DEV(pid) {
>>>   		port = &ports[pid];
>>>   		port->dev_conf.fdir_conf = fdir_conf;
>>> -		rte_eth_dev_info_get(pid, &port->dev_info);
>>> +
>>> +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
>>> +		if (ret != 0)
>>> +			return;
>>> +
>>>   		if (nb_rxq > 1) {
>>>   			port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
>>>   			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = @@ -
>>> 3106,7 +3121,10 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
>>>   	retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
>>>   	if (retval < 0)
>>>   		return retval;
>>> -	rte_eth_dev_info_get(pid, &rte_port->dev_info);
>>> +
>>> +	retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
>>> +	if (retval != 0)
>>> +		return retval;
>>>
>>>   	/* If dev_info.vmdq_pool_base is greater than 0,
>>>   	 * the queue id of vmdq pools is started after pf queues.
>>> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
>>> ce13eb8..d73955d 100644
>>> --- a/app/test-pmd/testpmd.h
>>> +++ b/app/test-pmd/testpmd.h
>>> @@ -822,6 +822,9 @@ void port_rss_hash_key_update(portid_t port_id,
>>> char rss_type[],  void setup_gro_flush_cycles(uint8_t cycles);  void
>>> show_gro(portid_t port_id);  void setup_gso(const char *mode, portid_t
>>> port_id);
>>> +int eth_dev_info_get_print_err(uint16_t port_id,
>>> +			struct rte_eth_dev_info *dev_info);
>>> +
>>>
>>>   /* Functions to manage the set of filtered Multicast MAC addresses */
>>> void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr);
>>> diff -- git a/app/test-pmd/util.c b/app/test-pmd/util.c index
>>> 18dfdca..009d226
>>> 100644
>>> --- a/app/test-pmd/util.c
>>> +++ b/app/test-pmd/util.c
>>> @@ -194,10 +194,15 @@
>>>   {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>>>   		if (!ports[portid].tx_set_md_cb[queue])
>>>   			ports[portid].tx_set_md_cb[queue] = @@ -210,10 +215,15 @@
>> {
>>>   	struct rte_eth_dev_info dev_info;
>>>   	uint16_t queue;
>>> +	int ret;
>>>
>>>   	if (port_id_is_invalid(portid, ENABLED_WARN))
>>>   		return;
>>> -	rte_eth_dev_info_get(portid, &dev_info);
>>> +
>>> +	ret = eth_dev_info_get_print_err(portid, &dev_info);
>>> +	if (ret != 0)
>>> +		return;
>>> +
>>>   	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
>>>   		if (ports[portid].tx_set_md_cb[queue]) {
>>>   			rte_eth_remove_tx_callback(portid, queue, @@ -
>>> 221,3 +231,17 @@
>>>   			ports[portid].tx_set_md_cb[queue] = NULL;
>>>   		}
>>>   }
>>> +
>>> +int
>>> +eth_dev_info_get_print_err(uint16_t port_id,
>>> +					struct rte_eth_dev_info *dev_info) {
>>> +	int ret;
>>> +
>>> +	ret = rte_eth_dev_info_get(port_id, dev_info);
>>> +	if (ret != 0)
>>> +		printf("Error during getting device (port %u) info: %s\n",
>>> +				port_id, strerror(-ret));
>>> +
>>> +	return ret;
>>> +}
>>> --
>>> 1.8.3.1
  
Zhao1, Wei Oct. 8, 2019, 7:41 a.m. UTC | #6
Thank you, this patch work well.


> -----Original Message-----
> From: Zhang, Qi Z
> Sent: Monday, September 30, 2019 4:49 PM
> To: Zhao1, Wei <wei.zhao1@intel.com>; Andrew Rybchenko
> <arybchenko@solarflare.com>; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu,
> Jingjing <jingjing.wu@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>; Adrien Mazarguil
> <adrien.mazarguil@6wind.com>
> Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> Subject: RE: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
> ethdev info
> 
> The issue has been fixed in below patch
> http://patchwork.dpdk.org/patch/60091/
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Zhao1, Wei
> > Sent: Monday, September 30, 2019 4:44 PM
> > To: Andrew Rybchenko <arybchenko@solarflare.com>; Lu, Wenzhuo
> > <wenzhuo.lu@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>;
> Iremonger,
> > Bernard <bernard.iremonger@intel.com>; Adrien Mazarguil
> > <adrien.mazarguil@6wind.com>
> > Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > Subject: Re: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of
> getting
> > ethdev info
> >
> > Hi, Ivan Ilchenko and Andrew Rybchenko
> >
> > An error is cause by this patch,  it is very easy to reappear.
> > You only need to bind a ixgbe nic driver , and run up testpmd:
> > ./x86_64-native-linuxapp-gcc/app/testpmd  -c 0xff -n 4 -- -i --
> portmask=0xff
> > --rxq=8 --txq=8 --port-topology=loop
> >
> > Then input a rte_flow rss action cmd:
> > flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / udp / end actions
> > rss queues 4 5 end / end bad arguments
> >
> > so, rte_flow action rss can not be used after this patch.
> >
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Andrew
> Rybchenko
> > > Sent: Tuesday, August 27, 2019 10:25 PM
> > > To: Lu, Wenzhuo <wenzhuo.lu@intel.com>; Wu, Jingjing
> > > <jingjing.wu@intel.com>; Iremonger, Bernard
> > > <bernard.iremonger@intel.com>; Adrien Mazarguil
> > > <adrien.mazarguil@6wind.com>
> > > Cc: dev@dpdk.org; Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > > Subject: [dpdk-dev] [PATCH 02/51] app/testpmd: check status of getting
> > > ethdev info
> > >
> > > From: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > >
> > > Add eth_dev_info_get_print_err() which is a wrapper for
> > > rte_eth_dev_info_get() printing error if rte_eth_dev_info_get() fails
> > > and returning its status code.
> > >
> > > Signed-off-by: Ivan Ilchenko <Ivan.Ilchenko@oktetlabs.ru>
> > > Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> > > ---
> > >  app/test-pmd/cmdline.c      | 119
> > > ++++++++++++++++++++++++++++++++++++--------
> > >  app/test-pmd/cmdline_flow.c |   5 +-
> > >  app/test-pmd/config.c       |  78 ++++++++++++++++++++++++-----
> > >  app/test-pmd/parameters.c   |   8 ++-
> > >  app/test-pmd/testpmd.c      |  30 ++++++++---
> > >  app/test-pmd/testpmd.h      |   3 ++
> > >  app/test-pmd/util.c         |  28 ++++++++++-
> > >  7 files changed, 228 insertions(+), 43 deletions(-)
> > >
> > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > > 56783aa..d4ab143 100644
> > > --- a/app/test-pmd/cmdline.c
> > > +++ b/app/test-pmd/cmdline.c
> > > @@ -2273,6 +2273,7 @@ struct cmd_config_rss {
> > >  	int all_updated = 1;
> > >  	int diag;
> > >  	uint16_t i;
> > > +	int ret;
> > >
> > >  	if (!strcmp(res->value, "all"))
> > >  		rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP | @@ -2312,7
> > > +2313,10 @@ struct cmd_config_rss {
> > >  	RTE_ETH_FOREACH_DEV(i) {
> > >  		struct rte_eth_rss_conf local_rss_conf;
> > >
> > > -		rte_eth_dev_info_get(i, &dev_info);
> > > +		ret = eth_dev_info_get_print_err(i, &dev_info);
> > > +		if (ret != 0)
> > > +			return;
> > > +
> > >  		if (use_default)
> > >  			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
> > >
> > > @@ -2410,9 +2414,13 @@ struct cmd_config_rss_hash_key {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint8_t hash_key_size;
> > >  	uint32_t key_len;
> > > +	int ret;
> > >
> > >  	memset(&dev_info, 0, sizeof(dev_info));
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (dev_info.hash_key_size > 0 &&
> > >  			dev_info.hash_key_size <= sizeof(hash_key))
> > >  		hash_key_size = dev_info.hash_key_size; @@ -2945,7
> > > +2953,10 @@ struct cmd_config_rss_reta {
> > >  	struct cmd_config_rss_reta *res = parsed_result;
> > >
> > >  	memset(&dev_info, 0, sizeof(dev_info));
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (dev_info.reta_size == 0) {
> > >  		printf("Redirection table size is 0 which is "
> > >  					"invalid for RSS\n");
> > > @@ -3063,9 +3074,13 @@ struct cmd_showport_reta {
> > >  	struct rte_eth_rss_reta_entry64 reta_conf[8];
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t max_reta_size;
> > > +	int ret;
> > >
> > >  	memset(&dev_info, 0, sizeof(dev_info));
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	max_reta_size = RTE_MIN(dev_info.reta_size,
> ETH_RSS_RETA_SIZE_512);
> > >  	if (res->size == 0 || res->size > max_reta_size) {
> > >  		printf("Invalid redirection table size: %u (1-%u)\n", @@ -
> > > 3292,6 +3307,7 @@ struct cmd_config_burst {
> > >  	struct cmd_config_burst *res = parsed_result;
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t rec_nb_pkts;
> > > +	int ret;
> > >
> > >  	if (!all_ports_stopped()) {
> > >  		printf("Please stop all ports first\n"); @@ -3305,7 +3321,10
> @@
> > > struct cmd_config_burst {
> > >  			 * size for all ports, so assume all ports are the same
> > >  			 * NIC model and use the values from Port 0.
> > >  			 */
> > > -			rte_eth_dev_info_get(0, &dev_info);
> > > +			ret = eth_dev_info_get_print_err(0, &dev_info);
> > > +			if (ret != 0)
> > > +				return;
> > > +
> > >  			rec_nb_pkts =
> > > dev_info.default_rxportconf.burst_size;
> > >
> > >  			if (rec_nb_pkts == 0) {
> > > @@ -4375,6 +4394,7 @@ struct cmd_csum_result {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint64_t tx_offloads;
> > > +	int ret;
> > >
> > >  	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
> > >  	printf("Parse tunnel is %s\n",
> > > @@ -4393,7 +4413,10 @@ struct cmd_csum_result {
> > >  		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ?
> > > "hw" : "sw");
> > >
> > >  	/* display warnings if configuration is not supported by the NIC */
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
> > >  		(dev_info.tx_offload_capa &
> > > DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
> > >  		printf("Warning: hardware IP checksum enabled but not "
> > > @@ -4447,6 +4470,7 @@ struct cmd_csum_result {
> > >  	int hw = 0;
> > >  	uint64_t csum_offloads = 0;
> > >  	struct rte_eth_dev_info dev_info;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
> > >  		printf("invalid port %d\n", res->port_id); @@ -4457,7
> > > +4481,10 @@ struct cmd_csum_result {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (!strcmp(res->mode, "set")) {
> > >
> > >  		if (!strcmp(res->hwsw, "hw"))
> > > @@ -4645,6 +4672,7 @@ struct cmd_tso_set_result {  {
> > >  	struct cmd_tso_set_result *res = parsed_result;
> > >  	struct rte_eth_dev_info dev_info;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
> > >  		return;
> > > @@ -4656,7 +4684,10 @@ struct cmd_tso_set_result {
> > >  	if (!strcmp(res->mode, "set"))
> > >  		ports[res->port_id].tso_segsz = res->tso_segsz;
> > >
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if ((ports[res->port_id].tso_segsz != 0) &&
> > >  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO)
> == 0) {
> > >  		printf("Error: TSO is not supported by port %d\n", @@ -
> > > 4677,7 +4708,10 @@ struct cmd_tso_set_result {
> > >  	cmd_config_queue_tx_offloads(&ports[res->port_id]);
> > >
> > >  	/* display warnings if configuration is not supported by the NIC */
> > > -	rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if ((ports[res->port_id].tso_segsz != 0) &&
> > >  		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO)
> == 0) {
> > >  		printf("Warning: TSO enabled but not "
> > > @@ -4746,7 +4780,8 @@ struct cmd_tunnel_tso_set_result {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	eth_dev_info_get_print_err(port_id, &dev_info);
> > > +
> > >  	if (!(dev_info.tx_offload_capa &
> > > DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
> > >  		printf("Warning: VXLAN TUNNEL TSO not supported
> therefore "
> > >  		       "not enabled for port %d\n", port_id); @@ -11184,7
> > > +11219,11 @@ struct cmd_flow_director_result {
> > >  			struct rte_eth_dev_info dev_info;
> > >
> > >  			memset(&dev_info, 0, sizeof(dev_info));
> > > -			rte_eth_dev_info_get(res->port_id, &dev_info);
> > > +			ret = eth_dev_info_get_print_err(res->port_id,
> > > +						&dev_info);
> > > +			if (ret != 0)
> > > +				return;
> > > +
> > >  			errno = 0;
> > >  			vf_id = strtoul(res->pf_vf + 2, &end, 10);
> > >  			if (errno != 0 || *end != '\0' ||
> > > @@ -14176,7 +14215,10 @@ struct cmd_macsec_offload_on_result {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT)
> {
> > > #ifdef RTE_LIBRTE_IXGBE_PMD
> > >  		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp); @@ -
> > > 14270,7 +14312,10 @@ struct cmd_macsec_offload_off_result {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT)
> {
> > > #ifdef RTE_LIBRTE_IXGBE_PMD
> > >  		ret = rte_pmd_ixgbe_macsec_disable(port_id);
> > > @@ -17980,8 +18025,12 @@ struct cmd_rx_offload_get_capa_result {
> > >  	portid_t port_id = res->port_id;
> > >  	uint64_t queue_offloads;
> > >  	uint64_t port_offloads;
> > > +	int ret;
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > >  	queue_offloads = dev_info.rx_queue_offload_capa;
> > >  	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
> > >
> > > @@ -18053,6 +18102,7 @@ struct
> cmd_rx_offload_get_configuration_result
> > > {
> > >  	uint64_t queue_offloads;
> > >  	uint16_t nb_rx_queues;
> > >  	int q;
> > > +	int ret;
> > >
> > >  	printf("Rx Offloading Configuration of port %d :\n", port_id);
> > >
> > > @@ -18061,7 +18111,10 @@ struct
> > > cmd_rx_offload_get_configuration_result {
> > >  	print_rx_offloads(port_offloads);
> > >  	printf("\n");
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	nb_rx_queues = dev_info.nb_rx_queues;
> > >  	for (q = 0; q < nb_rx_queues; q++) {
> > >  		queue_offloads = port->rx_conf[q].offloads; @@ -18160,6
> > > +18213,7 @@ struct cmd_config_per_port_rx_offload_result {
> > >  	uint64_t single_offload;
> > >  	uint16_t nb_rx_queues;
> > >  	int q;
> > > +	int ret;
> > >
> > >  	if (port->port_status != RTE_PORT_STOPPED) {
> > >  		printf("Error: Can't config offload when Port %d "
> > > @@ -18173,7 +18227,10 @@ struct
> cmd_config_per_port_rx_offload_result
> > > {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	nb_rx_queues = dev_info.nb_rx_queues;
> > >  	if (!strcmp(res->on_off, "on")) {
> > >  		port->dev_conf.rxmode.offloads |= single_offload; @@ -
> > > 18261,6 +18318,7 @@ struct cmd_config_per_queue_rx_offload_result {
> > >  	uint16_t queue_id = res->queue_id;
> > >  	struct rte_port *port = &ports[port_id];
> > >  	uint64_t single_offload;
> > > +	int ret;
> > >
> > >  	if (port->port_status != RTE_PORT_STOPPED) {
> > >  		printf("Error: Can't config offload when Port %d "
> > > @@ -18268,7 +18326,10 @@ struct
> > > cmd_config_per_queue_rx_offload_result {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (queue_id >= dev_info.nb_rx_queues) {
> > >  		printf("Error: input queue_id should be 0 ... "
> > >  		       "%d\n", dev_info.nb_rx_queues - 1); @@ -18374,8
> > > +18435,12 @@ struct cmd_tx_offload_get_capa_result {
> > >  	portid_t port_id = res->port_id;
> > >  	uint64_t queue_offloads;
> > >  	uint64_t port_offloads;
> > > +	int ret;
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > >  	queue_offloads = dev_info.tx_queue_offload_capa;
> > >  	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
> > >
> > > @@ -18447,6 +18512,7 @@ struct
> cmd_tx_offload_get_configuration_result
> > > {
> > >  	uint64_t queue_offloads;
> > >  	uint16_t nb_tx_queues;
> > >  	int q;
> > > +	int ret;
> > >
> > >  	printf("Tx Offloading Configuration of port %d :\n", port_id);
> > >
> > > @@ -18455,7 +18521,10 @@ struct
> > > cmd_tx_offload_get_configuration_result {
> > >  	print_tx_offloads(port_offloads);
> > >  	printf("\n");
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	nb_tx_queues = dev_info.nb_tx_queues;
> > >  	for (q = 0; q < nb_tx_queues; q++) {
> > >  		queue_offloads = port->tx_conf[q].offloads; @@ -18559,6
> > > +18628,7 @@ struct cmd_config_per_port_tx_offload_result {
> > >  	uint64_t single_offload;
> > >  	uint16_t nb_tx_queues;
> > >  	int q;
> > > +	int ret;
> > >
> > >  	if (port->port_status != RTE_PORT_STOPPED) {
> > >  		printf("Error: Can't config offload when Port %d "
> > > @@ -18572,7 +18642,10 @@ struct
> cmd_config_per_port_tx_offload_result
> > > {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	nb_tx_queues = dev_info.nb_tx_queues;
> > >  	if (!strcmp(res->on_off, "on")) {
> > >  		port->dev_conf.txmode.offloads |= single_offload; @@ -
> > > 18663,6 +18736,7 @@ struct cmd_config_per_queue_tx_offload_result {
> > >  	uint16_t queue_id = res->queue_id;
> > >  	struct rte_port *port = &ports[port_id];
> > >  	uint64_t single_offload;
> > > +	int ret;
> > >
> > >  	if (port->port_status != RTE_PORT_STOPPED) {
> > >  		printf("Error: Can't config offload when Port %d "
> > > @@ -18670,7 +18744,10 @@ struct
> > > cmd_config_per_queue_tx_offload_result {
> > >  		return;
> > >  	}
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (queue_id >= dev_info.nb_tx_queues) {
> > >  		printf("Error: input queue_id should be 0 ... "
> > >  		       "%d\n", dev_info.nb_tx_queues - 1); diff --git
> > > a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index
> > > 4958713..369426c 100644
> > > --- a/app/test-pmd/cmdline_flow.c
> > > +++ b/app/test-pmd/cmdline_flow.c
> > > @@ -3550,7 +3550,10 @@ static int comp_vc_action_rss_queue(struct
> > > context *, const struct token *,
> > >  	    ctx->port != (portid_t)RTE_PORT_ALL) {
> > >  		struct rte_eth_dev_info info;
> > >
> > > -		rte_eth_dev_info_get(ctx->port, &info);
> > > +		ret = rte_eth_dev_info_get(ctx->port, &info);
> > > +		if (ret != 0)
> > > +			return ret;
> > > +
> > >  		action_rss_data->conf.key_len =
> > >  			RTE_MIN(sizeof(action_rss_data->key),
> > >  				info.hash_key_size);
> > > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index
> > > 1a5a5c1..0ef7c36 100644
> > > --- a/app/test-pmd/config.c
> > > +++ b/app/test-pmd/config.c
> > > @@ -471,6 +471,7 @@ static int bus_match_all(const struct rte_bus
> > > *bus, const void *data)
> > >  	static const char *info_border = "*********************";
> > >  	uint16_t mtu;
> > >  	char name[RTE_ETH_NAME_MAX_LEN];
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
> > >  		print_valid_ports();
> > > @@ -479,7 +480,11 @@ static int bus_match_all(const struct rte_bus
> > > *bus, const void *data)
> > >  	port = &ports[port_id];
> > >  	rte_eth_link_get_nowait(port_id, &link);
> > >  	memset(&dev_info, 0, sizeof(dev_info));
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	printf("\n%s Infos for port %-2d %s\n",
> > >  	       info_border, port_id, info_border);
> > >  	rte_eth_macaddr_get(port_id, &mac_addr); @@ -618,6 +623,7 @@
> static
> > > int bus_match_all(const struct rte_bus *bus, const void *data)
> > >  	struct rte_eth_link link;
> > >  	struct rte_eth_dev_info dev_info;
> > >  	char name[RTE_ETH_NAME_MAX_LEN];
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
> > >  		print_valid_ports();
> > > @@ -625,7 +631,11 @@ static int bus_match_all(const struct rte_bus
> > > *bus, const void *data)
> > >  	}
> > >
> > >  	rte_eth_link_get_nowait(port_id, &link);
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	rte_eth_dev_get_name_by_port(port_id, name);
> > >  	rte_eth_macaddr_get(port_id, &mac_addr);
> > >
> > > @@ -642,11 +652,14 @@ static int bus_match_all(const struct rte_bus
> > > *bus, const void *data)  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	static const char *info_border = "************";
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> > >  		return;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > >
> > >  	printf("\n%s Port %d supported offload features: %s\n",
> > >  		info_border, port_id, info_border); @@ -1140,10 +1153,15
> @@ void
> > > print_valid_ports(void)  {
> > >  	int diag;
> > >  	struct rte_eth_dev_info dev_info;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) {
> > >  		printf("Set MTU failed. MTU:%u is not in valid range, min:%u
> > > - max:%u\n",
> > >  			mtu, dev_info.min_mtu, dev_info.max_mtu); @@ -
> > > 1618,13 +1636,17 @@ struct igb_ring_desc_16_bytes {  #endif
> > >  			   uint16_t desc_id)
> > >  {
> > > +	int ret;
> > >  	struct igb_ring_desc_16_bytes *ring =
> > >  		(struct igb_ring_desc_16_bytes *)ring_mz->addr;  #ifndef
> > > RTE_LIBRTE_I40E_16BYTE_RX_DESC
> > >  	struct rte_eth_dev_info dev_info;
> > >
> > >  	memset(&dev_info, 0, sizeof(dev_info));
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (strstr(dev_info.driver_name, "i40e") != NULL) {
> > >  		/* 32 bytes RX descriptor, i40e only */
> > >  		struct igb_ring_desc_32_bytes *ring = @@ -1834,11 +1856,15
> @@
> > > struct igb_ring_desc_16_bytes {
> > >  	int diag;
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint8_t hash_key_size;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> > >  		return;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if (dev_info.hash_key_size > 0 &&
> > >  			dev_info.hash_key_size <= sizeof(rss_key))
> > >  		hash_key_size = dev_info.hash_key_size; @@ -2796,11
> > > +2822,15 @@ struct igb_ring_desc_16_bytes {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > >
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
> > >  		if (!ports[portid].rx_dump_cb[queue])
> > >  			ports[portid].rx_dump_cb[queue] =
> > > @@ -2813,10 +2843,15 @@ struct igb_ring_desc_16_bytes {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> > >  		if (!ports[portid].tx_dump_cb[queue])
> > >  			ports[portid].tx_dump_cb[queue] =
> > > @@ -2829,10 +2864,15 @@ struct igb_ring_desc_16_bytes {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
> > >  		if (ports[portid].rx_dump_cb[queue]) {
> > >  			rte_eth_remove_rx_callback(portid, queue, @@ -
> > > 2846,10 +2886,15 @@ struct igb_ring_desc_16_bytes {  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> > >  		if (ports[portid].tx_dump_cb[queue]) {
> > >  			rte_eth_remove_tx_callback(portid, queue, @@ -
> > > 3037,6 +3082,7 @@ struct igb_ring_desc_16_bytes {
> > > tx_vlan_set(portid_t port_id, uint16_t vlan_id)  {
> > >  	struct rte_eth_dev_info dev_info;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> > >  		return;
> > > @@ -3048,7 +3094,11 @@ struct igb_ring_desc_16_bytes {
> > >  		printf("Error, as QinQ has been enabled.\n");
> > >  		return;
> > >  	}
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT)
> == 0) {
> > >  		printf("Error: vlan insert is not supported by port %d\n",
> > >  			port_id);
> > > @@ -3064,6 +3114,7 @@ struct igb_ring_desc_16_bytes {
> > > tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)  {
> > >  	struct rte_eth_dev_info dev_info;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(port_id, ENABLED_WARN))
> > >  		return;
> > > @@ -3072,7 +3123,10 @@ struct igb_ring_desc_16_bytes {
> > >  	if (vlan_id_is_invalid(vlan_id_outer))
> > >  		return;
> > >
> > > -	rte_eth_dev_info_get(port_id, &dev_info);
> > > +	ret = eth_dev_info_get_print_err(port_id, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT)
> == 0) {
> > >  		printf("Error: qinq insert not supported by port %d\n",
> > >  			port_id);
> > > diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
> > > index 5244872..6c78dca 100644
> > > --- a/app/test-pmd/parameters.c
> > > +++ b/app/test-pmd/parameters.c
> > > @@ -562,6 +562,7 @@
> > >  	uint64_t tx_offloads = tx_mode.offloads;
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t rec_nb_pkts;
> > > +	int ret;
> > >
> > >  	static struct option lgopts[] = {
> > >  		{ "help",			0, 0, 0 },
> > > @@ -1050,7 +1051,12 @@
> > >  					 * value, on the assumption that all
> > >  					 * ports are of the same NIC model.
> > >  					 */
> > > -					rte_eth_dev_info_get(0, &dev_info);
> > > +					ret = eth_dev_info_get_print_err(
> > > +								0,
> > > +								&dev_info);
> > > +					if (ret != 0)
> > > +						return;
> > > +
> > >  					rec_nb_pkts = dev_info
> > >
> > > 	.default_rxportconf.burst_size;
> > >
> > > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> > > e8e2a39..0117236 100644
> > > --- a/app/test-pmd/testpmd.c
> > > +++ b/app/test-pmd/testpmd.c
> > > @@ -1016,7 +1016,8 @@ struct extmem_param {
> > >  	struct rte_eth_dev_info dev_info;
> > >
> > >  	RTE_ETH_FOREACH_DEV(pi) {
> > > -		rte_eth_dev_info_get(pi, &dev_info);
> > > +		eth_dev_info_get_print_err(pi, &dev_info);
> > > +
> > >  		if (dev_info.max_rx_queues < allowed_max_rxq) {
> > >  			allowed_max_rxq = dev_info.max_rx_queues;
> > >  			*pid = pi;
> > > @@ -1062,7 +1063,8 @@ struct extmem_param {
> > >  	struct rte_eth_dev_info dev_info;
> > >
> > >  	RTE_ETH_FOREACH_DEV(pi) {
> > > -		rte_eth_dev_info_get(pi, &dev_info);
> > > +		eth_dev_info_get_print_err(pi, &dev_info);
> > > +
> > >  		if (dev_info.max_tx_queues < allowed_max_txq) {
> > >  			allowed_max_txq = dev_info.max_tx_queues;
> > >  			*pid = pi;
> > > @@ -1109,6 +1111,7 @@ struct extmem_param {
> > >  	uint16_t data_size;
> > >  	bool warning = 0;
> > >  	int k;
> > > +	int ret;
> > >
> > >  	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
> > >
> > > @@ -1136,7 +1139,10 @@ struct extmem_param {
> > >  		/* Apply default TxRx configuration for all ports */
> > >  		port->dev_conf.txmode = tx_mode;
> > >  		port->dev_conf.rxmode = rx_mode;
> > > -		rte_eth_dev_info_get(pid, &port->dev_info);
> > > +
> > > +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> > > +		if (ret != 0)
> > > +			return;
> > >
> > >  		if (!(port->dev_info.tx_offload_capa &
> > >  		      DEV_TX_OFFLOAD_MBUF_FAST_FREE)) @@ -1295,10
> > > +1301,14 @@ struct extmem_param {  reconfig(portid_t new_port_id,
> > > unsigned socket_id)  {
> > >  	struct rte_port *port;
> > > +	int ret;
> > >
> > >  	/* Reconfiguration of Ethernet ports. */
> > >  	port = &ports[new_port_id];
> > > -	rte_eth_dev_info_get(new_port_id, &port->dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > >
> > >  	/* set flag to initialize port/queue */
> > >  	port->need_reconfig = 1;
> > > @@ -2927,11 +2937,16 @@ struct pmd_test_command {  {
> > >  	portid_t pid;
> > >  	struct rte_port *port;
> > > +	int ret;
> > >
> > >  	RTE_ETH_FOREACH_DEV(pid) {
> > >  		port = &ports[pid];
> > >  		port->dev_conf.fdir_conf = fdir_conf;
> > > -		rte_eth_dev_info_get(pid, &port->dev_info);
> > > +
> > > +		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
> > > +		if (ret != 0)
> > > +			return;
> > > +
> > >  		if (nb_rxq > 1) {
> > >  			port->dev_conf.rx_adv_conf.rss_conf.rss_key =
> NULL;
> > >  			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = @@ -
> > > 3106,7 +3121,10 @@ uint8_t port_is_bonding_slave(portid_t slave_pid)
> > >  	retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
> > >  	if (retval < 0)
> > >  		return retval;
> > > -	rte_eth_dev_info_get(pid, &rte_port->dev_info);
> > > +
> > > +	retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
> > > +	if (retval != 0)
> > > +		return retval;
> > >
> > >  	/* If dev_info.vmdq_pool_base is greater than 0,
> > >  	 * the queue id of vmdq pools is started after pf queues.
> > > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index
> > > ce13eb8..d73955d 100644
> > > --- a/app/test-pmd/testpmd.h
> > > +++ b/app/test-pmd/testpmd.h
> > > @@ -822,6 +822,9 @@ void port_rss_hash_key_update(portid_t port_id,
> > > char rss_type[],  void setup_gro_flush_cycles(uint8_t cycles);  void
> > > show_gro(portid_t port_id);  void setup_gso(const char *mode, portid_t
> > > port_id);
> > > +int eth_dev_info_get_print_err(uint16_t port_id,
> > > +			struct rte_eth_dev_info *dev_info);
> > > +
> > >
> > >  /* Functions to manage the set of filtered Multicast MAC addresses */
> > > void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr);
> > > diff -- git a/app/test-pmd/util.c b/app/test-pmd/util.c index
> > > 18dfdca..009d226
> > > 100644
> > > --- a/app/test-pmd/util.c
> > > +++ b/app/test-pmd/util.c
> > > @@ -194,10 +194,15 @@
> > >  {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> > >  		if (!ports[portid].tx_set_md_cb[queue])
> > >  			ports[portid].tx_set_md_cb[queue] = @@ -210,10
> +215,15 @@
> > {
> > >  	struct rte_eth_dev_info dev_info;
> > >  	uint16_t queue;
> > > +	int ret;
> > >
> > >  	if (port_id_is_invalid(portid, ENABLED_WARN))
> > >  		return;
> > > -	rte_eth_dev_info_get(portid, &dev_info);
> > > +
> > > +	ret = eth_dev_info_get_print_err(portid, &dev_info);
> > > +	if (ret != 0)
> > > +		return;
> > > +
> > >  	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
> > >  		if (ports[portid].tx_set_md_cb[queue]) {
> > >  			rte_eth_remove_tx_callback(portid, queue, @@ -
> > > 221,3 +231,17 @@
> > >  			ports[portid].tx_set_md_cb[queue] = NULL;
> > >  		}
> > >  }
> > > +
> > > +int
> > > +eth_dev_info_get_print_err(uint16_t port_id,
> > > +					struct rte_eth_dev_info *dev_info) {
> > > +	int ret;
> > > +
> > > +	ret = rte_eth_dev_info_get(port_id, dev_info);
> > > +	if (ret != 0)
> > > +		printf("Error during getting device (port %u) info: %s\n",
> > > +				port_id, strerror(-ret));
> > > +
> > > +	return ret;
> > > +}
> > > --
> > > 1.8.3.1
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 56783aa..d4ab143 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -2273,6 +2273,7 @@  struct cmd_config_rss {
 	int all_updated = 1;
 	int diag;
 	uint16_t i;
+	int ret;
 
 	if (!strcmp(res->value, "all"))
 		rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP |
@@ -2312,7 +2313,10 @@  struct cmd_config_rss {
 	RTE_ETH_FOREACH_DEV(i) {
 		struct rte_eth_rss_conf local_rss_conf;
 
-		rte_eth_dev_info_get(i, &dev_info);
+		ret = eth_dev_info_get_print_err(i, &dev_info);
+		if (ret != 0)
+			return;
+
 		if (use_default)
 			rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
 
@@ -2410,9 +2414,13 @@  struct cmd_config_rss_hash_key {
 	struct rte_eth_dev_info dev_info;
 	uint8_t hash_key_size;
 	uint32_t key_len;
+	int ret;
 
 	memset(&dev_info, 0, sizeof(dev_info));
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (dev_info.hash_key_size > 0 &&
 			dev_info.hash_key_size <= sizeof(hash_key))
 		hash_key_size = dev_info.hash_key_size;
@@ -2945,7 +2953,10 @@  struct cmd_config_rss_reta {
 	struct cmd_config_rss_reta *res = parsed_result;
 
 	memset(&dev_info, 0, sizeof(dev_info));
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (dev_info.reta_size == 0) {
 		printf("Redirection table size is 0 which is "
 					"invalid for RSS\n");
@@ -3063,9 +3074,13 @@  struct cmd_showport_reta {
 	struct rte_eth_rss_reta_entry64 reta_conf[8];
 	struct rte_eth_dev_info dev_info;
 	uint16_t max_reta_size;
+	int ret;
 
 	memset(&dev_info, 0, sizeof(dev_info));
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
 	if (res->size == 0 || res->size > max_reta_size) {
 		printf("Invalid redirection table size: %u (1-%u)\n",
@@ -3292,6 +3307,7 @@  struct cmd_config_burst {
 	struct cmd_config_burst *res = parsed_result;
 	struct rte_eth_dev_info dev_info;
 	uint16_t rec_nb_pkts;
+	int ret;
 
 	if (!all_ports_stopped()) {
 		printf("Please stop all ports first\n");
@@ -3305,7 +3321,10 @@  struct cmd_config_burst {
 			 * size for all ports, so assume all ports are the same
 			 * NIC model and use the values from Port 0.
 			 */
-			rte_eth_dev_info_get(0, &dev_info);
+			ret = eth_dev_info_get_print_err(0, &dev_info);
+			if (ret != 0)
+				return;
+
 			rec_nb_pkts = dev_info.default_rxportconf.burst_size;
 
 			if (rec_nb_pkts == 0) {
@@ -4375,6 +4394,7 @@  struct cmd_csum_result {
 {
 	struct rte_eth_dev_info dev_info;
 	uint64_t tx_offloads;
+	int ret;
 
 	tx_offloads = ports[port_id].dev_conf.txmode.offloads;
 	printf("Parse tunnel is %s\n",
@@ -4393,7 +4413,10 @@  struct cmd_csum_result {
 		(tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ? "hw" : "sw");
 
 	/* display warnings if configuration is not supported by the NIC */
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
 		printf("Warning: hardware IP checksum enabled but not "
@@ -4447,6 +4470,7 @@  struct cmd_csum_result {
 	int hw = 0;
 	uint64_t csum_offloads = 0;
 	struct rte_eth_dev_info dev_info;
+	int ret;
 
 	if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
 		printf("invalid port %d\n", res->port_id);
@@ -4457,7 +4481,10 @@  struct cmd_csum_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (!strcmp(res->mode, "set")) {
 
 		if (!strcmp(res->hwsw, "hw"))
@@ -4645,6 +4672,7 @@  struct cmd_tso_set_result {
 {
 	struct cmd_tso_set_result *res = parsed_result;
 	struct rte_eth_dev_info dev_info;
+	int ret;
 
 	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
 		return;
@@ -4656,7 +4684,10 @@  struct cmd_tso_set_result {
 	if (!strcmp(res->mode, "set"))
 		ports[res->port_id].tso_segsz = res->tso_segsz;
 
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if ((ports[res->port_id].tso_segsz != 0) &&
 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
 		printf("Error: TSO is not supported by port %d\n",
@@ -4677,7 +4708,10 @@  struct cmd_tso_set_result {
 	cmd_config_queue_tx_offloads(&ports[res->port_id]);
 
 	/* display warnings if configuration is not supported by the NIC */
-	rte_eth_dev_info_get(res->port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if ((ports[res->port_id].tso_segsz != 0) &&
 		(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
 		printf("Warning: TSO enabled but not "
@@ -4746,7 +4780,8 @@  struct cmd_tunnel_tso_set_result {
 {
 	struct rte_eth_dev_info dev_info;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	eth_dev_info_get_print_err(port_id, &dev_info);
+
 	if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
 		printf("Warning: VXLAN TUNNEL TSO not supported therefore "
 		       "not enabled for port %d\n", port_id);
@@ -11184,7 +11219,11 @@  struct cmd_flow_director_result {
 			struct rte_eth_dev_info dev_info;
 
 			memset(&dev_info, 0, sizeof(dev_info));
-			rte_eth_dev_info_get(res->port_id, &dev_info);
+			ret = eth_dev_info_get_print_err(res->port_id,
+						&dev_info);
+			if (ret != 0)
+				return;
+
 			errno = 0;
 			vf_id = strtoul(res->pf_vf + 2, &end, 10);
 			if (errno != 0 || *end != '\0' ||
@@ -14176,7 +14215,10 @@  struct cmd_macsec_offload_on_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
 		ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -14270,7 +14312,10 @@  struct cmd_macsec_offload_off_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
 		ret = rte_pmd_ixgbe_macsec_disable(port_id);
@@ -17980,8 +18025,12 @@  struct cmd_rx_offload_get_capa_result {
 	portid_t port_id = res->port_id;
 	uint64_t queue_offloads;
 	uint64_t port_offloads;
+	int ret;
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
 	queue_offloads = dev_info.rx_queue_offload_capa;
 	port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
 
@@ -18053,6 +18102,7 @@  struct cmd_rx_offload_get_configuration_result {
 	uint64_t queue_offloads;
 	uint16_t nb_rx_queues;
 	int q;
+	int ret;
 
 	printf("Rx Offloading Configuration of port %d :\n", port_id);
 
@@ -18061,7 +18111,10 @@  struct cmd_rx_offload_get_configuration_result {
 	print_rx_offloads(port_offloads);
 	printf("\n");
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	nb_rx_queues = dev_info.nb_rx_queues;
 	for (q = 0; q < nb_rx_queues; q++) {
 		queue_offloads = port->rx_conf[q].offloads;
@@ -18160,6 +18213,7 @@  struct cmd_config_per_port_rx_offload_result {
 	uint64_t single_offload;
 	uint16_t nb_rx_queues;
 	int q;
+	int ret;
 
 	if (port->port_status != RTE_PORT_STOPPED) {
 		printf("Error: Can't config offload when Port %d "
@@ -18173,7 +18227,10 @@  struct cmd_config_per_port_rx_offload_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	nb_rx_queues = dev_info.nb_rx_queues;
 	if (!strcmp(res->on_off, "on")) {
 		port->dev_conf.rxmode.offloads |= single_offload;
@@ -18261,6 +18318,7 @@  struct cmd_config_per_queue_rx_offload_result {
 	uint16_t queue_id = res->queue_id;
 	struct rte_port *port = &ports[port_id];
 	uint64_t single_offload;
+	int ret;
 
 	if (port->port_status != RTE_PORT_STOPPED) {
 		printf("Error: Can't config offload when Port %d "
@@ -18268,7 +18326,10 @@  struct cmd_config_per_queue_rx_offload_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (queue_id >= dev_info.nb_rx_queues) {
 		printf("Error: input queue_id should be 0 ... "
 		       "%d\n", dev_info.nb_rx_queues - 1);
@@ -18374,8 +18435,12 @@  struct cmd_tx_offload_get_capa_result {
 	portid_t port_id = res->port_id;
 	uint64_t queue_offloads;
 	uint64_t port_offloads;
+	int ret;
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
 	queue_offloads = dev_info.tx_queue_offload_capa;
 	port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
 
@@ -18447,6 +18512,7 @@  struct cmd_tx_offload_get_configuration_result {
 	uint64_t queue_offloads;
 	uint16_t nb_tx_queues;
 	int q;
+	int ret;
 
 	printf("Tx Offloading Configuration of port %d :\n", port_id);
 
@@ -18455,7 +18521,10 @@  struct cmd_tx_offload_get_configuration_result {
 	print_tx_offloads(port_offloads);
 	printf("\n");
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	nb_tx_queues = dev_info.nb_tx_queues;
 	for (q = 0; q < nb_tx_queues; q++) {
 		queue_offloads = port->tx_conf[q].offloads;
@@ -18559,6 +18628,7 @@  struct cmd_config_per_port_tx_offload_result {
 	uint64_t single_offload;
 	uint16_t nb_tx_queues;
 	int q;
+	int ret;
 
 	if (port->port_status != RTE_PORT_STOPPED) {
 		printf("Error: Can't config offload when Port %d "
@@ -18572,7 +18642,10 @@  struct cmd_config_per_port_tx_offload_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	nb_tx_queues = dev_info.nb_tx_queues;
 	if (!strcmp(res->on_off, "on")) {
 		port->dev_conf.txmode.offloads |= single_offload;
@@ -18663,6 +18736,7 @@  struct cmd_config_per_queue_tx_offload_result {
 	uint16_t queue_id = res->queue_id;
 	struct rte_port *port = &ports[port_id];
 	uint64_t single_offload;
+	int ret;
 
 	if (port->port_status != RTE_PORT_STOPPED) {
 		printf("Error: Can't config offload when Port %d "
@@ -18670,7 +18744,10 @@  struct cmd_config_per_queue_tx_offload_result {
 		return;
 	}
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (queue_id >= dev_info.nb_tx_queues) {
 		printf("Error: input queue_id should be 0 ... "
 		       "%d\n", dev_info.nb_tx_queues - 1);
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 4958713..369426c 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -3550,7 +3550,10 @@  static int comp_vc_action_rss_queue(struct context *, const struct token *,
 	    ctx->port != (portid_t)RTE_PORT_ALL) {
 		struct rte_eth_dev_info info;
 
-		rte_eth_dev_info_get(ctx->port, &info);
+		ret = rte_eth_dev_info_get(ctx->port, &info);
+		if (ret != 0)
+			return ret;
+
 		action_rss_data->conf.key_len =
 			RTE_MIN(sizeof(action_rss_data->key),
 				info.hash_key_size);
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 1a5a5c1..0ef7c36 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -471,6 +471,7 @@  static int bus_match_all(const struct rte_bus *bus, const void *data)
 	static const char *info_border = "*********************";
 	uint16_t mtu;
 	char name[RTE_ETH_NAME_MAX_LEN];
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
 		print_valid_ports();
@@ -479,7 +480,11 @@  static int bus_match_all(const struct rte_bus *bus, const void *data)
 	port = &ports[port_id];
 	rte_eth_link_get_nowait(port_id, &link);
 	memset(&dev_info, 0, sizeof(dev_info));
-	rte_eth_dev_info_get(port_id, &dev_info);
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	printf("\n%s Infos for port %-2d %s\n",
 	       info_border, port_id, info_border);
 	rte_eth_macaddr_get(port_id, &mac_addr);
@@ -618,6 +623,7 @@  static int bus_match_all(const struct rte_bus *bus, const void *data)
 	struct rte_eth_link link;
 	struct rte_eth_dev_info dev_info;
 	char name[RTE_ETH_NAME_MAX_LEN];
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN)) {
 		print_valid_ports();
@@ -625,7 +631,11 @@  static int bus_match_all(const struct rte_bus *bus, const void *data)
 	}
 
 	rte_eth_link_get_nowait(port_id, &link);
-	rte_eth_dev_info_get(port_id, &dev_info);
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	rte_eth_dev_get_name_by_port(port_id, name);
 	rte_eth_macaddr_get(port_id, &mac_addr);
 
@@ -642,11 +652,14 @@  static int bus_match_all(const struct rte_bus *bus, const void *data)
 {
 	struct rte_eth_dev_info dev_info;
 	static const char *info_border = "************";
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
 
 	printf("\n%s Port %d supported offload features: %s\n",
 		info_border, port_id, info_border);
@@ -1140,10 +1153,15 @@  void print_valid_ports(void)
 {
 	int diag;
 	struct rte_eth_dev_info dev_info;
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(port_id, &dev_info);
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (mtu > dev_info.max_mtu || mtu < dev_info.min_mtu) {
 		printf("Set MTU failed. MTU:%u is not in valid range, min:%u - max:%u\n",
 			mtu, dev_info.min_mtu, dev_info.max_mtu);
@@ -1618,13 +1636,17 @@  struct igb_ring_desc_16_bytes {
 #endif
 			   uint16_t desc_id)
 {
+	int ret;
 	struct igb_ring_desc_16_bytes *ring =
 		(struct igb_ring_desc_16_bytes *)ring_mz->addr;
 #ifndef RTE_LIBRTE_I40E_16BYTE_RX_DESC
 	struct rte_eth_dev_info dev_info;
 
 	memset(&dev_info, 0, sizeof(dev_info));
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (strstr(dev_info.driver_name, "i40e") != NULL) {
 		/* 32 bytes RX descriptor, i40e only */
 		struct igb_ring_desc_32_bytes *ring =
@@ -1834,11 +1856,15 @@  struct igb_ring_desc_16_bytes {
 	int diag;
 	struct rte_eth_dev_info dev_info;
 	uint8_t hash_key_size;
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if (dev_info.hash_key_size > 0 &&
 			dev_info.hash_key_size <= sizeof(rss_key))
 		hash_key_size = dev_info.hash_key_size;
@@ -2796,11 +2822,15 @@  struct igb_ring_desc_16_bytes {
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
 
-	rte_eth_dev_info_get(portid, &dev_info);
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
 		if (!ports[portid].rx_dump_cb[queue])
 			ports[portid].rx_dump_cb[queue] =
@@ -2813,10 +2843,15 @@  struct igb_ring_desc_16_bytes {
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(portid, &dev_info);
+
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
 		if (!ports[portid].tx_dump_cb[queue])
 			ports[portid].tx_dump_cb[queue] =
@@ -2829,10 +2864,15 @@  struct igb_ring_desc_16_bytes {
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(portid, &dev_info);
+
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
 		if (ports[portid].rx_dump_cb[queue]) {
 			rte_eth_remove_rx_callback(portid, queue,
@@ -2846,10 +2886,15 @@  struct igb_ring_desc_16_bytes {
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(portid, &dev_info);
+
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
 		if (ports[portid].tx_dump_cb[queue]) {
 			rte_eth_remove_tx_callback(portid, queue,
@@ -3037,6 +3082,7 @@  struct igb_ring_desc_16_bytes {
 tx_vlan_set(portid_t port_id, uint16_t vlan_id)
 {
 	struct rte_eth_dev_info dev_info;
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
@@ -3048,7 +3094,11 @@  struct igb_ring_desc_16_bytes {
 		printf("Error, as QinQ has been enabled.\n");
 		return;
 	}
-	rte_eth_dev_info_get(port_id, &dev_info);
+
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
 		printf("Error: vlan insert is not supported by port %d\n",
 			port_id);
@@ -3064,6 +3114,7 @@  struct igb_ring_desc_16_bytes {
 tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
 {
 	struct rte_eth_dev_info dev_info;
+	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
@@ -3072,7 +3123,10 @@  struct igb_ring_desc_16_bytes {
 	if (vlan_id_is_invalid(vlan_id_outer))
 		return;
 
-	rte_eth_dev_info_get(port_id, &dev_info);
+	ret = eth_dev_info_get_print_err(port_id, &dev_info);
+	if (ret != 0)
+		return;
+
 	if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
 		printf("Error: qinq insert not supported by port %d\n",
 			port_id);
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 5244872..6c78dca 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -562,6 +562,7 @@ 
 	uint64_t tx_offloads = tx_mode.offloads;
 	struct rte_eth_dev_info dev_info;
 	uint16_t rec_nb_pkts;
+	int ret;
 
 	static struct option lgopts[] = {
 		{ "help",			0, 0, 0 },
@@ -1050,7 +1051,12 @@ 
 					 * value, on the assumption that all
 					 * ports are of the same NIC model.
 					 */
-					rte_eth_dev_info_get(0, &dev_info);
+					ret = eth_dev_info_get_print_err(
+								0,
+								&dev_info);
+					if (ret != 0)
+						return;
+
 					rec_nb_pkts = dev_info
 						.default_rxportconf.burst_size;
 
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index e8e2a39..0117236 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1016,7 +1016,8 @@  struct extmem_param {
 	struct rte_eth_dev_info dev_info;
 
 	RTE_ETH_FOREACH_DEV(pi) {
-		rte_eth_dev_info_get(pi, &dev_info);
+		eth_dev_info_get_print_err(pi, &dev_info);
+
 		if (dev_info.max_rx_queues < allowed_max_rxq) {
 			allowed_max_rxq = dev_info.max_rx_queues;
 			*pid = pi;
@@ -1062,7 +1063,8 @@  struct extmem_param {
 	struct rte_eth_dev_info dev_info;
 
 	RTE_ETH_FOREACH_DEV(pi) {
-		rte_eth_dev_info_get(pi, &dev_info);
+		eth_dev_info_get_print_err(pi, &dev_info);
+
 		if (dev_info.max_tx_queues < allowed_max_txq) {
 			allowed_max_txq = dev_info.max_tx_queues;
 			*pid = pi;
@@ -1109,6 +1111,7 @@  struct extmem_param {
 	uint16_t data_size;
 	bool warning = 0;
 	int k;
+	int ret;
 
 	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
 
@@ -1136,7 +1139,10 @@  struct extmem_param {
 		/* Apply default TxRx configuration for all ports */
 		port->dev_conf.txmode = tx_mode;
 		port->dev_conf.rxmode = rx_mode;
-		rte_eth_dev_info_get(pid, &port->dev_info);
+
+		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
+		if (ret != 0)
+			return;
 
 		if (!(port->dev_info.tx_offload_capa &
 		      DEV_TX_OFFLOAD_MBUF_FAST_FREE))
@@ -1295,10 +1301,14 @@  struct extmem_param {
 reconfig(portid_t new_port_id, unsigned socket_id)
 {
 	struct rte_port *port;
+	int ret;
 
 	/* Reconfiguration of Ethernet ports. */
 	port = &ports[new_port_id];
-	rte_eth_dev_info_get(new_port_id, &port->dev_info);
+
+	ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
+	if (ret != 0)
+		return;
 
 	/* set flag to initialize port/queue */
 	port->need_reconfig = 1;
@@ -2927,11 +2937,16 @@  struct pmd_test_command {
 {
 	portid_t pid;
 	struct rte_port *port;
+	int ret;
 
 	RTE_ETH_FOREACH_DEV(pid) {
 		port = &ports[pid];
 		port->dev_conf.fdir_conf = fdir_conf;
-		rte_eth_dev_info_get(pid, &port->dev_info);
+
+		ret = eth_dev_info_get_print_err(pid, &port->dev_info);
+		if (ret != 0)
+			return;
+
 		if (nb_rxq > 1) {
 			port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
 			port->dev_conf.rx_adv_conf.rss_conf.rss_hf =
@@ -3106,7 +3121,10 @@  uint8_t port_is_bonding_slave(portid_t slave_pid)
 	retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
 	if (retval < 0)
 		return retval;
-	rte_eth_dev_info_get(pid, &rte_port->dev_info);
+
+	retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
+	if (retval != 0)
+		return retval;
 
 	/* If dev_info.vmdq_pool_base is greater than 0,
 	 * the queue id of vmdq pools is started after pf queues.
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index ce13eb8..d73955d 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -822,6 +822,9 @@  void port_rss_hash_key_update(portid_t port_id, char rss_type[],
 void setup_gro_flush_cycles(uint8_t cycles);
 void show_gro(portid_t port_id);
 void setup_gso(const char *mode, portid_t port_id);
+int eth_dev_info_get_print_err(uint16_t port_id,
+			struct rte_eth_dev_info *dev_info);
+
 
 /* Functions to manage the set of filtered Multicast MAC addresses */
 void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr);
diff --git a/app/test-pmd/util.c b/app/test-pmd/util.c
index 18dfdca..009d226 100644
--- a/app/test-pmd/util.c
+++ b/app/test-pmd/util.c
@@ -194,10 +194,15 @@ 
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(portid, &dev_info);
+
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
 		if (!ports[portid].tx_set_md_cb[queue])
 			ports[portid].tx_set_md_cb[queue] =
@@ -210,10 +215,15 @@ 
 {
 	struct rte_eth_dev_info dev_info;
 	uint16_t queue;
+	int ret;
 
 	if (port_id_is_invalid(portid, ENABLED_WARN))
 		return;
-	rte_eth_dev_info_get(portid, &dev_info);
+
+	ret = eth_dev_info_get_print_err(portid, &dev_info);
+	if (ret != 0)
+		return;
+
 	for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
 		if (ports[portid].tx_set_md_cb[queue]) {
 			rte_eth_remove_tx_callback(portid, queue,
@@ -221,3 +231,17 @@ 
 			ports[portid].tx_set_md_cb[queue] = NULL;
 		}
 }
+
+int
+eth_dev_info_get_print_err(uint16_t port_id,
+					struct rte_eth_dev_info *dev_info)
+{
+	int ret;
+
+	ret = rte_eth_dev_info_get(port_id, dev_info);
+	if (ret != 0)
+		printf("Error during getting device (port %u) info: %s\n",
+				port_id, strerror(-ret));
+
+	return ret;
+}