Message ID | 168174344307.593471.11961012266841546530.stgit@firesoul (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | XDP-hints: XDP kfunc metadata for driver igc | expand |
On Monday, April 17, 2023 10:57 PM, Jesper Dangaard Brouer <brouer@redhat.com> wrote: >This implements XDP hints kfunc for RX-hash (xmo_rx_hash). >The HW rss hash type is handled via mapping table. > >This igc driver driver (default config) does L3 hashing for UDP packets (excludes Repeated word: driver >UDP src/dest ports in hash calc). Meaning RSS hash type is >L3 based. Tested that the igc_rss_type_num for UDP is either >IGC_RSS_TYPE_HASH_IPV4 or IGC_RSS_TYPE_HASH_IPV6. > >Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> >--- > drivers/net/ethernet/intel/igc/igc_main.c | 35 >+++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > >diff --git a/drivers/net/ethernet/intel/igc/igc_main.c >b/drivers/net/ethernet/intel/igc/igc_main.c >index 862768d5d134..27f448d0ae94 100644 >--- a/drivers/net/ethernet/intel/igc/igc_main.c >+++ b/drivers/net/ethernet/intel/igc/igc_main.c >@@ -6507,8 +6507,43 @@ static int igc_xdp_rx_timestamp(const struct xdp_md >*_ctx, u64 *timestamp) > return -ENODATA; > } > >+/* Mapping HW RSS Type to enum xdp_rss_hash_type */ enum >+xdp_rss_hash_type igc_xdp_rss_type[IGC_RSS_TYPE_MAX_TABLE] = { Since igc_xdp_rss_type is used in igc_main.c only, suggest to make it static. Thanks & Regards Siang >+ [IGC_RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_L2, >+ [IGC_RSS_TYPE_HASH_TCP_IPV4] = XDP_RSS_TYPE_L4_IPV4_TCP, >+ [IGC_RSS_TYPE_HASH_IPV4] = XDP_RSS_TYPE_L3_IPV4, >+ [IGC_RSS_TYPE_HASH_TCP_IPV6] = XDP_RSS_TYPE_L4_IPV6_TCP, >+ [IGC_RSS_TYPE_HASH_IPV6_EX] = XDP_RSS_TYPE_L3_IPV6_EX, >+ [IGC_RSS_TYPE_HASH_IPV6] = XDP_RSS_TYPE_L3_IPV6, >+ [IGC_RSS_TYPE_HASH_TCP_IPV6_EX] = XDP_RSS_TYPE_L4_IPV6_TCP_EX, >+ [IGC_RSS_TYPE_HASH_UDP_IPV4] = XDP_RSS_TYPE_L4_IPV4_UDP, >+ [IGC_RSS_TYPE_HASH_UDP_IPV6] = XDP_RSS_TYPE_L4_IPV6_UDP, >+ [IGC_RSS_TYPE_HASH_UDP_IPV6_EX] = XDP_RSS_TYPE_L4_IPV6_UDP_EX, >+ [10] = XDP_RSS_TYPE_NONE, /* RSS Type above 9 "Reserved" by HW */ >+ [11] = XDP_RSS_TYPE_NONE, /* keep array sized for SW bit-mask */ >+ [12] = XDP_RSS_TYPE_NONE, /* to handle future HW revisons */ >+ [13] = XDP_RSS_TYPE_NONE, >+ [14] = XDP_RSS_TYPE_NONE, >+ [15] = XDP_RSS_TYPE_NONE, >+}; >+ >+static int igc_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash, >+ enum xdp_rss_hash_type *rss_type) { >+ const struct igc_xdp_buff *ctx = (void *)_ctx; >+ >+ if (!(ctx->xdp.rxq->dev->features & NETIF_F_RXHASH)) >+ return -ENODATA; >+ >+ *hash = le32_to_cpu(ctx->rx_desc->wb.lower.hi_dword.rss); >+ *rss_type = igc_xdp_rss_type[igc_rss_type(ctx->rx_desc)]; >+ >+ return 0; >+} >+ > const struct xdp_metadata_ops igc_xdp_metadata_ops = { > .xmo_rx_timestamp = igc_xdp_rx_timestamp, >+ .xmo_rx_hash = igc_xdp_rx_hash, > }; > > /** >
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 862768d5d134..27f448d0ae94 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -6507,8 +6507,43 @@ static int igc_xdp_rx_timestamp(const struct xdp_md *_ctx, u64 *timestamp) return -ENODATA; } +/* Mapping HW RSS Type to enum xdp_rss_hash_type */ +enum xdp_rss_hash_type igc_xdp_rss_type[IGC_RSS_TYPE_MAX_TABLE] = { + [IGC_RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_L2, + [IGC_RSS_TYPE_HASH_TCP_IPV4] = XDP_RSS_TYPE_L4_IPV4_TCP, + [IGC_RSS_TYPE_HASH_IPV4] = XDP_RSS_TYPE_L3_IPV4, + [IGC_RSS_TYPE_HASH_TCP_IPV6] = XDP_RSS_TYPE_L4_IPV6_TCP, + [IGC_RSS_TYPE_HASH_IPV6_EX] = XDP_RSS_TYPE_L3_IPV6_EX, + [IGC_RSS_TYPE_HASH_IPV6] = XDP_RSS_TYPE_L3_IPV6, + [IGC_RSS_TYPE_HASH_TCP_IPV6_EX] = XDP_RSS_TYPE_L4_IPV6_TCP_EX, + [IGC_RSS_TYPE_HASH_UDP_IPV4] = XDP_RSS_TYPE_L4_IPV4_UDP, + [IGC_RSS_TYPE_HASH_UDP_IPV6] = XDP_RSS_TYPE_L4_IPV6_UDP, + [IGC_RSS_TYPE_HASH_UDP_IPV6_EX] = XDP_RSS_TYPE_L4_IPV6_UDP_EX, + [10] = XDP_RSS_TYPE_NONE, /* RSS Type above 9 "Reserved" by HW */ + [11] = XDP_RSS_TYPE_NONE, /* keep array sized for SW bit-mask */ + [12] = XDP_RSS_TYPE_NONE, /* to handle future HW revisons */ + [13] = XDP_RSS_TYPE_NONE, + [14] = XDP_RSS_TYPE_NONE, + [15] = XDP_RSS_TYPE_NONE, +}; + +static int igc_xdp_rx_hash(const struct xdp_md *_ctx, u32 *hash, + enum xdp_rss_hash_type *rss_type) +{ + const struct igc_xdp_buff *ctx = (void *)_ctx; + + if (!(ctx->xdp.rxq->dev->features & NETIF_F_RXHASH)) + return -ENODATA; + + *hash = le32_to_cpu(ctx->rx_desc->wb.lower.hi_dword.rss); + *rss_type = igc_xdp_rss_type[igc_rss_type(ctx->rx_desc)]; + + return 0; +} + const struct xdp_metadata_ops igc_xdp_metadata_ops = { .xmo_rx_timestamp = igc_xdp_rx_timestamp, + .xmo_rx_hash = igc_xdp_rx_hash, }; /**
This implements XDP hints kfunc for RX-hash (xmo_rx_hash). The HW rss hash type is handled via mapping table. This igc driver driver (default config) does L3 hashing for UDP packets (excludes UDP src/dest ports in hash calc). Meaning RSS hash type is L3 based. Tested that the igc_rss_type_num for UDP is either IGC_RSS_TYPE_HASH_IPV4 or IGC_RSS_TYPE_HASH_IPV6. Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> --- drivers/net/ethernet/intel/igc/igc_main.c | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)