Commit 46837be5 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

net: ethtool: rss: add notifications

In preparation for RSS_SET handling in ethnl introduce Netlink
notifications for RSS. Only cover modifications, not creation
and not removal of a context, because the latter may deserve
a different notification type. We should cross that bridge
when we add the support for context add / remove via Netlink.

Link: https://patch.msgid.link/20250623231720.3124717-7-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3073947d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2492,6 +2492,13 @@ operations:
        attributes:
          - header
          - events
    -
      name: rss-ntf
      doc: |
        Notification for change in RSS configuration.
        For additional contexts only modifications are modified, not creation
        or removal of the contexts.
      notify: rss-get

mcast-groups:
  list:
+1 −0
Original line number Diff line number Diff line
@@ -281,6 +281,7 @@ Kernel to userspace:
  ``ETHTOOL_MSG_MODULE_GET_REPLY``         transceiver module parameters
  ``ETHTOOL_MSG_PSE_GET_REPLY``            PSE parameters
  ``ETHTOOL_MSG_RSS_GET_REPLY``            RSS settings
  ``ETHTOOL_MSG_RSS_NTF``                  RSS settings
  ``ETHTOOL_MSG_PLCA_GET_CFG_REPLY``       PLCA RS parameters
  ``ETHTOOL_MSG_PLCA_GET_STATUS_REPLY``    PLCA RS status
  ``ETHTOOL_MSG_PLCA_NTF``                 PLCA RS parameters
+1 −0
Original line number Diff line number Diff line
@@ -862,6 +862,7 @@ enum {
	ETHTOOL_MSG_TSCONFIG_GET_REPLY,
	ETHTOOL_MSG_TSCONFIG_SET_REPLY,
	ETHTOOL_MSG_PSE_NTF,
	ETHTOOL_MSG_RSS_NTF,

	__ETHTOOL_MSG_KERNEL_CNT,
	ETHTOOL_MSG_KERNEL_MAX = (__ETHTOOL_MSG_KERNEL_CNT - 1)
+8 −0
Original line number Diff line number Diff line
@@ -74,4 +74,12 @@ int ethtool_get_module_eeprom_call(struct net_device *dev,

bool __ethtool_dev_mm_supported(struct net_device *dev);

#if IS_ENABLED(CONFIG_ETHTOOL_NETLINK)
void ethtool_rss_notify(struct net_device *dev, u32 rss_context);
#else
static inline void ethtool_rss_notify(struct net_device *dev, u32 rss_context)
{
}
#endif

#endif /* _ETHTOOL_COMMON_H */
+4 −0
Original line number Diff line number Diff line
@@ -1502,6 +1502,7 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
	struct ethtool_rxfh rxfh;
	bool locked = false; /* dev->ethtool->rss_lock taken */
	bool create = false;
	bool mod = false;
	u8 *rss_config;
	int ret;

@@ -1688,6 +1689,7 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
		}
		goto out;
	}
	mod = !create && !rxfh_dev.rss_delete;

	if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh, rss_context),
			 &rxfh_dev.rss_context, sizeof(rxfh_dev.rss_context)))
@@ -1757,6 +1759,8 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
	if (locked)
		mutex_unlock(&dev->ethtool->rss_lock);
	kfree(rss_config);
	if (mod)
		ethtool_rss_notify(dev, rxfh.rss_context);
	return ret;
}

Loading