> -----Original Message----- > From: Nélio Laranjeiro <nelio.laranje...@6wind.com> > Sent: Monday, April 16, 2018 3:14 PM > To: Xueming(Steven) Li <xuemi...@mellanox.com> > Cc: Shahaf Shuler <shah...@mellanox.com>; dev@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