Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: ethtool: only allow set_rxnfc with rss + ring_cookie if driver opts in

Ethtool ntuple filters with FLOW_RSS were originally defined as adding
the base queue ID (ring_cookie) to the value from the indirection table,
so that the same table could distribute over more than one set of queues
when used by different filters.
However, some drivers / hardware ignore the ring_cookie, and simply use
the indirection table entries as queue IDs directly. Thus, for drivers
which have not opted in by setting ethtool_ops.cap_rss_rxnfc_adds to
declare that they support the original (addition) semantics, reject in
ethtool_set_rxnfc any filter which combines FLOW_RSS and a nonzero ring.
(For a ring_cookie of zero, both behaviours are equivalent.)
Set the cap bit in sfc, as it is known to support this feature.

Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Reviewed-by: Martin Habets <habetsm.xilinx@gmail.com>
Link: https://patch.msgid.link/cc3da0844083b0e301a33092a6299e4042b65221.1731499022.git.ecree.xilinx@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Edward Cree and committed by
Jakub Kicinski
9e43ad7a b52a8dee

+11
+1
drivers/net/ethernet/sfc/ef100_ethtool.c
··· 59 59 .get_rxfh_indir_size = efx_ethtool_get_rxfh_indir_size, 60 60 .get_rxfh_key_size = efx_ethtool_get_rxfh_key_size, 61 61 .rxfh_per_ctx_key = true, 62 + .cap_rss_rxnfc_adds = true, 62 63 .rxfh_priv_size = sizeof(struct efx_rss_context_priv), 63 64 .get_rxfh = efx_ethtool_get_rxfh, 64 65 .set_rxfh = efx_ethtool_set_rxfh,
+1
drivers/net/ethernet/sfc/ethtool.c
··· 263 263 .get_rxfh_indir_size = efx_ethtool_get_rxfh_indir_size, 264 264 .get_rxfh_key_size = efx_ethtool_get_rxfh_key_size, 265 265 .rxfh_per_ctx_key = true, 266 + .cap_rss_rxnfc_adds = true, 266 267 .rxfh_priv_size = sizeof(struct efx_rss_context_priv), 267 268 .get_rxfh = efx_ethtool_get_rxfh, 268 269 .set_rxfh = efx_ethtool_set_rxfh,
+4
include/linux/ethtool.h
··· 734 734 * @rxfh_per_ctx_key: device supports setting different RSS key for each 735 735 * additional context. Netlink API should report hfunc, key, and input_xfrm 736 736 * for every context, not just context 0. 737 + * @cap_rss_rxnfc_adds: device supports nonzero ring_cookie in filters with 738 + * %FLOW_RSS flag; the queue ID from the filter is added to the value from 739 + * the indirection table to determine the delivery queue. 737 740 * @rxfh_indir_space: max size of RSS indirection tables, if indirection table 738 741 * size as returned by @get_rxfh_indir_size may change during lifetime 739 742 * of the device. Leave as 0 if the table size is constant. ··· 959 956 u32 cap_rss_ctx_supported:1; 960 957 u32 cap_rss_sym_xor_supported:1; 961 958 u32 rxfh_per_ctx_key:1; 959 + u32 cap_rss_rxnfc_adds:1; 962 960 u32 rxfh_indir_space; 963 961 u16 rxfh_key_space; 964 962 u16 rxfh_priv_size;
+5
net/ethtool/ioctl.c
··· 992 992 if (rc) 993 993 return rc; 994 994 995 + /* Nonzero ring with RSS only makes sense if NIC adds them together */ 996 + if (info.flow_type & FLOW_RSS && !ops->cap_rss_rxnfc_adds && 997 + ethtool_get_flow_spec_ring(info.fs.ring_cookie)) 998 + return -EINVAL; 999 + 995 1000 if (ops->get_rxfh) { 996 1001 struct ethtool_rxfh_param rxfh = {}; 997 1002