From patchwork Wed Jan 17 23:06:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 862629 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KgXFSE9W"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zMN5x5wlbz9s7v for ; Thu, 18 Jan 2018 10:07:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753887AbeAQXHc (ORCPT ); Wed, 17 Jan 2018 18:07:32 -0500 Received: from mail-qt0-f194.google.com ([209.85.216.194]:38919 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753740AbeAQXHa (ORCPT ); Wed, 17 Jan 2018 18:07:30 -0500 Received: by mail-qt0-f194.google.com with SMTP id f4so4942228qtj.6; Wed, 17 Jan 2018 15:07:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=opEfec/77vSPIg+sW5YbHu8osvrd/rMa9FhKPZUWhJc=; b=KgXFSE9WLKplaQ1RKNSHTNLOYUj3raOmCQmd24v4RmcylZrtEQI9PShTgrkhW5zoYV GH5Vq3kK3h5alD+JdSGoSylFTg/Ovk1cACPlHiuUHDF3dgqReu9Bpah78QZiijCJJoTG ESTOSORrPfNpem6jNcB+Z/AyWpPrtWJlkS0Yz9GKveZfCnAtyH04meeVC5QKv74yI9mF ZftKqgmZgKZTSusGIMV6E3HAP+EcJPCC23q/f3rQz5D8sMZNsX2xvXhpIisVTSmPgAZ/ MvT6ilEKKlrZLoPmFsAy4ekriKVuQSlcgETb79hkIVYnTero8i25chrbKXixs+KA3X4M dvsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=opEfec/77vSPIg+sW5YbHu8osvrd/rMa9FhKPZUWhJc=; b=MntOR185KmhED7xAz7vz+Wtlr/4D2tc/LnBEffcBXwuLFsD4d9246lT5dqw3iJsCKb GYVoAH8XOitL+YvrjhGEajoYC6OcS2MdlG5sUwHEAUVZWdcS/kBjc+zVB8ajUSlLREc0 XMYi5fAfxgEmVbmjDtQ6Rg1JmB7VMUijsDFxsuH6MDKkivtsQ8VO2igYtxyFjmchgWMx TAC6vBbI9hqqJvYNxmvhe0r1+hbwacQJ1fJgeq2yD7XRLXLeAl5+Om9+96DpTtiknA18 6l32W9ce3XPLzL6JlByLKruIiBSW7uzouGFpSPRyJDN/Ijm5JfNblXf5ykba3grUSXcK pznw== X-Gm-Message-State: AKwxytfqlpxJSFM3uOojA73ujQludtgwsBuTdNd/s8MI5pCObfqqSyti oXc/UPNVuif6Q+579M0jC50k3b87 X-Google-Smtp-Source: AH8x227EqbGlvjA6gOH8X4ddx1dC9POPd06LOC44EFeeUlIqcTN4RAQg4k3z66SvPBLgejPLlT2cCA== X-Received: by 10.55.33.5 with SMTP id h5mr209302qkh.9.1516230448582; Wed, 17 Jan 2018 15:07:28 -0800 (PST) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id l125sm3489263qkc.3.2018.01.17.15.07.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 15:07:27 -0800 (PST) From: Florian Fainelli To: netdev@vger.kernel.org Cc: edumazet@google.com, andrew@lunn.ch, cphealy@gmail.com, David Decotigny , Florian Fainelli , "David S. Miller" , Jamal Hadi Salim , Cong Wang , Jiri Pirko , Daniel Borkmann , Nikolay Aleksandrov , Alexei Starovoitov , Roopa Prabhu , Mahesh Bandewar , Vlad Yasevich , Jakub Kicinski , Jonas Bonn , stephen hemminger , Hans Liljestrand , "Reshetova, Elena" , Kirill Tkhai , Andrey Vagin , Florian Westphal , David Ahern , Xin Long , Matthias Schiffer , Jiri Benc , linux-kernel@vger.kernel.org (open list) Subject: [PATCH net-next] net: core: Expose number of link up/down transitions Date: Wed, 17 Jan 2018 15:06:57 -0800 Message-Id: <20180117230704.21949-1-f.fainelli@gmail.com> X-Mailer: git-send-email 2.14.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Decotigny Expose the number of times the link has been going UP or DOWN, and update the "carrier_changes" counter to be the sum of these two events. While at it, also update the sysfs-class-net documentation to cover: carrier_changes (3.15), count_link_up (4.16) and count_link_down (4.16) Signed-off-by: David Decotigny [Florian: * rebase * add documentation * merge carrier_changes with up/down counters] Signed-off-by: Florian Fainelli --- Documentation/ABI/testing/sysfs-class-net | 24 ++++++++++++++++++++++++ include/linux/netdevice.h | 6 ++++-- include/uapi/linux/if_link.h | 2 ++ net/core/net-sysfs.c | 23 ++++++++++++++++++++++- net/core/rtnetlink.c | 13 +++++++++++-- net/sched/sch_generic.c | 4 ++-- 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-class-net b/Documentation/ABI/testing/sysfs-class-net index 6856da99b6f7..e4b0d5157305 100644 --- a/Documentation/ABI/testing/sysfs-class-net +++ b/Documentation/ABI/testing/sysfs-class-net @@ -259,3 +259,27 @@ Contact: netdev@vger.kernel.org Description: Symbolic link to the PHY device this network device is attached to. + +What: /sys/class/net/carrier_changes)); + atomic_read(&netdev->count_link_up) + + atomic_read(&netdev->count_link_down)); } static DEVICE_ATTR_RO(carrier_changes); +static ssize_t count_link_up_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct net_device *netdev = to_net_dev(dev); + + return sprintf(buf, fmt_dec, atomic_read(&netdev->count_link_up)); +} +static DEVICE_ATTR_RO(count_link_up); + +static ssize_t count_link_down_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct net_device *netdev = to_net_dev(dev); + + return sprintf(buf, fmt_dec, atomic_read(&netdev->count_link_down)); +} +static DEVICE_ATTR_RO(count_link_down); + /* read-write attributes */ static int change_mtu(struct net_device *dev, unsigned long new_mtu) @@ -547,6 +566,8 @@ static struct attribute *net_class_attrs[] __ro_after_init = { &dev_attr_phys_port_name.attr, &dev_attr_phys_switch_id.attr, &dev_attr_proto_down.attr, + &dev_attr_count_link_up.attr, + &dev_attr_count_link_down.attr, NULL, }; ATTRIBUTE_GROUPS(net_class); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 16d644a4f974..68f69a956713 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -990,6 +990,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, + nla_total_size(4) /* IFLA_NEW_NETNSID */ + nla_total_size(1) /* IFLA_PROTO_DOWN */ + nla_total_size(4) /* IFLA_IF_NETNSID */ + + nla_total_size(4) /* IFLA_COUNT_LINK_UP */ + + nla_total_size(4) /* IFLA_COUNT_LINK_DOWN */ + 0; } @@ -1551,8 +1553,13 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) || nla_put_ifalias(skb, dev) || nla_put_u32(skb, IFLA_CARRIER_CHANGES, - atomic_read(&dev->carrier_changes)) || - nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down)) + atomic_read(&dev->count_link_up) + + atomic_read(&dev->count_link_down)) || + nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down) || + nla_put_u32(skb, IFLA_COUNT_LINK_UP, + atomic_read(&dev->count_link_up)) || + nla_put_u32(skb, IFLA_COUNT_LINK_DOWN, + atomic_read(&dev->count_link_down))) goto nla_put_failure; if (event != IFLA_EVENT_NONE) { @@ -1656,6 +1663,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = { [IFLA_EVENT] = { .type = NLA_U32 }, [IFLA_GROUP] = { .type = NLA_U32 }, [IFLA_IF_NETNSID] = { .type = NLA_S32 }, + [IFLA_COUNT_LINK_UP] = { .type = NLA_U32 }, + [IFLA_COUNT_LINK_DOWN] = { .type = NLA_U32 }, }; static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index ef8b4ecde2ac..28941636afa3 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -510,7 +510,7 @@ void netif_carrier_on(struct net_device *dev) if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { if (dev->reg_state == NETREG_UNINITIALIZED) return; - atomic_inc(&dev->carrier_changes); + atomic_inc(&dev->count_link_up); linkwatch_fire_event(dev); if (netif_running(dev)) __netdev_watchdog_up(dev); @@ -529,7 +529,7 @@ void netif_carrier_off(struct net_device *dev) if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { if (dev->reg_state == NETREG_UNINITIALIZED) return; - atomic_inc(&dev->carrier_changes); + atomic_inc(&dev->count_link_down); linkwatch_fire_event(dev); } }