ethtool: make ethtool_ops::cap_rss_ctx_supported optional
authorJakub Kicinski <kuba@kernel.org>
Sat, 10 Aug 2024 05:37:20 +0000 (22:37 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 12 Aug 2024 13:16:24 +0000 (14:16 +0100)
cap_rss_ctx_supported was created because the API for creating
and configuring additional contexts is mux'ed with the normal
RSS API. Presence of ops does not imply driver can actually
support rss_context != 0 (in fact drivers mostly ignore that
field). cap_rss_ctx_supported lets core check that the driver
is context-aware before calling it.

Now that we have .create_rxfh_context, there is no such
ambiguity. We can depend on presence of the op.
Make setting the bit optional.

Reviewed-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Edward Cree <ecree.xilinx@gmail.com>
Reviewed-by: Joe Damato <jdamato@fastly.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/ethtool.h
net/ethtool/ioctl.c
net/ethtool/rss.c

index 989c94eddb2b4ffd45c32aa0b440a6a2016f84b2..a149485904d8fad92364f88eab62fb9a84827b46 100644 (file)
@@ -727,7 +727,8 @@ struct kernel_ethtool_ts_info {
  * @cap_link_lanes_supported: indicates if the driver supports lanes
  *     parameter.
  * @cap_rss_ctx_supported: indicates if the driver supports RSS
- *     contexts.
+ *     contexts via legacy API, drivers implementing @create_rxfh_context
+ *     do not have to set this bit.
  * @cap_rss_sym_xor_supported: indicates if the driver supports symmetric-xor
  *     RSS.
  * @rxfh_indir_space: max size of RSS indirection tables, if indirection table
index ba8630eb02efe214525b4a4de37704257bb62aa8..1698b73812ceeb324a8969d03ace587db4bd955b 100644 (file)
@@ -1227,7 +1227,8 @@ static noinline_for_stack int ethtool_get_rxfh(struct net_device *dev,
        if (rxfh.rsvd8[0] || rxfh.rsvd8[1] || rxfh.rsvd32)
                return -EINVAL;
        /* Most drivers don't handle rss_context, check it's 0 as well */
-       if (rxfh.rss_context && !ops->cap_rss_ctx_supported)
+       if (rxfh.rss_context && !(ops->cap_rss_ctx_supported ||
+                                 ops->create_rxfh_context))
                return -EOPNOTSUPP;
 
        rxfh.indir_size = rxfh_dev.indir_size;
@@ -1357,7 +1358,8 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
        if (rxfh.rsvd8[0] || rxfh.rsvd8[1] || rxfh.rsvd32)
                return -EINVAL;
        /* Most drivers don't handle rss_context, check it's 0 as well */
-       if (rxfh.rss_context && !ops->cap_rss_ctx_supported)
+       if (rxfh.rss_context && !(ops->cap_rss_ctx_supported ||
+                                 ops->create_rxfh_context))
                return -EOPNOTSUPP;
        /* Check input data transformation capabilities */
        if (rxfh.input_xfrm && rxfh.input_xfrm != RXH_XFRM_SYM_XOR &&
index 5c4c4505ab9a4a4497e6cfd669e3506c95511c81..a06bdac8b8a2a2659f75f0b74d5c82f6102e3bbb 100644 (file)
@@ -60,7 +60,8 @@ rss_prepare_data(const struct ethnl_req_info *req_base,
                return -EOPNOTSUPP;
 
        /* Some drivers don't handle rss_context */
-       if (request->rss_context && !ops->cap_rss_ctx_supported)
+       if (request->rss_context && !(ops->cap_rss_ctx_supported ||
+                                     ops->create_rxfh_context))
                return -EOPNOTSUPP;
 
        ret = ethnl_ops_begin(dev);