[2/2] net/mlx5: fix missing RSS expansion of IPv6 frag

Message ID 88ccba94f213b6715f34038b6b400a5bab889aa3.1625624590.git.jackmin@nvidia.com (mailing list archive)
State Accepted, archived
Delegated to: Raslan Darawsheh
Headers
Series fix RSS expansion missing items |

Checks

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

Commit Message

Jack Min July 7, 2021, 2:32 a.m. UTC
  IPV6_FRAG_EXT item is missed for RSS expansion which causes flows like
[1] are wrongly expanded.

Different from other items, IPV6_FRAG_EXT hasn't next field because HW
only support to do hash of UDP/TCP for non-fragment.

This MLX5_EXPANSION_IPV6_FRAG_EXT node in RSS expansion graph only helps
RSS expansion function to locate right node in graph from which start
to expand.

Fixes: 0e5a0d8f7556 ("net/mlx5: support match on IPv6 fragment extension")
Cc: stable@dpdk.org

[1]:
flow create 0 ingress pattern eth / ipv6 / udp dst is 250 / vxlan-gpe /
ipv6 / ipv6_frag_ext / end actions rss level 2 types ip end / end

Signed-off-by: Xiaoyu Min <jackmin@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
  

Comments

Raslan Darawsheh July 12, 2021, 8:05 a.m. UTC | #1
Hi,

> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Xiaoyu Min
> Sent: Wednesday, July 7, 2021 5:33 AM
> To: Matan Azrad <matan@nvidia.com>; Shahaf Shuler
> <shahafs@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Dekel
> Peled <dekelp@nvidia.com>; Ori Kam <orika@nvidia.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: [dpdk-dev] [PATCH 2/2] net/mlx5: fix missing RSS expansion of IPv6
> frag
> 
> IPV6_FRAG_EXT item is missed for RSS expansion which causes flows like
> [1] are wrongly expanded.
> 
> Different from other items, IPV6_FRAG_EXT hasn't next field because HW
> only support to do hash of UDP/TCP for non-fragment.
> 
> This MLX5_EXPANSION_IPV6_FRAG_EXT node in RSS expansion graph only
> helps
> RSS expansion function to locate right node in graph from which start
> to expand.
> 
> Fixes: 0e5a0d8f7556 ("net/mlx5: support match on IPv6 fragment
> extension")
> Cc: stable@dpdk.org
> 
> [1]:
> flow create 0 ingress pattern eth / ipv6 / udp dst is 250 / vxlan-gpe /
> ipv6 / ipv6_frag_ext / end actions rss level 2 types ip end / end
> 
> Signed-off-by: Xiaoyu Min <jackmin@nvidia.com>
> ---
>  drivers/net/mlx5/mlx5_flow.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> index 1b682ac8ed..90b8cf6692 100644
> --- a/drivers/net/mlx5/mlx5_flow.c
> +++ b/drivers/net/mlx5/mlx5_flow.c
> @@ -134,6 +134,7 @@ mlx5_flow_is_rss_expandable_item(const struct
> rte_flow_item *item)
>  	case RTE_FLOW_ITEM_TYPE_MPLS:
>  	case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
>  	case RTE_FLOW_ITEM_TYPE_GRE_KEY:
> +	case RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT:

Adding IPV6_FRAG_EXT to the list of expandable is not accurate,
Assuming HW support matching on L4 info after frag - which I think it doesn't.
It will lead that the first frag will get different hash than other frags since it the only one which contain info of L4 header
This will lead to different RSS spreading and that's not correct.

Kindest regards,
Raslan Darawsheh
  
Jack Min July 14, 2021, 7:31 a.m. UTC | #2
On Mon, 21-07-12, 08:05, Raslan Darawsheh wrote:

Hey,
> Hi,
> 
> > -----Original Message-----
> > From: dev <dev-bounces@dpdk.org> On Behalf Of Xiaoyu Min
> > Sent: Wednesday, July 7, 2021 5:33 AM
> > To: Matan Azrad <matan@nvidia.com>; Shahaf Shuler
> > <shahafs@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Dekel
> > Peled <dekelp@nvidia.com>; Ori Kam <orika@nvidia.com>
> > Cc: dev@dpdk.org; stable@dpdk.org
> > Subject: [dpdk-dev] [PATCH 2/2] net/mlx5: fix missing RSS expansion of IPv6
> > frag
> > 
> > IPV6_FRAG_EXT item is missed for RSS expansion which causes flows like
> > [1] are wrongly expanded.
> > 
> > Different from other items, IPV6_FRAG_EXT hasn't next field because HW
> > only support to do hash of UDP/TCP for non-fragment.
> > 
> > This MLX5_EXPANSION_IPV6_FRAG_EXT node in RSS expansion graph only
> > helps
> > RSS expansion function to locate right node in graph from which start
> > to expand.
> > 
> > Fixes: 0e5a0d8f7556 ("net/mlx5: support match on IPv6 fragment
> > extension")
> > Cc: stable@dpdk.org
> > 
> > [1]:
> > flow create 0 ingress pattern eth / ipv6 / udp dst is 250 / vxlan-gpe /
> > ipv6 / ipv6_frag_ext / end actions rss level 2 types ip end / end
> > 
> > Signed-off-by: Xiaoyu Min <jackmin@nvidia.com>
> > ---
> >  drivers/net/mlx5/mlx5_flow.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> > index 1b682ac8ed..90b8cf6692 100644
> > --- a/drivers/net/mlx5/mlx5_flow.c
> > +++ b/drivers/net/mlx5/mlx5_flow.c
> > @@ -134,6 +134,7 @@ mlx5_flow_is_rss_expandable_item(const struct
> > rte_flow_item *item)
> >  	case RTE_FLOW_ITEM_TYPE_MPLS:
> >  	case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
> >  	case RTE_FLOW_ITEM_TYPE_GRE_KEY:
> > +	case RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT:
> 
> Adding IPV6_FRAG_EXT to the list of expandable is not accurate,
> Assuming HW support matching on L4 info after frag - which I think it doesn't.
> It will lead that the first frag will get different hash than other frags since it the only one which contain info of L4 header
> This will lead to different RSS spreading and that's not correct.

No, it will not expand to any items because the .next field is empty of entry
MLX5_EXPANSION_IPV6_FRAG_EXT in mlx5_support_expansion[].

-Jack
> 
> Kindest regards,
> Raslan Darawsheh
  
Raslan Darawsheh July 14, 2021, 7:47 a.m. UTC | #3
> -----Original Message-----
> From: Jack Min <jackmin@nvidia.com>
> Sent: Wednesday, July 14, 2021 10:31 AM
> To: Raslan Darawsheh <rasland@nvidia.com>
> Cc: Matan Azrad <matan@nvidia.com>; Shahaf Shuler
> <shahafs@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>; Dekel
> Peled <dekelp@nvidia.com>; Ori Kam <orika@nvidia.com>; dev@dpdk.org;
> stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 2/2] net/mlx5: fix missing RSS expansion of
> IPv6 frag
> 
> On Mon, 21-07-12, 08:05, Raslan Darawsheh wrote:
> 
> Hey,
> > Hi,
> >
> > > -----Original Message-----
> > > From: dev <dev-bounces@dpdk.org> On Behalf Of Xiaoyu Min
> > > Sent: Wednesday, July 7, 2021 5:33 AM
> > > To: Matan Azrad <matan@nvidia.com>; Shahaf Shuler
> > > <shahafs@nvidia.com>; Slava Ovsiienko <viacheslavo@nvidia.com>;
> > > Dekel Peled <dekelp@nvidia.com>; Ori Kam <orika@nvidia.com>
> > > Cc: dev@dpdk.org; stable@dpdk.org
> > > Subject: [dpdk-dev] [PATCH 2/2] net/mlx5: fix missing RSS expansion
> > > of IPv6 frag
> > >
> > > IPV6_FRAG_EXT item is missed for RSS expansion which causes flows
> > > like [1] are wrongly expanded.
> > >
> > > Different from other items, IPV6_FRAG_EXT hasn't next field because
> > > HW only support to do hash of UDP/TCP for non-fragment.
> > >
> > > This MLX5_EXPANSION_IPV6_FRAG_EXT node in RSS expansion graph
> only
> > > helps RSS expansion function to locate right node in graph from
> > > which start to expand.
> > >
> > > Fixes: 0e5a0d8f7556 ("net/mlx5: support match on IPv6 fragment
> > > extension")
> > > Cc: stable@dpdk.org
> > >
> > > [1]:
> > > flow create 0 ingress pattern eth / ipv6 / udp dst is 250 /
> > > vxlan-gpe /
> > > ipv6 / ipv6_frag_ext / end actions rss level 2 types ip end / end
> > >
> > > Signed-off-by: Xiaoyu Min <jackmin@nvidia.com>
> > > ---
> > >  drivers/net/mlx5/mlx5_flow.c | 8 +++++++-
> > >  1 file changed, 7 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/net/mlx5/mlx5_flow.c
> > > b/drivers/net/mlx5/mlx5_flow.c index 1b682ac8ed..90b8cf6692 100644
> > > --- a/drivers/net/mlx5/mlx5_flow.c
> > > +++ b/drivers/net/mlx5/mlx5_flow.c
> > > @@ -134,6 +134,7 @@ mlx5_flow_is_rss_expandable_item(const struct
> > > rte_flow_item *item)
> > >  	case RTE_FLOW_ITEM_TYPE_MPLS:
> > >  	case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
> > >  	case RTE_FLOW_ITEM_TYPE_GRE_KEY:
> > > +	case RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT:
> >
> > Adding IPV6_FRAG_EXT to the list of expandable is not accurate,
> > Assuming HW support matching on L4 info after frag - which I think it
> doesn't.
> > It will lead that the first frag will get different hash than other
> > frags since it the only one which contain info of L4 header This will lead to
> different RSS spreading and that's not correct.
> 
> No, it will not expand to any items because the .next field is empty of entry
> MLX5_EXPANSION_IPV6_FRAG_EXT in mlx5_support_expansion[].
> 
Great thanks for explanation, 
> -Jack
> >
> > Kindest regards,
> > Raslan Darawsheh
Kindest regards
Raslan Darawsheh
  

Patch

diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 1b682ac8ed..90b8cf6692 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -134,6 +134,7 @@  mlx5_flow_is_rss_expandable_item(const struct rte_flow_item *item)
 	case RTE_FLOW_ITEM_TYPE_MPLS:
 	case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
 	case RTE_FLOW_ITEM_TYPE_GRE_KEY:
+	case RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT:
 		return true;
 	default:
 		break;
@@ -453,6 +454,7 @@  enum mlx5_expansion {
 	MLX5_EXPANSION_IPV6,
 	MLX5_EXPANSION_IPV6_UDP,
 	MLX5_EXPANSION_IPV6_TCP,
+	MLX5_EXPANSION_IPV6_FRAG_EXT,
 };
 
 /** Supported expansion of items. */
@@ -607,7 +609,8 @@  static const struct mlx5_flow_expand_node mlx5_support_expansion[] = {
 	},
 	[MLX5_EXPANSION_IPV6] = {
 		.next = MLX5_FLOW_EXPAND_RSS_NEXT(MLX5_EXPANSION_IPV6_UDP,
-						  MLX5_EXPANSION_IPV6_TCP),
+						  MLX5_EXPANSION_IPV6_TCP,
+						  MLX5_EXPANSION_IPV6_FRAG_EXT),
 		.type = RTE_FLOW_ITEM_TYPE_IPV6,
 		.rss_types = ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 |
 			ETH_RSS_NONFRAG_IPV6_OTHER,
@@ -620,6 +623,9 @@  static const struct mlx5_flow_expand_node mlx5_support_expansion[] = {
 		.type = RTE_FLOW_ITEM_TYPE_TCP,
 		.rss_types = ETH_RSS_NONFRAG_IPV6_TCP,
 	},
+	[MLX5_EXPANSION_IPV6_FRAG_EXT] = {
+		.type = RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
+	},
 };
 
 static struct rte_flow_action_handle *