Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp3433496img; Mon, 25 Mar 2019 10:10:53 -0700 (PDT) X-Google-Smtp-Source: APXvYqyZNr+D8aMnqZfPK/QFNP/3vw0CEbHeheYEt6GoVVrKa/JrC51wKwyvWRKjmbyn73eO4Ob/ X-Received: by 2002:a17:902:ba98:: with SMTP id k24mr16709925pls.335.1553533853300; Mon, 25 Mar 2019 10:10:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553533853; cv=none; d=google.com; s=arc-20160816; b=g6H7cOkKLlPabuacNAaPLJv3qDso8f7KMjZ+SM12s1wb1TCFqhH5Qg+1NaX8osfBYR NBuZeLqOfQpxxkbO9bo6/EQSOPtLprzm0icQDTEUWtN52VXPB7J45yLhaPO0dqneR1HG vqM+XmG2M09r6XoK6KGqb98z/97XrC9bYv8bCILxKuKkoXt0APS22/1+XuZUKw/WvaMf cfKUX+1thTZ3X6jd0wmTOKu58Xb7KzmoG6UR5lKWWRpFhWw5yoNQezqMMXzMm4k0wlRV Xr8V2xL8OcVWqVZBKgvxmD/3P6kuoU2gx+h/wJmRMb7X7QALXLWSIpTvL+m0DN0+TSQF K5BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:cc:to:subject:from:references :in-reply-to:message-id; bh=b1y0Kvr9YListDB8ZjRUhN1HtZniSM+LzIVDGpeIb4Y=; b=Lz2g+kBWcWbQbDwBcZZzggyF6c9Uzg2Smzjixc29HBYxICYWpysG95TXcyzXCXrhLw rddg1B4wVpSO1xxMg1Twv2rBrsZudWkP/FwEKZ9+8U/VWvYpCOG5rjk0VRjmpmhyL4LO GZydCAzGzkRxZ23Xjy3Dr8WOkNACMpcqr0Jw3z0erI8+gy8gPhAt/6rfkUoebiYe3cNs NB56nhk5Iny+zOKmjB0WzZ/5d63l/Xl9W+oO8xsngExRf4QlgKT9Esi4yyKlyemF7oFQ /Sfy7tZb+Z2eDs1NWqGgcf6EcCKfEG939neAsYL8IrL9mJDPIMZRP1cawx7n8F9mWfr5 y4Zw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b61si12266108plb.22.2019.03.25.10.10.38; Mon, 25 Mar 2019 10:10:53 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730140AbfCYRIX (ORCPT + 99 others); Mon, 25 Mar 2019 13:08:23 -0400 Received: from mx2.suse.de ([195.135.220.15]:51046 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730112AbfCYRIV (ORCPT ); Mon, 25 Mar 2019 13:08:21 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 18200AF7B; Mon, 25 Mar 2019 17:08:19 +0000 (UTC) Received: by unicorn.suse.cz (Postfix, from userid 1000) id BAE28E1404; Mon, 25 Mar 2019 18:08:18 +0100 (CET) Message-Id: <3578e5f334acf11b84e75d0ee41c072340a7b085.1553532199.git.mkubecek@suse.cz> In-Reply-To: References: From: Michal Kubecek Subject: [PATCH net-next v5 08/22] ethtool: support for netlink notifications To: David Miller , netdev@vger.kernel.org Cc: Jakub Kicinski , Jiri Pirko , Andrew Lunn , Florian Fainelli , John Linville , Stephen Hemminger , linux-kernel@vger.kernel.org Date: Mon, 25 Mar 2019 18:08:18 +0100 (CET) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add infrastructure for ethtool netlink notifications. There is only one multicast group "monitor" which is used to notify userspace about changes. Notifications are supposed to be broadcasted on every configuration change, whether it is done using the netlink interface or legacy ioctl one. To trigger an ethtool notification, both ethtool netlink and external code use ethtool_notify() helper. This helper requires RTNL to be held and may sleep. Signed-off-by: Michal Kubecek --- include/linux/ethtool_netlink.h | 5 ++++ include/linux/netdevice.h | 12 +++++++++ include/uapi/linux/ethtool_netlink.h | 2 ++ net/ethtool/netlink.c | 37 ++++++++++++++++++++++++++++ net/ethtool/netlink.h | 2 ++ 5 files changed, 58 insertions(+) diff --git a/include/linux/ethtool_netlink.h b/include/linux/ethtool_netlink.h index 0412adb4f42f..2a15e64a16f3 100644 --- a/include/linux/ethtool_netlink.h +++ b/include/linux/ethtool_netlink.h @@ -5,5 +5,10 @@ #include #include +#include + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR, +}; #endif /* _LINUX_ETHTOOL_NETLINK_H_ */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 166fdc0a78b4..bc761511edb4 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4353,6 +4353,18 @@ struct netdev_notifier_bonding_info { void netdev_bonding_info_change(struct net_device *dev, struct netdev_bonding_info *bonding_info); +#if IS_ENABLED(CONFIG_ETHTOOL_NETLINK) +void ethtool_notify(struct net_device *dev, struct netlink_ext_ack *extack, + unsigned int cmd, u32 req_mask, const void *data); +#else +static inline void ethtool_notify(struct net_device *dev, + struct netlink_ext_ack *extack, + unsigned int cmd, u32 req_mask, + const void *data) +{ +} +#endif + static inline struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features) { diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index de18e076ed69..91e4d117957b 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -65,4 +65,6 @@ enum { #define ETHTOOL_GENL_NAME "ethtool" #define ETHTOOL_GENL_VERSION 1 +#define ETHTOOL_MCGRP_MONITOR_NAME "monitor" + #endif /* _UAPI_LINUX_ETHTOOL_NETLINK_H_ */ diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index cc6829ba4331..4a31765165ea 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -4,6 +4,10 @@ #include #include "netlink.h" +u32 ethnl_bcast_seq; + +static bool ethnl_ok __read_mostly; + static const struct nla_policy dev_policy[ETHA_DEV_MAX + 1] = { [ETHA_DEV_UNSPEC] = { .type = NLA_REJECT }, [ETHA_DEV_INDEX] = { .type = NLA_U32 }, @@ -147,11 +151,41 @@ struct sk_buff *ethnl_reply_init(size_t payload, struct net_device *dev, u8 cmd, return NULL; } +/* notifications */ + +typedef void (*ethnl_notify_handler_t)(struct net_device *dev, + struct netlink_ext_ack *extack, + unsigned int cmd, u32 req_mask, + const void *data); + +ethnl_notify_handler_t ethnl_notify_handlers[] = { +}; + +void ethtool_notify(struct net_device *dev, struct netlink_ext_ack *extack, + unsigned int cmd, u32 req_mask, const void *data) +{ + if (unlikely(!ethnl_ok)) + return; + ASSERT_RTNL(); + + if (likely(cmd < ARRAY_SIZE(ethnl_notify_handlers) && + ethnl_notify_handlers[cmd])) + ethnl_notify_handlers[cmd](dev, extack, cmd, req_mask, data); + else + WARN_ONCE(1, "notification %u not implemented (dev=%s, req_mask=0x%x)\n", + cmd, netdev_name(dev), req_mask); +} +EXPORT_SYMBOL(ethtool_notify); + /* genetlink setup */ static const struct genl_ops ethtool_genl_ops[] = { }; +static const struct genl_multicast_group ethtool_nl_mcgrps[] = { + [ETHNL_MCGRP_MONITOR] = { .name = ETHTOOL_MCGRP_MONITOR_NAME }, +}; + struct genl_family ethtool_genl_family = { .hdrsize = 0, .name = ETHTOOL_GENL_NAME, @@ -160,6 +194,8 @@ struct genl_family ethtool_genl_family = { .parallel_ops = true, .ops = ethtool_genl_ops, .n_ops = ARRAY_SIZE(ethtool_genl_ops), + .mcgrps = ethtool_nl_mcgrps, + .n_mcgrps = ARRAY_SIZE(ethtool_nl_mcgrps), }; /* module setup */ @@ -171,6 +207,7 @@ static int __init ethnl_init(void) ret = genl_register_family(ðtool_genl_family); if (WARN(ret < 0, "ethtool: genetlink family registration failed")) return ret; + ethnl_ok = true; return 0; } diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index b8a6cd3dc3e3..5f2299548915 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -11,6 +11,8 @@ #define ETHNL_SET_ERRMSG(info, msg) \ do { if (info) GENL_SET_ERR_MSG(info, msg); } while (0) +extern u32 ethnl_bcast_seq; + extern struct genl_family ethtool_genl_family; struct net_device *ethnl_dev_get(struct genl_info *info, struct nlattr *nest); -- 2.21.0