[dpdk-dev] [PATCH v2 07/15] net/mlx5: support tunnel RSS level

Xueming(Steven) Li xuemingl at mellanox.com
Mon Apr 16 09:46:08 CEST 2018



> -----Original Message-----
> From: Nélio Laranjeiro <nelio.laranjeiro at 6wind.com>
> Sent: Monday, April 16, 2018 3:14 PM
> To: Xueming(Steven) Li <xuemingl at mellanox.com>
> Cc: Shahaf Shuler <shahafs at mellanox.com>; dev at dpdk.org
> Subject: Re: [PATCH v2 07/15] net/mlx5: support tunnel RSS level
> 
> On Sat, Apr 14, 2018 at 12:25:12PM +0000, Xueming(Steven) Li wrote:
> >[...]
> > > > @@ -1211,23 +1322,23 @@ mlx5_flow_convert(struct rte_eth_dev *dev,
> > > >  		if (ret)
> > > >  			goto exit_free;
> > > >  	}
> > > > -	if (parser->mark)
> > > > -		mlx5_flow_create_flag_mark(parser, parser->mark_id);
> > > > -	if (parser->count && parser->create) {
> > > > -		mlx5_flow_create_count(dev, parser);
> > > > -		if (!parser->cs)
> > > > -			goto exit_count_error;
> > > > -	}
> > > >  	/*
> > > >  	 * Last step. Complete missing specification to reach the RSS
> > > >  	 * configuration.
> > > >  	 */
> > > >  	if (!parser->drop)
> > > > -		ret = mlx5_flow_convert_rss(parser);
> > > > +		ret = mlx5_flow_convert_rss(dev, parser);
> > > >  		if (ret)
> > > >  			goto exit_free;
> > > >  		mlx5_flow_convert_finalise(parser);
> > > >  	mlx5_flow_update_priority(dev, parser, attr);
> > > > +	if (parser->mark)
> > > > +		mlx5_flow_create_flag_mark(parser, parser->mark_id);
> > > > +	if (parser->count && parser->create) {
> > > > +		mlx5_flow_create_count(dev, parser);
> > > > +		if (!parser->cs)
> > > > +			goto exit_count_error;
> > > > +	}
> > >
> > > Why do you need to move this code?
> >
> > To avoid counter resource missing if anything wrong in function
> > mlx5_flow_convert_rss().
> 
> Why this modification is addressed in this patch, why should it it be in
> the patch introducing the mlx5_flow_convert_rss()?

Good catch, I'll update.
> 
> >[...]
> > > > @@ -1386,6 +1386,8 @@ mlx5_ind_table_ibv_verify(struct rte_eth_dev
> *dev)
> > > >   *   Number of queues.
> > > >   * @param tunnel
> > > >   *   Tunnel type.
> > > > + * @param rss_level
> > > > + *   RSS hash on tunnel level.
> > > >   *
> > > >   * @return
> > > >   *   The Verbs object initialised, NULL otherwise and rte_errno is
> set.
> > > > @@ -1394,13 +1396,17 @@ struct mlx5_hrxq *  mlx5_hrxq_new(struct
> > > > rte_eth_dev *dev,
> > > >  	      const uint8_t *rss_key, uint32_t rss_key_len,
> > > >  	      uint64_t hash_fields,
> > > > -	      const uint16_t *queues, uint32_t queues_n, uint32_t
> tunnel)
> > > > +	      const uint16_t *queues, uint32_t queues_n,
> > > > +	      uint32_t tunnel, uint32_t rss_level)
> > >
> > > tunnel and rss_level seems to be redundant here.
> > >
> > > rss_level > 1 is equivalent to tunnel, there is no need to have both.
> >
> > There is a case of tunnel and outer rss(1).
> 
> Why cannot it be handled by a regular Hash Rx queue, i.e. what is the
> benefit of creating a tunnel hash Rx queue to make the same job as a
> legacy one?

Tunnel checksum, ptype and rss offloading demand a QP to be created by DV api with
tunnel offload flags.

> 
> See below,
> 
> > > >  {
> > > >  	struct priv *priv = dev->data->dev_private;
> > > >  	struct mlx5_hrxq *hrxq;
> > > >  	struct mlx5_ind_table_ibv *ind_tbl;
> > > >  	struct ibv_qp *qp;
> > > >  	int err;
> > > > +#ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
> > > > +	struct mlx5dv_qp_init_attr qp_init_attr = {0}; #endif
> > > >
> > > >  	queues_n = hash_fields ? queues_n : 1;
> > > >  	ind_tbl = mlx5_ind_table_ibv_get(dev, queues, queues_n); @@
> > > > -1410,6
> > > > +1416,33 @@ mlx5_hrxq_new(struct rte_eth_dev *dev,
> > > >  		rte_errno = ENOMEM;
> > > >  		return NULL;
> > > >  	}
> > > > +#ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
> > > > +	if (tunnel) {
> 
> Why not: if (rss_level > 1) ?

Besides rss, ptype and checksum has to take advantage of tunnel offloading.

> 
> > > > +		qp_init_attr.comp_mask =
> > > > +				MLX5DV_QP_INIT_ATTR_MASK_QP_CREATE_FLAGS;
> > > > +		qp_init_attr.create_flags =
> MLX5DV_QP_CREATE_TUNNEL_OFFLOADS;
> > > > +	}
> > > > +	qp = mlx5_glue->dv_create_qp(
> > > > +		priv->ctx,
> > > > +		&(struct ibv_qp_init_attr_ex){
> > > > +			.qp_type = IBV_QPT_RAW_PACKET,
> > > > +			.comp_mask =
> > > > +				IBV_QP_INIT_ATTR_PD |
> > > > +				IBV_QP_INIT_ATTR_IND_TABLE |
> > > > +				IBV_QP_INIT_ATTR_RX_HASH,
> > > > +			.rx_hash_conf = (struct ibv_rx_hash_conf){
> > > > +				.rx_hash_function =
> IBV_RX_HASH_FUNC_TOEPLITZ,
> > > > +				.rx_hash_key_len = rss_key_len,
> > > > +				.rx_hash_key = (void *)(uintptr_t)rss_key,
> > > > +				.rx_hash_fields_mask = hash_fields |
> > > > +					(tunnel && rss_level ?
> > > > +					(uint32_t)IBV_RX_HASH_INNER : 0),
> >[...]
> 
>  .rx_hash_fields_mask = hash_fields |
>  (rss_level > 1) ?
>  (uint32_t)IBV_RX_HASH_INNER : 0),

Thanks, rss_level has been fixed according new rule.

> 
> Thanks,
> 
> --
> Nélio Laranjeiro
> 6WIND


More information about the dev mailing list