diff options
| -rw-r--r-- | Documentation/netlink/specs/ethtool.yaml | 7 | ||||
| -rw-r--r-- | Documentation/networking/ethtool-netlink.rst | 1 | ||||
| -rw-r--r-- | include/uapi/linux/ethtool_netlink_generated.h | 1 | ||||
| -rw-r--r-- | net/ethtool/common.h | 8 | ||||
| -rw-r--r-- | net/ethtool/ioctl.c | 4 | ||||
| -rw-r--r-- | net/ethtool/netlink.c | 2 | ||||
| -rw-r--r-- | net/ethtool/rss.c | 11 | 
7 files changed, 34 insertions, 0 deletions
diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml index cfe84f84ba29..19a32229772a 100644 --- a/Documentation/netlink/specs/ethtool.yaml +++ b/Documentation/netlink/specs/ethtool.yaml @@ -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: diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst index e45bb555e909..08abca99a6dc 100644 --- a/Documentation/networking/ethtool-netlink.rst +++ b/Documentation/networking/ethtool-netlink.rst @@ -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 diff --git a/include/uapi/linux/ethtool_netlink_generated.h b/include/uapi/linux/ethtool_netlink_generated.h index 859e28c8a91a..8f30ffa1cd14 100644 --- a/include/uapi/linux/ethtool_netlink_generated.h +++ b/include/uapi/linux/ethtool_netlink_generated.h @@ -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) diff --git a/net/ethtool/common.h b/net/ethtool/common.h index b4683d286a5a..c41db1595621 100644 --- a/net/ethtool/common.h +++ b/net/ethtool/common.h @@ -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 */ diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index 96da9d18789b..c34bac7bffd8 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -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 @@ out:  	if (locked)  		mutex_unlock(&dev->ethtool->rss_lock);  	kfree(rss_config); +	if (mod) +		ethtool_rss_notify(dev, rxfh.rss_context);  	return ret;  } diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index 60b3c07507d2..09c81cc9a08f 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -946,6 +946,7 @@ ethnl_default_notify_ops[ETHTOOL_MSG_KERNEL_MAX + 1] = {  	[ETHTOOL_MSG_MODULE_NTF]	= ðnl_module_request_ops,  	[ETHTOOL_MSG_PLCA_NTF]		= ðnl_plca_cfg_request_ops,  	[ETHTOOL_MSG_MM_NTF]		= ðnl_mm_request_ops, +	[ETHTOOL_MSG_RSS_NTF]		= ðnl_rss_request_ops,  };  /* default notification handler */ @@ -1052,6 +1053,7 @@ static const ethnl_notify_handler_t ethnl_notify_handlers[] = {  	[ETHTOOL_MSG_MODULE_NTF]	= ethnl_default_notify,  	[ETHTOOL_MSG_PLCA_NTF]		= ethnl_default_notify,  	[ETHTOOL_MSG_MM_NTF]		= ethnl_default_notify, +	[ETHTOOL_MSG_RSS_NTF]		= ethnl_default_notify,  };  void ethnl_notify(struct net_device *dev, unsigned int cmd, diff --git a/net/ethtool/rss.c b/net/ethtool/rss.c index 6d9b1769896b..3adddca7e215 100644 --- a/net/ethtool/rss.c +++ b/net/ethtool/rss.c @@ -358,6 +358,17 @@ int ethnl_rss_dumpit(struct sk_buff *skb, struct netlink_callback *cb)  	return ret;  } +/* RSS_NTF */ + +void ethtool_rss_notify(struct net_device *dev, u32 rss_context) +{ +	struct rss_req_info req_info = { +		.rss_context = rss_context, +	}; + +	ethnl_notify(dev, ETHTOOL_MSG_RSS_NTF, &req_info.base); +} +  const struct ethnl_request_ops ethnl_rss_request_ops = {  	.request_cmd		= ETHTOOL_MSG_RSS_GET,  	.reply_cmd		= ETHTOOL_MSG_RSS_GET_REPLY,  | 
