Message ID | 168098189656.96582.16141211495116669329.stgit@firesoul (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | XDP-hints: API change for RX-hash kfunc bpf_xdp_metadata_rx_hash | expand |
On Sat, Apr 08, 2023 at 09:24:56PM +0200, Jesper Dangaard Brouer wrote: > Update API for bpf_xdp_metadata_rx_hash() with arg for xdp rss hash type > via mapping table. > > The mlx5 hardware can also identify and RSS hash IPSEC. This indicate > hash includes SPI (Security Parameters Index) as part of IPSEC hash. > > Extend xdp core enum xdp_rss_hash_type with IPSEC hash type. > > Fixes: bc8d405b1ba9 ("net/mlx5e: Support RX XDP metadata") > Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> > Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> > Acked-by: Stanislav Fomichev <sdf@google.com> > --- > drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 60 ++++++++++++++++++++++ > include/linux/mlx5/device.h | 14 ++++- > include/net/xdp.h | 2 + > 3 files changed, 73 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > index efe609f8e3aa..97ef1df94d50 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > @@ -34,6 +34,7 @@ > #include <net/xdp_sock_drv.h> > #include "en/xdp.h" > #include "en/params.h" > +#include <linux/bitfield.h> > > int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk) > { > @@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > return 0; > } > > +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bits*/ > +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ > +#define RSS_L4 GENMASK(1, 0) > +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ > + > +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numerical */ > +enum mlx5_rss_hash_type { > + RSS_TYPE_NO_HASH = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > + RSS_TYPE_L3_IPV4 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > + RSS_TYPE_L4_IPV4_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), > + RSS_TYPE_L4_IPV4_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), > + RSS_TYPE_L4_IPV4_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), > + RSS_TYPE_L3_IPV6 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > + RSS_TYPE_L4_IPV6_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), > + RSS_TYPE_L4_IPV6_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), > + RSS_TYPE_L4_IPV6_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), > +} mlx5_rss_hash_type; Hi Jesper, Sparse seems confused about 'mlx5_rss_hash_type' on the line above. And I am too. Perhaps it can be removed? drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c:198:3: warning: symbol 'mlx5_rss_hash_type' was not declared. Should it be static? ...
On 10/04/2023 17.11, Simon Horman wrote: > On Sat, Apr 08, 2023 at 09:24:56PM +0200, Jesper Dangaard Brouer wrote: >> Update API for bpf_xdp_metadata_rx_hash() with arg for xdp rss hash type >> via mapping table. >> >> The mlx5 hardware can also identify and RSS hash IPSEC. This indicate >> hash includes SPI (Security Parameters Index) as part of IPSEC hash. >> >> Extend xdp core enum xdp_rss_hash_type with IPSEC hash type. >> >> Fixes: bc8d405b1ba9 ("net/mlx5e: Support RX XDP metadata") >> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> >> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> >> Acked-by: Stanislav Fomichev <sdf@google.com> >> --- >> drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 60 ++++++++++++++++++++++ >> include/linux/mlx5/device.h | 14 ++++- >> include/net/xdp.h | 2 + >> 3 files changed, 73 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c >> index efe609f8e3aa..97ef1df94d50 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c >> @@ -34,6 +34,7 @@ >> #include <net/xdp_sock_drv.h> >> #include "en/xdp.h" >> #include "en/params.h" >> +#include <linux/bitfield.h> >> >> int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk) >> { >> @@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) >> return 0; >> } >> >> +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bits*/ >> +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ >> +#define RSS_L4 GENMASK(1, 0) >> +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ >> + >> +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numerical */ >> +enum mlx5_rss_hash_type { >> + RSS_TYPE_NO_HASH = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), >> + RSS_TYPE_L3_IPV4 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), >> + RSS_TYPE_L4_IPV4_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), >> + RSS_TYPE_L4_IPV4_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), >> + RSS_TYPE_L4_IPV4_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), >> + RSS_TYPE_L3_IPV6 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), >> + RSS_TYPE_L4_IPV6_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), >> + RSS_TYPE_L4_IPV6_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), >> + RSS_TYPE_L4_IPV6_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | >> + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), >> +} mlx5_rss_hash_type; > > Hi Jesper, > > Sparse seems confused about 'mlx5_rss_hash_type' on the line above. > And I am too. Perhaps it can be removed? > Yes, it can be removed (in V8). The reason/trick for doing this was to get compiler to create the enum symbol, which allowed me to inspect the type using pahole (see cmd below). (This will also expose this to BTF, but it isn't actually useful to keep around for BTF, so I will remove it in V8.) $ pahole -C mlx5_rss_hash_type drivers/net/ethernet/mellanox/mlx5/core/en/xdp.o enum mlx5_rss_hash_type { RSS_TYPE_NO_HASH = 0, RSS_TYPE_L3_IPV4 = 4, RSS_TYPE_L4_IPV4_TCP = 5, RSS_TYPE_L4_IPV4_UDP = 6, RSS_TYPE_L4_IPV4_IPSEC = 7, RSS_TYPE_L3_IPV6 = 8, RSS_TYPE_L4_IPV6_TCP = 9, RSS_TYPE_L4_IPV6_UDP = 10, RSS_TYPE_L4_IPV6_IPSEC = 11, }; This is practical to for reviewers to see if below code is correct: > +/* Invalid combinations will simply return zero, allows no boundary checks */ > +static const enum xdp_rss_hash_type mlx5_xdp_rss_type[RSS_TYPE_MAX_TABLE] = { > + [RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_NONE, > + [1] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [2] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [3] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [RSS_TYPE_L3_IPV4] = XDP_RSS_TYPE_L3_IPV4, > + [RSS_TYPE_L4_IPV4_TCP] = XDP_RSS_TYPE_L4_IPV4_TCP, > + [RSS_TYPE_L4_IPV4_UDP] = XDP_RSS_TYPE_L4_IPV4_UDP, > + [RSS_TYPE_L4_IPV4_IPSEC] = XDP_RSS_TYPE_L4_IPV4_IPSEC, > + [RSS_TYPE_L3_IPV6] = XDP_RSS_TYPE_L3_IPV6, > + [RSS_TYPE_L4_IPV6_TCP] = XDP_RSS_TYPE_L4_IPV6_TCP, > + [RSS_TYPE_L4_IPV6_UDP] = XDP_RSS_TYPE_L4_IPV6_UDP, > + [RSS_TYPE_L4_IPV6_IPSEC] = XDP_RSS_TYPE_L4_IPV6_IPSEC, > + [12] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [13] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [14] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > + [15] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > +}; > drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c:198:3: warning: symbol 'mlx5_rss_hash_type' was not declared. Should it be static? > > ... >
On Wed, Apr 12, 2023 at 01:31:18PM +0200, Jesper Dangaard Brouer wrote: > [You don't often get email from jbrouer@redhat.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ] > > On 10/04/2023 17.11, Simon Horman wrote: > > On Sat, Apr 08, 2023 at 09:24:56PM +0200, Jesper Dangaard Brouer wrote: > > > Update API for bpf_xdp_metadata_rx_hash() with arg for xdp rss hash type > > > via mapping table. > > > > > > The mlx5 hardware can also identify and RSS hash IPSEC. This indicate > > > hash includes SPI (Security Parameters Index) as part of IPSEC hash. > > > > > > Extend xdp core enum xdp_rss_hash_type with IPSEC hash type. > > > > > > Fixes: bc8d405b1ba9 ("net/mlx5e: Support RX XDP metadata") > > > Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> > > > Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> > > > Acked-by: Stanislav Fomichev <sdf@google.com> > > > --- > > > drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 60 ++++++++++++++++++++++ > > > include/linux/mlx5/device.h | 14 ++++- > > > include/net/xdp.h | 2 + > > > 3 files changed, 73 insertions(+), 3 deletions(-) > > > > > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > > > index efe609f8e3aa..97ef1df94d50 100644 > > > --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > > > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c > > > @@ -34,6 +34,7 @@ > > > #include <net/xdp_sock_drv.h> > > > #include "en/xdp.h" > > > #include "en/params.h" > > > +#include <linux/bitfield.h> > > > > > > int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk) > > > { > > > @@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) > > > return 0; > > > } > > > > > > +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bits*/ > > > +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ > > > +#define RSS_L4 GENMASK(1, 0) > > > +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ > > > + > > > +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numerical */ > > > +enum mlx5_rss_hash_type { > > > + RSS_TYPE_NO_HASH = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > > > + RSS_TYPE_L3_IPV4 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > > > + RSS_TYPE_L4_IPV4_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), > > > + RSS_TYPE_L4_IPV4_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), > > > + RSS_TYPE_L4_IPV4_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), > > > + RSS_TYPE_L3_IPV6 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), > > > + RSS_TYPE_L4_IPV6_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), > > > + RSS_TYPE_L4_IPV6_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), > > > + RSS_TYPE_L4_IPV6_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | > > > + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), > > > +} mlx5_rss_hash_type; > > > > Hi Jesper, > > > > Sparse seems confused about 'mlx5_rss_hash_type' on the line above. > > And I am too. Perhaps it can be removed? > > > > Yes, it can be removed (in V8). > > The reason/trick for doing this was to get compiler to create the enum > symbol, which allowed me to inspect the type using pahole (see cmd > below). (This will also expose this to BTF, but it isn't actually > useful to keep around for BTF, so I will remove it in V8.) Thanks Jesper, I didn't know that trick :) > $ pahole -C mlx5_rss_hash_type > drivers/net/ethernet/mellanox/mlx5/core/en/xdp.o > enum mlx5_rss_hash_type { > RSS_TYPE_NO_HASH = 0, > RSS_TYPE_L3_IPV4 = 4, > RSS_TYPE_L4_IPV4_TCP = 5, > RSS_TYPE_L4_IPV4_UDP = 6, > RSS_TYPE_L4_IPV4_IPSEC = 7, > RSS_TYPE_L3_IPV6 = 8, > RSS_TYPE_L4_IPV6_TCP = 9, > RSS_TYPE_L4_IPV6_UDP = 10, > RSS_TYPE_L4_IPV6_IPSEC = 11, > }; > > This is practical to for reviewers to see if below code is correct: > > > +/* Invalid combinations will simply return zero, allows no boundary > checks */ > > +static const enum xdp_rss_hash_type > mlx5_xdp_rss_type[RSS_TYPE_MAX_TABLE] = { > > + [RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_NONE, > > + [1] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [2] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [3] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [RSS_TYPE_L3_IPV4] = XDP_RSS_TYPE_L3_IPV4, > > + [RSS_TYPE_L4_IPV4_TCP] = XDP_RSS_TYPE_L4_IPV4_TCP, > > + [RSS_TYPE_L4_IPV4_UDP] = XDP_RSS_TYPE_L4_IPV4_UDP, > > + [RSS_TYPE_L4_IPV4_IPSEC] = XDP_RSS_TYPE_L4_IPV4_IPSEC, > > + [RSS_TYPE_L3_IPV6] = XDP_RSS_TYPE_L3_IPV6, > > + [RSS_TYPE_L4_IPV6_TCP] = XDP_RSS_TYPE_L4_IPV6_TCP, > > + [RSS_TYPE_L4_IPV6_UDP] = XDP_RSS_TYPE_L4_IPV6_UDP, > > + [RSS_TYPE_L4_IPV6_IPSEC] = XDP_RSS_TYPE_L4_IPV6_IPSEC, > > + [12] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [13] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [14] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > + [15] = XDP_RSS_TYPE_NONE, /* Implicit zero */ > > +}; > > > drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c:198:3: warning: symbol 'mlx5_rss_hash_type' was not declared. Should it be static? > > > > ... > > >
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c index efe609f8e3aa..97ef1df94d50 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c @@ -34,6 +34,7 @@ #include <net/xdp_sock_drv.h> #include "en/xdp.h" #include "en/params.h" +#include <linux/bitfield.h> int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk) { @@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) return 0; } +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bits*/ +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ +#define RSS_L4 GENMASK(1, 0) +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ + +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numerical */ +enum mlx5_rss_hash_type { + RSS_TYPE_NO_HASH = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L3_IPV4 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L4_IPV4_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), + RSS_TYPE_L4_IPV4_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), + RSS_TYPE_L4_IPV4_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), + RSS_TYPE_L3_IPV6 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L4_IPV6_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), + RSS_TYPE_L4_IPV6_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), + RSS_TYPE_L4_IPV6_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), +} mlx5_rss_hash_type; + +/* Invalid combinations will simply return zero, allows no boundary checks */ +static const enum xdp_rss_hash_type mlx5_xdp_rss_type[RSS_TYPE_MAX_TABLE] = { + [RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_NONE, + [1] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [2] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [3] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [RSS_TYPE_L3_IPV4] = XDP_RSS_TYPE_L3_IPV4, + [RSS_TYPE_L4_IPV4_TCP] = XDP_RSS_TYPE_L4_IPV4_TCP, + [RSS_TYPE_L4_IPV4_UDP] = XDP_RSS_TYPE_L4_IPV4_UDP, + [RSS_TYPE_L4_IPV4_IPSEC] = XDP_RSS_TYPE_L4_IPV4_IPSEC, + [RSS_TYPE_L3_IPV6] = XDP_RSS_TYPE_L3_IPV6, + [RSS_TYPE_L4_IPV6_TCP] = XDP_RSS_TYPE_L4_IPV6_TCP, + [RSS_TYPE_L4_IPV6_UDP] = XDP_RSS_TYPE_L4_IPV6_UDP, + [RSS_TYPE_L4_IPV6_IPSEC] = XDP_RSS_TYPE_L4_IPV6_IPSEC, + [12] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [13] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [14] = XDP_RSS_TYPE_NONE, /* Implicit zero */ + [15] = XDP_RSS_TYPE_NONE, /* Implicit zero */ +}; + static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, enum xdp_rss_hash_type *rss_type) { const struct mlx5e_xdp_buff *_ctx = (void *)ctx; + const struct mlx5_cqe64 *cqe = _ctx->cqe; + u32 hash_type, l4_type, ip_type, lookup; if (unlikely(!(_ctx->xdp.rxq->dev->features & NETIF_F_RXHASH))) return -ENODATA; - *hash = be32_to_cpu(_ctx->cqe->rss_hash_result); + *hash = be32_to_cpu(cqe->rss_hash_result); + + hash_type = cqe->rss_hash_type; + BUILD_BUG_ON(CQE_RSS_HTYPE_IP != RSS_L3); /* same mask */ + ip_type = hash_type & CQE_RSS_HTYPE_IP; + l4_type = FIELD_GET(CQE_RSS_HTYPE_L4, hash_type); + lookup = ip_type | l4_type; + *rss_type = mlx5_xdp_rss_type[lookup]; + return 0; } diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h index 71b06ebad402..1db19a9d26e3 100644 --- a/include/linux/mlx5/device.h +++ b/include/linux/mlx5/device.h @@ -36,6 +36,7 @@ #include <linux/types.h> #include <rdma/ib_verbs.h> #include <linux/mlx5/mlx5_ifc.h> +#include <linux/bitfield.h> #if defined(__LITTLE_ENDIAN) #define MLX5_SET_HOST_ENDIANNESS 0 @@ -980,14 +981,23 @@ enum { }; enum { - CQE_RSS_HTYPE_IP = 0x3 << 2, + CQE_RSS_HTYPE_IP = GENMASK(3, 2), /* cqe->rss_hash_type[3:2] - IP destination selected for hash * (00 = none, 01 = IPv4, 10 = IPv6, 11 = Reserved) */ - CQE_RSS_HTYPE_L4 = 0x3 << 6, + CQE_RSS_IP_NONE = 0x0, + CQE_RSS_IPV4 = 0x1, + CQE_RSS_IPV6 = 0x2, + CQE_RSS_RESERVED = 0x3, + + CQE_RSS_HTYPE_L4 = GENMASK(7, 6), /* cqe->rss_hash_type[7:6] - L4 destination selected for hash * (00 = none, 01 = TCP. 10 = UDP, 11 = IPSEC.SPI */ + CQE_RSS_L4_NONE = 0x0, + CQE_RSS_L4_TCP = 0x1, + CQE_RSS_L4_UDP = 0x2, + CQE_RSS_L4_IPSEC = 0x3, }; enum { diff --git a/include/net/xdp.h b/include/net/xdp.h index a76c4ea203ea..76aa748e7923 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -460,10 +460,12 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV4_TCP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_TCP, XDP_RSS_TYPE_L4_IPV4_UDP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_UDP, XDP_RSS_TYPE_L4_IPV4_SCTP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_SCTP, + XDP_RSS_TYPE_L4_IPV4_IPSEC = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC, XDP_RSS_TYPE_L4_IPV6_TCP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_TCP, XDP_RSS_TYPE_L4_IPV6_UDP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_UDP, XDP_RSS_TYPE_L4_IPV6_SCTP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_SCTP, + XDP_RSS_TYPE_L4_IPV6_IPSEC = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC, XDP_RSS_TYPE_L4_IPV6_TCP_EX = XDP_RSS_TYPE_L4_IPV6_TCP | XDP_RSS_L3_DYNHDR, XDP_RSS_TYPE_L4_IPV6_UDP_EX = XDP_RSS_TYPE_L4_IPV6_UDP | XDP_RSS_L3_DYNHDR,