[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <1555821c-0645-4b0f-8c4d-dc3cf2ab518b@intel.com>
Date: Wed, 27 Aug 2025 17:10:18 +0200
From: Alexander Lobakin <aleksander.lobakin@...el.com>
To: Jiawen Wu <jiawenwu@...stnetic.com>
CC: <netdev@...r.kernel.org>, Andrew Lunn <andrew+netdev@...n.ch>, "David S.
Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, "Jakub
Kicinski" <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, Simon Horman
<horms@...nel.org>, Mengyuan Lou <mengyuanlou@...-swift.com>
Subject: Re: [PATCH net-next 2/2] net: wangxun: add RSS reta and rxfh fields
support
From: Jiawen Wu <jiawenwu@...stnetic.com>
Date: Wed, 27 Aug 2025 14:46:34 +0800
> Add ethtool ops for Rx flow hashing, query and set RSS indirection table
> and hash key. And support to configure L4 header fields with
> TCP/UDP/SCTP for flow hasing.
>
> Signed-off-by: Jiawen Wu <jiawenwu@...stnetic.com>
> ---
> .../net/ethernet/wangxun/libwx/wx_ethtool.c | 152 ++++++++++++++++++
> .../net/ethernet/wangxun/libwx/wx_ethtool.h | 12 ++
> drivers/net/ethernet/wangxun/libwx/wx_type.h | 6 +
> .../net/ethernet/wangxun/ngbe/ngbe_ethtool.c | 6 +
> .../ethernet/wangxun/txgbe/txgbe_ethtool.c | 6 +
> 5 files changed, 182 insertions(+)
>
> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_ethtool.c b/drivers/net/ethernet/wangxun/libwx/wx_ethtool.c
> index 9572b9f28e59..a0a46b1b4f9e 100644
> --- a/drivers/net/ethernet/wangxun/libwx/wx_ethtool.c
> +++ b/drivers/net/ethernet/wangxun/libwx/wx_ethtool.c
> @@ -481,6 +481,158 @@ int wx_set_channels(struct net_device *dev,
> }
> EXPORT_SYMBOL(wx_set_channels);
>
> +u32 wx_rss_indir_size(struct net_device *netdev)
> +{
> + struct wx *wx = netdev_priv(netdev);
> +
> + return wx_rss_indir_tbl_entries(wx);
> +}
> +EXPORT_SYMBOL(wx_rss_indir_size);
> +
> +u32 wx_get_rxfh_key_size(struct net_device *netdev)
> +{
> + return WX_RSS_KEY_SIZE;
> +}
> +EXPORT_SYMBOL(wx_get_rxfh_key_size);
> +
> +static void wx_get_reta(struct wx *wx, u32 *indir)
> +{
> + int i, reta_size = wx_rss_indir_tbl_entries(wx);
Nit: you can embed iterator declarations inside the corresponding loop
declarations.
for (u32 i = 0; ...
> + u16 rss_m = wx->ring_feature[RING_F_RSS].mask;
> +
> + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags))
> + rss_m = wx->ring_feature[RING_F_RSS].indices - 1;
> +
> + for (i = 0; i < reta_size; i++)
> + indir[i] = wx->rss_indir_tbl[i] & rss_m;
> +}
[...]
> + reta_entries = wx_rss_indir_tbl_entries(wx);
> + /* Fill out the redirection table */
> + if (rxfh->indir) {
> + int max_queues = min_t(int, wx->num_rx_queues,
> + WX_RSS_INDIR_TBL_MAX);
I guess you can't have negative number of queues, why int?
> +
> + /*Allow at least 2 queues w/ SR-IOV.*/
> + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags) &&
> + max_queues < 2)
> + max_queues = 2;
> +
> + /* Verify user input. */
> + for (i = 0; i < reta_entries; i++)
> + if (rxfh->indir[i] >= max_queues)
> + return -EINVAL;
> +
> + for (i = 0; i < reta_entries; i++)
> + wx->rss_indir_tbl[i] = rxfh->indir[i];
> +
> + wx_store_reta(wx);
> + }
> +
> + /* Fill out the rss hash key */
> + if (rxfh->key) {
> + memcpy(wx->rss_key, rxfh->key, WX_RSS_KEY_SIZE);
> + wx_store_rsskey(wx);
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(wx_set_rxfh);
> +
> +static const struct wx_rss_flow_map rss_flow_table[] = {
> + { TCP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_TCP},
> + { TCP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_TCP},
> + { UDP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_UDP},
> + { UDP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_UDP},
> + { SCTP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_SCTP},
> + { SCTP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_SCTP},
If you start declarations with `{ ` (with a space), do the same at the
end of them:
`IPV4_TCP },`
Thanks,
Olek
Powered by blists - more mailing lists