Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp970266ybh; Wed, 11 Mar 2020 14:41:43 -0700 (PDT) X-Google-Smtp-Source: ADFU+vt6Itx/lXWX3BS6OTIToPtFbmqQDBEtZ5HEhxBloSAQKd7csQH4UkzdsN/z7ZsftFDEoZi1 X-Received: by 2002:aca:d553:: with SMTP id m80mr535239oig.30.1583962902957; Wed, 11 Mar 2020 14:41:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583962902; cv=none; d=google.com; s=arc-20160816; b=GGxct9YTqpX0fZrIyGGcSA2efcBCs4U5TEP4NJg2vjH7nQMmzptzDgLgp1B5Dx2dyr N2dSlDn5mDIR6Afzuza+xGS9y+O4GTsxlC3dfOXXWnjHtBtWGCqSCztEBVY+5Eb6nEcf x1v/A7iT/06iTWrPMLV+kHsFl7bJA13G0K9NCwvvP7kMubVPaZ5MjpVMVynJ3dbQdu1j Vb5CDTcLF6VSRcqucXDNB6gJExIuoK0IczFdsWk2/JgrQhmSrhRKJPaxPfSFvA7NHbfk EGathYqtCbTHiEIVsc6NC1/yrj/Fsr24BLi8gjVwwwrhLAD/R/t4ar1YZSkJkURgbOSw RM4Q== 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=oBJYtoZQsIewNY2h6u6aNKaq8wKNMI+x6D8OPszsyv4=; b=DfqplF/C8qg989ChAo8eB5f6fPbOvT7mADMNAFwAUJ7Ex6SaeR/JzjRL0M4roi89/f d77VDFkv7DLUNR36S1JqSKpUhZkQLvw9fvo1Eieu5ozOSyZb8a6trjt4GUbJKLJsiMDn DlJid20Xa05kKZCxr9N8Mw+7UP3cZx68KSiVDzZEsdQx5OAlQuvsqXUJN6OBHcJ/+eN+ 4u7+PeZ+RT4Xw7040hdXd8IfMdNyHoYQWpaQkwqJpIByn9PYLqxfokRc0IJWbht6feFA Bz06Yvtl8fpRCHJLfMGe2xl1SNMWnsZfITtU+JZqJETpSM9c7xRWoLEieBV1mYjnhrK+ Pfyw== 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 c6si1756763otk.233.2020.03.11.14.41.31; Wed, 11 Mar 2020 14:41:42 -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 S2387562AbgCKVkk (ORCPT + 99 others); Wed, 11 Mar 2020 17:40:40 -0400 Received: from mx2.suse.de ([195.135.220.15]:46622 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387531AbgCKVkg (ORCPT ); Wed, 11 Mar 2020 17:40:36 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A8D50AE41; Wed, 11 Mar 2020 21:40:33 +0000 (UTC) Received: by unicorn.suse.cz (Postfix, from userid 1000) id 577CAE0C0A; Wed, 11 Mar 2020 22:40:33 +0100 (CET) Message-Id: <34fbf1c52e23440328f5ca53e7ad8bef9bc991b7.1583962006.git.mkubecek@suse.cz> In-Reply-To: References: From: Michal Kubecek Subject: [PATCH net-next 06/15] ethtool: add FEATURES_NTF notification To: David Miller , netdev@vger.kernel.org Cc: Jakub Kicinski , Jiri Pirko , Andrew Lunn , Florian Fainelli , John Linville , Johannes Berg , linux-kernel@vger.kernel.org Date: Wed, 11 Mar 2020 22:40:33 +0100 (CET) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Send ETHTOOL_MSG_FEATURES_NTF notification whenever network device features are modified using ETHTOOL_MSG_FEATURES_SET netlink message, ethtool ioctl request or any other way resulting in call to netdev_update_features() or netdev_change_features() Signed-off-by: Michal Kubecek --- Documentation/networking/ethtool-netlink.rst | 6 ++++ include/uapi/linux/ethtool_netlink.h | 1 + net/ethtool/features.c | 4 +++ net/ethtool/netlink.c | 29 +++++++++++++++++++- 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Documentation/networking/ethtool-netlink.rst b/Documentation/networking/ethtool-netlink.rst index d6706c4aa972..47542f042e9d 100644 --- a/Documentation/networking/ethtool-netlink.rst +++ b/Documentation/networking/ethtool-netlink.rst @@ -208,6 +208,7 @@ Kernel to userspace: ``ETHTOOL_MSG_WOL_NTF`` wake-on-lan settings notification ``ETHTOOL_MSG_FEATURES_GET_REPLY`` device features ``ETHTOOL_MSG_FEATURES_SET_REPLY`` optional reply to FEATURES_SET + ``ETHTOOL_MSG_FEATURES_NTF`` netdev features notification ===================================== ================================= ``GET`` requests are sent by userspace applications to retrieve device @@ -591,6 +592,11 @@ reports the difference between old and new dev->features: mask consists of bits which have changed, values are their values in new dev->features (after the operation). +``ETHTOOL_MSG_FEATURES_NTF`` notification is sent not only if device features +are modified using ``ETHTOOL_MSG_FEATURES_SET`` request or on of ethtool ioctl +request but also each time features are modified with netdev_update_features() +or netdev_change_features(). + Request translation =================== diff --git a/include/uapi/linux/ethtool_netlink.h b/include/uapi/linux/ethtool_netlink.h index 6f7aaa6b7f42..3d0204cf96a6 100644 --- a/include/uapi/linux/ethtool_netlink.h +++ b/include/uapi/linux/ethtool_netlink.h @@ -47,6 +47,7 @@ enum { ETHTOOL_MSG_WOL_NTF, ETHTOOL_MSG_FEATURES_GET_REPLY, ETHTOOL_MSG_FEATURES_SET_REPLY, + ETHTOOL_MSG_FEATURES_NTF, /* add new constants above here */ __ETHTOOL_MSG_KERNEL_CNT, diff --git a/net/ethtool/features.c b/net/ethtool/features.c index a12e73db4452..cf00751067c6 100644 --- a/net/ethtool/features.c +++ b/net/ethtool/features.c @@ -233,6 +233,7 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info) struct nlattr *tb[ETHTOOL_A_FEATURES_MAX + 1]; struct ethnl_req_info req_info = {}; struct net_device *dev; + bool mod; int ret; ret = nlmsg_parse(info->nlhdr, GENL_HDRLEN, tb, @@ -275,6 +276,7 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info) dev->wanted_features = ethnl_bitmap_to_features(req_wanted); __netdev_update_features(dev); ethnl_features_to_bitmap(new_active, dev->features); + mod = !bitmap_equal(old_active, new_active, NETDEV_FEATURE_COUNT); ret = 0; if (!(req_info.flags & ETHTOOL_FLAG_OMIT_REPLY)) { @@ -295,6 +297,8 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info) wanted_diff_mask, new_active, active_diff_mask, compact); } + if (mod) + ethtool_notify(dev, ETHTOOL_MSG_FEATURES_NTF, NULL); out_rtnl: rtnl_unlock(); diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index 757ea3fc98a0..5c0e361bfd66 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -528,6 +528,7 @@ ethnl_default_notify_ops[ETHTOOL_MSG_KERNEL_MAX + 1] = { [ETHTOOL_MSG_LINKMODES_NTF] = ðnl_linkmodes_request_ops, [ETHTOOL_MSG_DEBUG_NTF] = ðnl_debug_request_ops, [ETHTOOL_MSG_WOL_NTF] = ðnl_wol_request_ops, + [ETHTOOL_MSG_FEATURES_NTF] = ðnl_features_request_ops, }; /* default notification handler */ @@ -613,6 +614,7 @@ static const ethnl_notify_handler_t ethnl_notify_handlers[] = { [ETHTOOL_MSG_LINKMODES_NTF] = ethnl_default_notify, [ETHTOOL_MSG_DEBUG_NTF] = ethnl_default_notify, [ETHTOOL_MSG_WOL_NTF] = ethnl_default_notify, + [ETHTOOL_MSG_FEATURES_NTF] = ethnl_default_notify, }; void ethtool_notify(struct net_device *dev, unsigned int cmd, const void *data) @@ -630,6 +632,29 @@ void ethtool_notify(struct net_device *dev, unsigned int cmd, const void *data) } EXPORT_SYMBOL(ethtool_notify); +static void ethnl_notify_features(struct netdev_notifier_info *info) +{ + struct net_device *dev = netdev_notifier_info_to_dev(info); + + ethtool_notify(dev, ETHTOOL_MSG_FEATURES_NTF, NULL); +} + +static int ethnl_netdev_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + switch (event) { + case NETDEV_FEAT_CHANGE: + ethnl_notify_features(ptr); + break; + } + + return NOTIFY_DONE; +} + +static struct notifier_block ethnl_netdev_notifier = { + .notifier_call = ethnl_netdev_event, +}; + /* genetlink setup */ static const struct genl_ops ethtool_genl_ops[] = { @@ -736,7 +761,9 @@ static int __init ethnl_init(void) return ret; ethnl_ok = true; - return 0; + ret = register_netdevice_notifier(ðnl_netdev_notifier); + WARN(ret < 0, "ethtool: net device notifier registration failed"); + return ret; } subsys_initcall(ethnl_init); -- 2.25.1