[dpdk-dev] [PATCH v2] app/testpmd: add cmdline option to set Rx mq mode

Ferruh Yigit ferruh.yigit at intel.com
Wed May 6 11:36:03 CEST 2020


On 5/6/2020 3:52 AM, Xiaoyu Min wrote:
> On Tue, 20-05-05, 17:06, Ferruh Yigit wrote:
>> On 4/30/2020 2:07 PM, Xiaoyu Min wrote:
>>> One new cmdline option `--rx-mq-mode` is added in order to have the
>>> possibility to check whether PMD handle the mq mode correctly or not.
>>>
>>> The reason is some NICs need to do different settings based on different
>>> RX mq mode, i.e RSS or not.
>>>
>>> With this support in testpmd, the above scenario can be tested easily.
>>>
>>> Signed-off-by: Xiaoyu Min <jackmin at mellanox.com>
>>> ---
>>>  app/test-pmd/parameters.c              | 12 ++++++++++++
>>>  app/test-pmd/testpmd.c                 | 17 ++++++++++++++---
>>>  app/test-pmd/testpmd.h                 |  3 +++
>>>  doc/guides/rel_notes/release_20_05.rst |  4 ++++
>>>  doc/guides/testpmd_app_ug/run_app.rst  |  7 +++++++
>>>  5 files changed, 40 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
>>> index 30c1753c32..a9dd58e96b 100644
>>> --- a/app/test-pmd/parameters.c
>>> +++ b/app/test-pmd/parameters.c
>>> @@ -212,6 +212,7 @@ usage(char* progname)
>>>  	printf("  --noisy-lkup-num-writes=N: do N random reads and writes per packet\n");
>>>  	printf("  --no-iova-contig: mempool memory can be IOVA non contiguous. "
>>>  	       "valid only with --mp-alloc=anon\n");
>>> +	printf("  --rx-mq-mode=0xX: hexadecimal bitmask of RX mq mode\n");
>>
>> Do you think does it worth to say the bitmask is for modes that can be enabled,
>> to remove need to look the code, not sure.
> So you mean something like:
> +	printf("  --rx-mq-mode=0xX: hexadecimal bitmask of RX mq mode can be enabled\n");
> Is it right?

Yes.

> 
>>
>>>  }
>>>  
>>>  #ifdef RTE_LIBRTE_CMDLINE
>>> @@ -670,6 +671,7 @@ launch_args_parse(int argc, char** argv)
>>>  		{ "noisy-lkup-num-reads",	1, 0, 0 },
>>>  		{ "noisy-lkup-num-reads-writes", 1, 0, 0 },
>>>  		{ "no-iova-contig",             0, 0, 0 },
>>> +		{ "rx-mq-mode",                 1, 0, 0 },
>>>  		{ 0, 0, 0, 0 },
>>>  	};
>>>  
>>> @@ -1363,6 +1365,16 @@ launch_args_parse(int argc, char** argv)
>>>  			}
>>>  			if (!strcmp(lgopts[opt_idx].name, "no-iova-contig"))
>>>  				mempool_flags = MEMPOOL_F_NO_IOVA_CONTIG;
>>> +
>>> +			if (!strcmp(lgopts[opt_idx].name, "rx-mq-mode")) {
>>> +				char *end = NULL;
>>> +				n = strtoul(optarg, &end, 16);
>>> +				if (n >= 0)
>>> +					rx_mq_mode = (enum rte_eth_rx_mq_mode)n;
>>
>> Should we check if the provided value, 'n', is not out of the enum range?
> OK, I'll add the check.
> 
>>
>>> +				else
>>> +					rte_exit(EXIT_FAILURE,
>>> +						 "rx-mq-mode must be >= 0\n");
>>> +			}
>>>  			break;
>>>  		case 'h':
>>>  			usage(argv[0]);
>>> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
>>> index 99bacddbfd..9536d6ee27 100644
>>> --- a/app/test-pmd/testpmd.c
>>> +++ b/app/test-pmd/testpmd.c
>>> @@ -482,6 +482,11 @@ uint8_t bitrate_enabled;
>>>  struct gro_status gro_ports[RTE_MAX_ETHPORTS];
>>>  uint8_t gro_flush_cycles = GRO_DEFAULT_FLUSH_CYCLES;
>>>  
>>> +/*
>>> + * RX mq mode value set in the commandline
>>
>> This is not the "RX mq mode value", the above help string seems more accurate,
>> "hexadecimal bitmask of RX mq mode". Can you please update here?
> Sure, I'll update.
> 
>>
>>> + */
>>> +enum rte_eth_rx_mq_mode rx_mq_mode = ETH_MQ_RX_VMDQ_DCB_RSS;
>>> +
>>>  /* Forward function declarations */
>>>  static void setup_attached_port(portid_t pi);
>>>  static void map_port_queue_stats_mapping_registers(portid_t pi,
>>> @@ -3337,7 +3342,9 @@ init_port_config(void)
>>>  
>>>  		if (port->dcb_flag == 0) {
>>>  			if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
>>> -				port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
>>> +				port->dev_conf.rxmode.mq_mode =
>>> +					(enum rte_eth_rx_mq_mode)
>>
>> Do we need this enum type cast?
> Yes, we need this cast otherwise the coverity will complain about enum type
> mixed with other type.

Here all variables looks an enum, 'mq_mode' type is enum, 'rx_mq_mode' is enum
and 'ETH_MQ_RX_RSS' is enum item. With which type it is mixed with?

I didn't run coverity for it, if it is giving warning OK to keep them, but can
you please double check with coverity scan?

> 
>>
>>> +						(rx_mq_mode & ETH_MQ_RX_RSS);
>>>  			else
>>>  				port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
>>>  		}
>>> @@ -3438,7 +3445,9 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
>>>  		}
>>>  
>>>  		/* set DCB mode of RX and TX of multiple queues */
>>> -		eth_conf->rxmode.mq_mode = ETH_MQ_RX_VMDQ_DCB;
>>> +		eth_conf->rxmode.mq_mode =
>>> +				(enum rte_eth_rx_mq_mode)
>>> +					(rx_mq_mode & ETH_MQ_RX_VMDQ_DCB);
>>>  		eth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
>>>  	} else {
>>>  		struct rte_eth_dcb_rx_conf *rx_conf =
>>> @@ -3458,7 +3467,9 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
>>>  			tx_conf->dcb_tc[i] = i % num_tcs;
>>>  		}
>>>  
>>> -		eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
>>> +		eth_conf->rxmode.mq_mode =
>>> +				(enum rte_eth_rx_mq_mode)
>>> +					(rx_mq_mode & ETH_MQ_RX_DCB_RSS);
>>>  		eth_conf->rx_adv_conf.rss_conf = rss_conf;
>>>  		eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
>>>  	}
>>> diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
>>> index 7ff4c5dba3..32bb324c94 100644
>>> --- a/app/test-pmd/testpmd.h
>>> +++ b/app/test-pmd/testpmd.h
>>> @@ -602,6 +602,9 @@ struct mplsoudp_decap_conf {
>>>  };
>>>  extern struct mplsoudp_decap_conf mplsoudp_decap_conf;
>>>  
>>> +/* RX mq mode parameter. */
>>
>> The variable name gives as much context as the comment, may it be dropped?
> OK, I'll dorp this comment.
> 
>>
>>> +extern enum rte_eth_rx_mq_mode rx_mq_mode;
>>> +
>>>  static inline unsigned int
>>>  lcore_num(void)
>>>  {
>>> diff --git a/doc/guides/rel_notes/release_20_05.rst b/doc/guides/rel_notes/release_20_05.rst
>>> index b124c3f287..8026afb451 100644
>>> --- a/doc/guides/rel_notes/release_20_05.rst
>>> +++ b/doc/guides/rel_notes/release_20_05.rst
>>> @@ -212,6 +212,10 @@ New Features
>>>    * Added IPsec inbound load-distribution support for ipsec-secgw application
>>>      using NIC load distribution feature(Flow Director).
>>>  
>>> +* **Updated testpmd application.**
>>> +
>>> +  * Added a new cmdline option ``--rx-mq-mode`` which can be used to test PMD's
>>> +    behaviour on handling Rx mq mode.
>>>  
>>>  Removed Items
>>>  -------------
>>> diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst
>>> index 727ef52b8f..4f46299e68 100644
>>> --- a/doc/guides/testpmd_app_ug/run_app.rst
>>> +++ b/doc/guides/testpmd_app_ug/run_app.rst
>>> @@ -481,3 +481,10 @@ The command line options are:
>>>  
>>>      Enable to create mempool which is not IOVA contiguous. Valid only with --mp-alloc=anon.
>>>      The default value is 0.
>>> +
>>> +*   ``--rx-mq-mode``
>>> +
>>> +    Set the hexadecimal bitmask of RX queue mq mode.
>>
>> It is good to expand the 'mq' at least in the documentation, and I guess it is
>> "multi queue".
> OK, I'll expand it.
> 
> Thank you
> -Jack
>>
>>> +    The default value is 0x7::
>>> +
>>> +       ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG | ETH_MQ_RX_VMDQ_FLAG
>>>
>>



More information about the dev mailing list