Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp2740248imj; Mon, 18 Feb 2019 11:16:22 -0800 (PST) X-Google-Smtp-Source: AHgI3IbIkHrO+ydlEdncNeR5Lk8/A8Xo8XH631K7XVOTN279PFYRlxChhefZHY5InCGF2CYI/J1y X-Received: by 2002:a62:b2c3:: with SMTP id z64mr25607352pfl.149.1550517381968; Mon, 18 Feb 2019 11:16:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550517381; cv=none; d=google.com; s=arc-20160816; b=LGoR0VIHULGc/AxSuzocYE9n0cVKBCzDWxvgRa0Oaq6CnLhbjcVSvDztzU+4KTdCjf yTUgxeqNy198IQ1puLqqNTAAtnlvCY/epckvF+gWilTTbuSfQChx1dmiy93N4DHWA8aj YOe3CLcuNc9TNHW3950adxDRV28y+q//goluw76aVAK7Gqw+ZEpSc+rVsAvVMSZ60Ufk 1pw5CGERsZnmnkoOUM4CCbztKl3VS5M7OrtLFmu8oY/2bqJ/fUZcaR75PstONqRKVnXf FMcM4PIvtFMEZsFPpjytlD3ICyYooXzUaggSpZOOjHZ9FsmxR9bA3zXNNlTCT+aZ/3Oz mDgQ== 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=4CZWk0WwmHsrJaOy8G/TWHZGlTogqSu9sgCu3000u0k=; b=iRbX4xSFpNUQJe8ZRdjsvXpbWe67lZuO8G1Q9T2tEnpE14Oj81QWQnvsqgzYg8ZOEW 2G7DIWr27X8tqZ9u20gaRDY90qwqZaeTv4IrnXszl8wwGYgezceJ8V110iusfHLsAgXl O8gsK2xyzReZ0SVvqqOS4dvIBUQy4Ny8bh/1+ZfbnMuytBLxmx3ztlAw6Fd+wb7wCuTW JwpJv22TVWVqhVRwrlQLQpJ45K2m4w52LrZPKEj/Q22B5f1Wbe8VpfosQ/Ii/taH+FqG oGJBze3tc5coBCe5YeCMop3RoF3uHpzZvff6x6DMQuysdmy5e9vnv2E0NuubvTqzm0aw wn2A== 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 f10si6752870pfh.8.2019.02.18.11.16.06; Mon, 18 Feb 2019 11:16:21 -0800 (PST) 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 S2403891AbfBRSWC (ORCPT + 99 others); Mon, 18 Feb 2019 13:22:02 -0500 Received: from mx2.suse.de ([195.135.220.15]:46186 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2392252AbfBRSV5 (ORCPT ); Mon, 18 Feb 2019 13:21:57 -0500 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 05D64AEA9; Mon, 18 Feb 2019 18:21:55 +0000 (UTC) Received: by unicorn.suse.cz (Postfix, from userid 1000) id AA30DE0122; Mon, 18 Feb 2019 19:21:54 +0100 (CET) Message-Id: <071564abb6d3b3d4c4bfd8bfe2364800b9357301.1550513384.git.mkubecek@suse.cz> In-Reply-To: References: From: Michal Kubecek Subject: [RFC PATCH net-next v3 06/21] ethtool: support for netlink notifications To: netdev@vger.kernel.org Cc: David Miller , Andrew Lunn , Jakub Kicinski , Jiri Pirko , linux-kernel@vger.kernel.org Date: Mon, 18 Feb 2019 19:21:54 +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 | 32 ++++++++++++++++++++++++++++ net/ethtool/netlink.h | 2 ++ 5 files changed, 53 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 aab4d9f6613d..9a50a67f328f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4340,6 +4340,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 7f3d401977b4..b662d75a0636 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -59,4 +59,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 ffdcc7c9d4bc..a5fa54c2b743 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -4,6 +4,8 @@ #include #include "netlink.h" +u32 ethnl_bcast_seq; + static const struct nla_policy dev_policy[ETHA_DEV_MAX + 1] = { [ETHA_DEV_UNSPEC] = { .type = NLA_REJECT }, [ETHA_DEV_INDEX] = { .type = NLA_U32 }, @@ -122,11 +124,39 @@ 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) +{ + 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, @@ -135,6 +165,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 */ diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index ba638eb5a99a..78385baeaec0 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.20.1