Commit fac4b417 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

net: ethtool: require drivers to opt into the per-RSS ctx RXFH



RX Flow Hashing supports using different configuration for different
RSS contexts. Only two drivers seem to support it. Make sure we
uniformly error out for drivers which don't.

Reviewed-by: default avatarJoe Damato <joe@dama.to>
Link: https://patch.msgid.link/20250611145949.2674086-4-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 2a644c5c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2616,6 +2616,7 @@ static void mlx5e_get_ts_stats(struct net_device *netdev,
const struct ethtool_ops mlx5e_ethtool_ops = {
	.cap_link_lanes_supported = true,
	.cap_rss_ctx_supported	= true,
	.rxfh_per_ctx_fields	= true,
	.rxfh_per_ctx_key	= true,
	.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
				     ETHTOOL_COALESCE_MAX_FRAMES |
+1 −0
Original line number Diff line number Diff line
@@ -262,6 +262,7 @@ const struct ethtool_ops efx_ethtool_ops = {
	.set_rxnfc		= efx_ethtool_set_rxnfc,
	.get_rxfh_indir_size	= efx_ethtool_get_rxfh_indir_size,
	.get_rxfh_key_size	= efx_ethtool_get_rxfh_key_size,
	.rxfh_per_ctx_fields	= true,
	.rxfh_per_ctx_key	= true,
	.cap_rss_rxnfc_adds	= true,
	.rxfh_priv_size		= sizeof(struct efx_rss_context_priv),
+3 −0
Original line number Diff line number Diff line
@@ -855,6 +855,8 @@ struct kernel_ethtool_ts_info {
 * @cap_rss_ctx_supported: indicates if the driver supports RSS
 *	contexts via legacy API, drivers implementing @create_rxfh_context
 *	do not have to set this bit.
 * @rxfh_per_ctx_fields: device supports selecting different header fields
 *	for Rx hash calculation and RSS for each additional context.
 * @rxfh_per_ctx_key: device supports setting different RSS key for each
 *	additional context. Netlink API should report hfunc, key, and input_xfrm
 *	for every context, not just context 0.
@@ -1084,6 +1086,7 @@ struct ethtool_ops {
	u32     supported_input_xfrm:8;
	u32     cap_link_lanes_supported:1;
	u32     cap_rss_ctx_supported:1;
	u32	rxfh_per_ctx_fields:1;
	u32	rxfh_per_ctx_key:1;
	u32	cap_rss_rxnfc_adds:1;
	u32	rxfh_indir_space;
+8 −0
Original line number Diff line number Diff line
@@ -1075,6 +1075,10 @@ ethtool_set_rxfh_fields(struct net_device *dev, u32 cmd, void __user *useraddr)
	if (rc)
		return rc;

	if (info.flow_type & FLOW_RSS && info.rss_context &&
	    !ops->rxfh_per_ctx_fields)
		return -EINVAL;

	if (ops->get_rxfh) {
		struct ethtool_rxfh_param rxfh = {};

@@ -1105,6 +1109,10 @@ ethtool_get_rxfh_fields(struct net_device *dev, u32 cmd, void __user *useraddr)
	if (ret)
		return ret;

	if (info.flow_type & FLOW_RSS && info.rss_context &&
	    !ops->rxfh_per_ctx_fields)
		return -EINVAL;

	ret = ops->get_rxnfc(dev, &info, NULL);
	if (ret < 0)
		return ret;