DPDK patches and discussions
 help / color / mirror / Atom feed
From: Gregory Etelson <getelson@nvidia.com>
To: "ferruh.yigit@intel.com" <ferruh.yigit@intel.com>
Cc: Raslan Darawsheh <rasland@nvidia.com>,
	Slava Ovsiienko <viacheslavo@nvidia.com>,
	"dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH v4] net/mlx5: fix tunnel offload private items location
Date: Mon, 10 May 2021 12:29:35 +0000	[thread overview]
Message-ID: <BY5PR12MB48348AC04451A31CF5D481A5A5549@BY5PR12MB4834.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20210506095751.5689-1-getelson@nvidia.com>

Hello Ferruh,

The patch has failed ci/Intel-compilation test.
(http://mails.dpdk.org/archives/test-report/2021-May/193327.html)
I've checked that with Thomas. He confirmed that was a known fault and 
should not affect the current patch.
Can we proceed with the patch integration ?

Thank you.

Regards,
Gregory 

> -----Original Message-----
> From: Gregory Etelson <getelson@nvidia.com>
> Sent: Thursday, May 6, 2021 12:58
> To: dev@dpdk.org
> Cc: Gregory Etelson <getelson@nvidia.com>; Matan Azrad
> <matan@nvidia.com>; Ori Kam <orika@nvidia.com>; Raslan Darawsheh
> <rasland@nvidia.com>; ferruh.yigit@intel.com; stable@dpdk.org; Slava
> Ovsiienko <viacheslavo@nvidia.com>; Shahaf Shuler
> <shahafs@nvidia.com>
> Subject: [PATCH v4] net/mlx5: fix tunnel offload private items location
> 
> Tunnel offload API requires application to query PMD for specific flow items
> and actions. Application uses these PMD specific elements to build flow
> rules according to the tunnel offload model.
> The model does not restrict private elements location in a flow rule, but the
> current MLX5 PMD implementation expects that tunnel offload rule will
> begin with PMD specific elements.
> The patch removes that placement limitation.
> 
> Cc: stable@dpdk.org
> 
> Fixes: 4ec6360de37d ("net/mlx5: implement tunnel offload")
> 
> Signed-off-by: Gregory Etelson <getelson@nvidia.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
> ---
> v2: Update the patch comment.
> v3: Remove testpmd patch from the series.
> v4: Remove redundant verifications in flow_dv_validate.
> ---
>  drivers/net/mlx5/mlx5_flow.c    | 48 ++++++++++++------
>  drivers/net/mlx5/mlx5_flow.h    | 46 ++++++++++-------
>  drivers/net/mlx5/mlx5_flow_dv.c | 88 ++++++++++++++++-----------------
>  3 files changed, 102 insertions(+), 80 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> index 3194cd5633..f464271d42 100644
> --- a/drivers/net/mlx5/mlx5_flow.c
> +++ b/drivers/net/mlx5/mlx5_flow.c
> @@ -50,6 +50,7 @@ flow_tunnel_add_default_miss(struct rte_eth_dev
> *dev,
>  			     const struct rte_flow_attr *attr,
>  			     const struct rte_flow_action *app_actions,
>  			     uint32_t flow_idx,
> +			     const struct mlx5_flow_tunnel *tunnel,
>  			     struct tunnel_default_miss_ctx *ctx,
>  			     struct rte_flow_error *error);
>  static struct mlx5_flow_tunnel *
> @@ -5958,22 +5959,14 @@ flow_create_split_outer(struct rte_eth_dev
> *dev,
>  	return ret;
>  }
> 
> -static struct mlx5_flow_tunnel *
> -flow_tunnel_from_rule(struct rte_eth_dev *dev,
> -		      const struct rte_flow_attr *attr,
> -		      const struct rte_flow_item items[],
> -		      const struct rte_flow_action actions[])
> +static inline struct mlx5_flow_tunnel * flow_tunnel_from_rule(const
> +struct mlx5_flow *flow)
>  {
>  	struct mlx5_flow_tunnel *tunnel;
> 
>  #pragma GCC diagnostic push
>  #pragma GCC diagnostic ignored "-Wcast-qual"
> -	if (is_flow_tunnel_match_rule(dev, attr, items, actions))
> -		tunnel = (struct mlx5_flow_tunnel *)items[0].spec;
> -	else if (is_flow_tunnel_steer_rule(dev, attr, items, actions))
> -		tunnel = (struct mlx5_flow_tunnel *)actions[0].conf;
> -	else
> -		tunnel = NULL;
> +	tunnel = (typeof(tunnel))flow->tunnel;
>  #pragma GCC diagnostic pop
> 
>  	return tunnel;
> @@ -6168,12 +6161,11 @@ flow_list_create(struct rte_eth_dev *dev,
> uint32_t *list,
>  					      error);
>  		if (ret < 0)
>  			goto error;
> -		if (is_flow_tunnel_steer_rule(dev, attr,
> -					      buf->entry[i].pattern,
> -					      p_actions_rx)) {
> +		if (is_flow_tunnel_steer_rule(wks->flows[0].tof_type)) {
>  			ret = flow_tunnel_add_default_miss(dev, flow, attr,
>  							   p_actions_rx,
>  							   idx,
> +							   wks-
> >flows[0].tunnel,
>  							   &default_miss_ctx,
>  							   error);
>  			if (ret < 0) {
> @@ -6237,7 +6229,7 @@ flow_list_create(struct rte_eth_dev *dev,
> uint32_t *list,
>  	}
>  	flow_rxq_flags_set(dev, flow);
>  	rte_free(translated_actions);
> -	tunnel = flow_tunnel_from_rule(dev, attr, items, actions);
> +	tunnel = flow_tunnel_from_rule(wks->flows);
>  	if (tunnel) {
>  		flow->tunnel = 1;
>  		flow->tunnel_id = tunnel->tunnel_id;
> @@ -8152,6 +8144,28 @@ int rte_pmd_mlx5_sync_flow(uint16_t port_id,
> uint32_t domains)
>  	return ret;
>  }
> 
> +const struct mlx5_flow_tunnel *
> +mlx5_get_tof(const struct rte_flow_item *item,
> +	     const struct rte_flow_action *action,
> +	     enum mlx5_tof_rule_type *rule_type) {
> +	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
> +		if (item->type == (typeof(item->type))
> +				  MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL) {
> +			*rule_type =
> MLX5_TUNNEL_OFFLOAD_MATCH_RULE;
> +			return flow_items_to_tunnel(item);
> +		}
> +	}
> +	for (; action->conf != RTE_FLOW_ACTION_TYPE_END; action++) {
> +		if (action->type == (typeof(action->type))
> +
> MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET) {
> +			*rule_type = MLX5_TUNNEL_OFFLOAD_SET_RULE;
> +			return flow_actions_to_tunnel(action);
> +		}
> +	}
> +	return NULL;
> +}
> +
>  /**
>   * tunnel offload functionalilty is defined for DV environment only
>   */
> @@ -8182,13 +8196,13 @@ flow_tunnel_add_default_miss(struct
> rte_eth_dev *dev,
>  			     const struct rte_flow_attr *attr,
>  			     const struct rte_flow_action *app_actions,
>  			     uint32_t flow_idx,
> +			     const struct mlx5_flow_tunnel *tunnel,
>  			     struct tunnel_default_miss_ctx *ctx,
>  			     struct rte_flow_error *error)
>  {
>  	struct mlx5_priv *priv = dev->data->dev_private;
>  	struct mlx5_flow *dev_flow;
>  	struct rte_flow_attr miss_attr = *attr;
> -	const struct mlx5_flow_tunnel *tunnel = app_actions[0].conf;
>  	const struct rte_flow_item miss_items[2] = {
>  		{
>  			.type = RTE_FLOW_ITEM_TYPE_ETH,
> @@ -8274,6 +8288,7 @@ flow_tunnel_add_default_miss(struct
> rte_eth_dev *dev,
>  	dev_flow->flow = flow;
>  	dev_flow->external = true;
>  	dev_flow->tunnel = tunnel;
> +	dev_flow->tof_type = MLX5_TUNNEL_OFFLOAD_MISS_RULE;
>  	/* Subflow object was created, we must include one in the list. */
>  	SILIST_INSERT(&flow->dev_handles, dev_flow->handle_idx,
>  		      dev_flow->handle, next);
> @@ -8887,6 +8902,7 @@ flow_tunnel_add_default_miss(__rte_unused
> struct rte_eth_dev *dev,
>  			     __rte_unused const struct rte_flow_attr *attr,
>  			     __rte_unused const struct rte_flow_action
> *actions,
>  			     __rte_unused uint32_t flow_idx,
> +			     __rte_unused const struct mlx5_flow_tunnel
> *tunnel,
>  			     __rte_unused struct tunnel_default_miss_ctx
> *ctx,
>  			     __rte_unused struct rte_flow_error *error)  { diff
> --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
> index 5365699426..04c8806bf6 100644
> --- a/drivers/net/mlx5/mlx5_flow.h
> +++ b/drivers/net/mlx5/mlx5_flow.h
> @@ -819,6 +819,16 @@ struct mlx5_flow_verbs_workspace {
>  /** Maximal number of device sub-flows supported. */  #define
> MLX5_NUM_MAX_DEV_FLOWS 32
> 
> +/**
> + * tunnel offload rules type
> + */
> +enum mlx5_tof_rule_type {
> +	MLX5_TUNNEL_OFFLOAD_NONE = 0,
> +	MLX5_TUNNEL_OFFLOAD_SET_RULE,
> +	MLX5_TUNNEL_OFFLOAD_MATCH_RULE,
> +	MLX5_TUNNEL_OFFLOAD_MISS_RULE,
> +};
> +
>  /** Device flow structure. */
>  __extension__
>  struct mlx5_flow {
> @@ -854,6 +864,7 @@ struct mlx5_flow {
>  	struct mlx5_flow_handle *handle;
>  	uint32_t handle_idx; /* Index of the mlx5 flow handle memory. */
>  	const struct mlx5_flow_tunnel *tunnel;
> +	enum mlx5_tof_rule_type tof_type;
>  };
> 
>  /* Flow meter state. */
> @@ -949,10 +960,10 @@ mlx5_tunnel_hub(struct rte_eth_dev *dev)  }
> 
>  static inline bool
> -is_tunnel_offload_active(struct rte_eth_dev *dev)
> +is_tunnel_offload_active(const struct rte_eth_dev *dev)
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -	struct mlx5_priv *priv = dev->data->dev_private;
> +	const struct mlx5_priv *priv = dev->data->dev_private;
>  	return !!priv->config.dv_miss_info;
>  #else
>  	RTE_SET_USED(dev);
> @@ -961,23 +972,15 @@ is_tunnel_offload_active(struct rte_eth_dev
> *dev)  }
> 
>  static inline bool
> -is_flow_tunnel_match_rule(__rte_unused struct rte_eth_dev *dev,
> -			  __rte_unused const struct rte_flow_attr *attr,
> -			  __rte_unused const struct rte_flow_item items[],
> -			  __rte_unused const struct rte_flow_action
> actions[])
> +is_flow_tunnel_match_rule(enum mlx5_tof_rule_type tof_rule_type)
>  {
> -	return (items[0].type == (typeof(items[0].type))
> -				 MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL);
> +	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_MATCH_RULE;
>  }
> 
>  static inline bool
> -is_flow_tunnel_steer_rule(__rte_unused struct rte_eth_dev *dev,
> -			  __rte_unused const struct rte_flow_attr *attr,
> -			  __rte_unused const struct rte_flow_item items[],
> -			  __rte_unused const struct rte_flow_action
> actions[])
> +is_flow_tunnel_steer_rule(enum mlx5_tof_rule_type tof_rule_type)
>  {
> -	return (actions[0].type == (typeof(actions[0].type))
> -
> MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET);
> +	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_SET_RULE;
>  }
> 
>  static inline const struct mlx5_flow_tunnel * @@ -1273,11 +1276,10 @@
> struct flow_grp_info {
> 
>  static inline bool
>  tunnel_use_standard_attr_group_translate
> -		    (struct rte_eth_dev *dev,
> -		     const struct mlx5_flow_tunnel *tunnel,
> +		    (const struct rte_eth_dev *dev,
>  		     const struct rte_flow_attr *attr,
> -		     const struct rte_flow_item items[],
> -		     const struct rte_flow_action actions[])
> +		     const struct mlx5_flow_tunnel *tunnel,
> +		     enum mlx5_tof_rule_type tof_rule_type)
>  {
>  	bool verdict;
> 
> @@ -1293,7 +1295,7 @@ tunnel_use_standard_attr_group_translate
>  		 * method
>  		 */
>  		verdict = !attr->group &&
> -			  is_flow_tunnel_steer_rule(dev, attr, items,
> actions);
> +			  is_flow_tunnel_steer_rule(tof_rule_type);
>  	} else {
>  		/*
>  		 * non-tunnel group translation uses standard method for
> @@ -1681,4 +1683,10 @@ int mlx5_flow_create_def_policy(struct
> rte_eth_dev *dev);  void mlx5_flow_destroy_def_policy(struct rte_eth_dev
> *dev);  void flow_drv_rxq_flags_set(struct rte_eth_dev *dev,
>  		       struct mlx5_flow_handle *dev_handle);
> +const struct mlx5_flow_tunnel *
> +mlx5_get_tof(const struct rte_flow_item *items,
> +	     const struct rte_flow_action *actions,
> +	     enum mlx5_tof_rule_type *rule_type);
> +
> +
>  #endif /* RTE_PMD_MLX5_FLOW_H_ */
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c
> b/drivers/net/mlx5/mlx5_flow_dv.c index 70e8d0b113..10ca342edc
> 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -6627,10 +6627,12 @@ flow_dv_validate(struct rte_eth_dev *dev,
> const struct rte_flow_attr *attr,
>  	uint32_t rw_act_num = 0;
>  	uint64_t is_root;
>  	const struct mlx5_flow_tunnel *tunnel;
> +	enum mlx5_tof_rule_type tof_rule_type;
>  	struct flow_grp_info grp_info = {
>  		.external = !!external,
>  		.transfer = !!attr->transfer,
>  		.fdb_def_rule = !!priv->fdb_def_rule,
> +		.std_tbl_fix = true,
>  	};
>  	const struct rte_eth_hairpin_conf *conf;
>  	const struct rte_flow_item *rule_items = items; @@ -6638,23
> +6640,22 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct
> rte_flow_attr *attr,
> 
>  	if (items == NULL)
>  		return -1;
> -	if (is_flow_tunnel_match_rule(dev, attr, items, actions)) {
> -		tunnel = flow_items_to_tunnel(items);
> -		action_flags |= MLX5_FLOW_ACTION_TUNNEL_MATCH |
> -				MLX5_FLOW_ACTION_DECAP;
> -	} else if (is_flow_tunnel_steer_rule(dev, attr, items, actions)) {
> -		tunnel = flow_actions_to_tunnel(actions);
> -		action_flags |= MLX5_FLOW_ACTION_TUNNEL_SET;
> -	} else {
> -		tunnel = NULL;
> +	tunnel = is_tunnel_offload_active(dev) ?
> +		 mlx5_get_tof(items, actions, &tof_rule_type) : NULL;
> +	if (tunnel) {
> +		if (priv->representor)
> +			return rte_flow_error_set
> +				(error, ENOTSUP,
> +				 RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +				 NULL, "decap not supported for VF
> representor");
> +		if (tof_rule_type == MLX5_TUNNEL_OFFLOAD_SET_RULE)
> +			action_flags |= MLX5_FLOW_ACTION_TUNNEL_SET;
> +		else if (tof_rule_type ==
> MLX5_TUNNEL_OFFLOAD_MATCH_RULE)
> +			action_flags |=
> MLX5_FLOW_ACTION_TUNNEL_MATCH |
> +					MLX5_FLOW_ACTION_DECAP;
> +		grp_info.std_tbl_fix =
> tunnel_use_standard_attr_group_translate
> +					(dev, attr, tunnel, tof_rule_type);
>  	}
> -	if (tunnel && priv->representor)
> -		return rte_flow_error_set(error, ENOTSUP,
> -
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
> -					  "decap not supported "
> -					  "for VF representor");
> -	grp_info.std_tbl_fix = tunnel_use_standard_attr_group_translate
> -				(dev, tunnel, attr, items, actions);
>  	ret = flow_dv_validate_attributes(dev, tunnel, attr, &grp_info,
> error);
>  	if (ret < 0)
>  		return ret;
> @@ -6668,15 +6669,6 @@ flow_dv_validate(struct rte_eth_dev *dev,
> const struct rte_flow_attr *attr,
> 
> RTE_FLOW_ERROR_TYPE_ITEM,
>  						  NULL, "item not
> supported");
>  		switch (type) {
> -		case MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL:
> -			if (items[0].type != (typeof(items[0].type))
> -
> 	MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL)
> -				return rte_flow_error_set
> -						(error, EINVAL,
> -
> 	RTE_FLOW_ERROR_TYPE_ITEM,
> -						NULL, "MLX5 private items "
> -						"must be the first");
> -			break;
>  		case RTE_FLOW_ITEM_TYPE_VOID:
>  			break;
>  		case RTE_FLOW_ITEM_TYPE_PORT_ID:
> @@ -6975,6 +6967,11 @@ flow_dv_validate(struct rte_eth_dev *dev,
> const struct rte_flow_attr *attr,
>  			if (ret < 0)
>  				return ret;
>  			break;
> +		case MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL:
> +			/* tunnel offload item was processed before
> +			 * list it here as a supported type
> +			 */
> +			break;
>  		default:
>  			return rte_flow_error_set(error, ENOTSUP,
> 
> RTE_FLOW_ERROR_TYPE_ITEM,
> @@ -7516,17 +7513,6 @@ flow_dv_validate(struct rte_eth_dev *dev,
> const struct rte_flow_attr *attr,
>  			action_flags |= MLX5_FLOW_ACTION_SAMPLE;
>  			++actions_n;
>  			break;
> -		case MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET:
> -			if (actions[0].type != (typeof(actions[0].type))
> -
> 	MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET)
> -				return rte_flow_error_set
> -						(error, EINVAL,
> -
> 	RTE_FLOW_ERROR_TYPE_ACTION,
> -						NULL, "MLX5 private action "
> -						"must be the first");
> -
> -			action_flags |= MLX5_FLOW_ACTION_TUNNEL_SET;
> -			break;
>  		case RTE_FLOW_ACTION_TYPE_MODIFY_FIELD:
>  			ret = flow_dv_validate_action_modify_field(dev,
> 
> action_flags,
> @@ -7551,6 +7537,11 @@ flow_dv_validate(struct rte_eth_dev *dev,
> const struct rte_flow_attr *attr,
>  				return ret;
>  			action_flags |= MLX5_FLOW_ACTION_CT;
>  			break;
> +		case MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET:
> +			/* tunnel offload action was processed before
> +			 * list it here as a supported type
> +			 */
> +			break;
>  		default:
>  			return rte_flow_error_set(error, ENOTSUP,
> 
> RTE_FLOW_ERROR_TYPE_ACTION,
> @@ -12035,13 +12026,14 @@ flow_dv_translate(struct rte_eth_dev *dev,
>  	int tmp_actions_n = 0;
>  	uint32_t table;
>  	int ret = 0;
> -	const struct mlx5_flow_tunnel *tunnel;
> +	const struct mlx5_flow_tunnel *tunnel = NULL;
>  	struct flow_grp_info grp_info = {
>  		.external = !!dev_flow->external,
>  		.transfer = !!attr->transfer,
>  		.fdb_def_rule = !!priv->fdb_def_rule,
>  		.skip_scale = dev_flow->skip_scale &
>  			(1 << MLX5_SCALE_FLOW_GROUP_BIT),
> +		.std_tbl_fix = true,
>  	};
>  	const struct rte_flow_item *head_item = items;
> 
> @@ -12057,15 +12049,21 @@ flow_dv_translate(struct rte_eth_dev *dev,
> 
> MLX5DV_FLOW_TABLE_TYPE_NIC_RX;
>  	/* update normal path action resource into last index of array */
>  	sample_act = &mdest_res.sample_act[MLX5_MAX_DEST_NUM -
> 1];
> -	tunnel = is_flow_tunnel_match_rule(dev, attr, items, actions) ?
> -		 flow_items_to_tunnel(items) :
> -		 is_flow_tunnel_steer_rule(dev, attr, items, actions) ?
> -		 flow_actions_to_tunnel(actions) :
> -		 dev_flow->tunnel ? dev_flow->tunnel : NULL;
> +	if (is_tunnel_offload_active(dev)) {
> +		if (dev_flow->tunnel) {
> +			RTE_VERIFY(dev_flow->tof_type ==
> +				   MLX5_TUNNEL_OFFLOAD_MISS_RULE);
> +			tunnel = dev_flow->tunnel;
> +		} else {
> +			tunnel = mlx5_get_tof(items, actions,
> +					      &dev_flow->tof_type);
> +			dev_flow->tunnel = tunnel;
> +		}
> +		grp_info.std_tbl_fix =
> tunnel_use_standard_attr_group_translate
> +					(dev, attr, tunnel, dev_flow-
> >tof_type);
> +	}
>  	mhdr_res->ft_type = attr->egress ?
> MLX5DV_FLOW_TABLE_TYPE_NIC_TX :
> 
> MLX5DV_FLOW_TABLE_TYPE_NIC_RX;
> -	grp_info.std_tbl_fix = tunnel_use_standard_attr_group_translate
> -				(dev, tunnel, attr, items, actions);
>  	ret = mlx5_flow_group_to_table(dev, tunnel, attr->group, &table,
>  				       &grp_info, error);
>  	if (ret)
> @@ -12075,7 +12073,7 @@ flow_dv_translate(struct rte_eth_dev *dev,
>  		mhdr_res->ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB;
>  	/* number of actions must be set to 0 in case of dirty stack. */
>  	mhdr_res->actions_num = 0;
> -	if (is_flow_tunnel_match_rule(dev, attr, items, actions)) {
> +	if (is_flow_tunnel_match_rule(dev_flow->tof_type)) {
>  		/*
>  		 * do not add decap action if match rule drops packet
>  		 * HW rejects rules with decap & drop
> --
> 2.31.1


  reply	other threads:[~2021-05-10 12:29 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-19 13:02 [dpdk-dev] [PATCH 1/2] " Gregory Etelson
2021-04-19 13:02 ` [dpdk-dev] [PATCH 2/2] app/testpmd: " Gregory Etelson
2021-04-23  8:50   ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2021-04-25 15:57 ` [dpdk-dev] [PATCH v2 1/2] net/mlx5: " Gregory Etelson
2021-04-25 15:57   ` [dpdk-dev] [PATCH v2 2/2] app/testpmd: " Gregory Etelson
2021-04-30 13:49     ` Ferruh Yigit
2021-04-25 16:28   ` [dpdk-dev] [PATCH v2 1/2] net/mlx5: " Thomas Monjalon
2021-04-25 17:01     ` Gregory Etelson
2021-04-25 17:07       ` Thomas Monjalon
2021-04-26  7:54         ` Ferruh Yigit
2021-04-27  9:27           ` Gregory Etelson
2021-04-29  7:44             ` Gregory Etelson
2021-04-30 13:37               ` Ferruh Yigit
2021-05-04  9:20           ` Gregory Etelson
2021-05-02  8:08 ` [dpdk-dev] [PATCH v3] " Gregory Etelson
2021-05-04  8:10   ` Raslan Darawsheh
2021-05-04  8:20   ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2021-05-04  9:12     ` Gregory Etelson
2021-05-05 17:45       ` Ferruh Yigit
2021-05-06  6:08         ` Gregory Etelson
2021-05-06  7:40           ` Gregory Etelson
2021-05-06  7:59             ` [dpdk-dev] net/mlx5: mellanox cx5/cx6-dx increment "rx_phy_discard_packets" with DPDK rte_flow actions COUNT & DROP Arthas
2021-05-06 10:55               ` Slava Ovsiienko
2021-05-06  9:57 ` [dpdk-dev] [PATCH v4] net/mlx5: fix tunnel offload private items location Gregory Etelson
2021-05-10 12:29   ` Gregory Etelson [this message]
2021-05-10 16:10     ` Ferruh Yigit
2021-05-11 22:16   ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BY5PR12MB48348AC04451A31CF5D481A5A5549@BY5PR12MB4834.namprd12.prod.outlook.com \
    --to=getelson@nvidia.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=rasland@nvidia.com \
    --cc=viacheslavo@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).