From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754603AbeAQXuN (ORCPT ); Wed, 17 Jan 2018 18:50:13 -0500 Received: from mail-eopbgr00105.outbound.protection.outlook.com ([40.107.0.105]:22354 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753390AbeAQXuK (ORCPT ); Wed, 17 Jan 2018 18:50:10 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=avagin@virtuozzo.com; Date: Wed, 17 Jan 2018 15:49:42 -0800 From: Andrei Vagin To: Florian Fainelli Cc: netdev@vger.kernel.org, edumazet@google.com, andrew@lunn.ch, cphealy@gmail.com, David Decotigny , "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 , open list Subject: Re: [PATCH net-next] net: core: Expose number of link up/down transitions Message-ID: <20180117234941.GA19561@outlook.office365.com> References: <20180117230704.21949-1-f.fainelli@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline In-Reply-To: <20180117230704.21949-1-f.fainelli@gmail.com> User-Agent: Mutt/1.9.1 (2017-09-22) X-Originating-IP: [65.152.152.74] X-ClientProxiedBy: HE1P190CA0024.EURP190.PROD.OUTLOOK.COM (2603:10a6:3:bc::34) To AM4PR08MB0740.eurprd08.prod.outlook.com (2a01:111:e400:59ed::14) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 43aa9db4-acb0-4574-799b-08d55e0508eb X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:AM4PR08MB0740; X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB0740;3:pfCO3SZV2SFvh080QD2FVPk4prOiURA+g41KtSAtPOlTbliKZeDVEc+rlGQANOrNKns0qJyNs3mu4SOcPzmbX2PO+C+bc8EC8A8AgGtUwA8BVaYMWJ0Z9ZKGD4HwamGkJqw9jOxWrgYltNy/6G37ZOnkKjBHpiXeqsbTnvNSuMkwU1UeYG01/giRcHdV2kkGDNtZm4+eo9JVH0IhR3j8+o34Zprc6SrY/ImlCO21lp8Ks/4Q70bvqE4Nb57f6vyu;25:buyWD+q1N+BEuWIYbWiONDj+d0WJXVBt9mbBoWWybcVz7zaGn1CzqniumHHZUkttLKBoORcYNOj4VfXwGU/WIYYVMTZse52nZA3zbYafN7+5aSGuqIEJ2WM1AiDr3pW18yQzePe0CTdAat7dRkht4pPPaCn2HCr7DUXs+0k62jMJCNR4nc52yf93zIM/kcbd54jW7iZwtsuNK4kYfTfbaby++wJGECf2P85YPeuiw61HE+PLtWCxdF3fKFJk55gpx18ECnO31Uc5e+UK7zZFfsM4rCnJRpb/P2R/2A5YwHF24T+0eaPHL+a/0CkvwP2tBvy+NOlnIwEpcgpZVSxl8Q==;31:n+EmPIrReADcxdlv7uamfjs7VPlY4l/MdhELNE+i0HOge6+RMbANFeMU0S+oWP4vlCBFnkNgkGjSN2YW4RfZqM437nHxrjRaTgDbe9WexORtGJnUJO/pf6rgRyU2u7L+eORMGrybxPNhuZvht8/Eq91gkDdyOrh6hhGsvE1QKoieKqnKQxNHjjLoMKKYMU/HThRN2oFv4S4f7Jv5w3GDQ+O/YUiQ+2kAvUWOdo0w/F4= X-MS-TrafficTypeDiagnostic: AM4PR08MB0740: X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB0740;20:/ZI4ByqJEABdsxsFK1kejOz39GDGAVnt1gyKyxAcuuC5xLndv98ez7OxlqklKY3EXl3emivVjiwMUW26aesx7VPlnN0TioAQGnnGgod6hPlSrZvMy1ZLNzwqKHIHIEENCh1QcvqJjgQvcBtfdU8EEKCwCJwIGJHXFmzy8Qakb+MfJ+qP8emTjpSBrGPsNP3g2b3ZZX20rddkxVvZkrbgSfjUNWP3kWLYwI0Mwy3JpSGW3uYipzhPf73IYlvhRFdgDwbLw0lvD4pb1ZeRseZaFjQ9/XLPqIfbYldB/ZPoBI8MEF/WU54l95Fl0XHphbdMU/Z5XQeOw3eXVj1aK4PPVZSsEz81qmx5CV+/quVwBzVYdwoKGKqA6gSBa13fY3lD8eKwTSfHfEGoj3hSaGUC0SVD0LqDRCepLhTXcty4DBo=;4:K5GEOSlHWkmix1Ww8UfPdvrVXPKvhDKgOzVocyPA+yOfts0LzDILrHRhJVqB0JbWTNSmr9xtTjJbhHMm/8plxS/cmf2rAtZK0+0e3FgzVkt3GN35Zx1fke11Wm8PHGOo90UZBpMXMu5CBGJBqovFna7u4UAJy8xnPPGbEhKBaufr5uZzNeZLHNV+h5oOheqsShjLjHMw2GUtaDaEZ27OPRfbNHac8XNcMh5+c+C3apYwij6a8yc2QQGNFRYW+7ATHVDW+7KKlGZZZmOVfz+LDORyy33VJEiNAAe3Vji1UFmSS2wDLt+LY/aSHRZDsrc3AWsuC7pApfqPyWzJmAc5BmPN1CvoZ/tWj6t1KAMRx2E= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(85827821059158); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(8121501046)(5005006)(3002001)(3231023)(944501161)(93006095)(93001095)(10201501046)(6041268)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(20161123560045)(20161123564045)(6072148)(201708071742011);SRVR:AM4PR08MB0740;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:AM4PR08MB0740; X-Forefront-PRVS: 0555EC8317 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(346002)(39850400004)(376002)(366004)(39380400002)(396003)(50944005)(199004)(189003)(55016002)(478600001)(47776003)(2950100002)(81156014)(16526018)(39060400002)(54906003)(6246003)(9686003)(76176011)(59450400001)(316002)(386003)(50466002)(26005)(7416002)(6116002)(68736007)(106356001)(3846002)(53416004)(23686003)(8936002)(58126008)(105586002)(66066001)(83506002)(16586007)(7696005)(8676002)(52116002)(1076002)(6506007)(2906002)(4326008)(69596002)(5890100001)(53936002)(86362001)(81166006)(229853002)(575784001)(7736002)(305945005)(5660300001)(33656002)(25786009)(551984002)(97736004)(6666003)(6916009)(18370500001);DIR:OUT;SFP:1102;SCL:1;SRVR:AM4PR08MB0740;H:outlook.office365.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?koi8-r?Q?1;AM4PR08MB0740;23:D73qhCfSkFRavkHjub4iNWhqCMt/psn3W7WJjqMY1ks?= =?koi8-r?Q?1FbVLqcvMO58kBoFpWbHI/vX7qgdRohkkUVfexAyLRmcXQu9bp+/UknXIZSK1t?= =?koi8-r?Q?35DEwHXZG98/uCL6HKZVHIlOt1D3HWhqJ8bKw4JpHnVIB1wX44HHLIvJGukvYu?= =?koi8-r?Q?a7J5dlUOGAlFlfzTzBDzbknB3VvlOivDQeuVtI6aqk6jVyULGCaYB4lairabgX?= =?koi8-r?Q?bZ37EplClFjhzbeTkF7xJs0g5JTtMV/UpAbgUwbDvWem9LYp5xY8ec6Bn0mHK0?= =?koi8-r?Q?EjnYXbQqNCU21e1koDbmmj2J+5lfmq5+HFOTlM8DI09vIV4UuBzUL1uFXSiOWD?= =?koi8-r?Q?y5XqCjddUpJ/KUl/d8wK5waGhqQjGxp1AjQTRXsnY29mR2P9sxgEJqYlpkmD4H?= =?koi8-r?Q?B1Rb6L7GDzAf2svco8bNHx5GuZqmGK8FpFxiamiKsd4u+1rftEeuBa7tl8HRzD?= =?koi8-r?Q?/J4eTroLhSgrp5wpacIpXvAHL0e2piwhaHTeDqu23ciwZr1A4xkMNPmygtpvSB?= =?koi8-r?Q?Ow/4LxaFMVfAGtJmxmIqpyWN8LtJuC361uxOqVWGRrpn3FMT+wAWxj9eSWsnx/?= =?koi8-r?Q?dupi3MUF17zHVZNWLM3skJtYrhVsSFJxwk03pbIVyqBuL5wFVgJMOLRrGCoYGO?= =?koi8-r?Q?9hgL6uFl1OOACHSOD9sX2BNtpreEOpAKbXNVA925r9rBzDsa+fX/IyVhEke8Cw?= =?koi8-r?Q?ZJWuZzqae8p6kCVR/YQ7CD0ZYNDZM7kqfH0UFsaeWTOBeodHObFebp32k1Kd5p?= =?koi8-r?Q?whjqyj7VEMVtyQaDi3wP7ln0RqqMsu5r9lz7w2VfIUsZZ7F3UB6nJJBC0iSf1g?= =?koi8-r?Q?K9wHJK8MmWC0lN7pa8ncHhGt1uuCVNk1w92i98doZz2IWnFjv7r1Nsy+gjRmJO?= =?koi8-r?Q?ZVg7zU88jmTcQhS4o9dWQqRgaY04f4QNJ2GuwxOrQ63sjD537idNpeM5ZWfycM?= =?koi8-r?Q?K8dhJ1Tqfr7WC4ffzUoWXbxIIdn5xc0emVwIxzNV1g9yNQw7yJpfaU4oIIt8gJ?= =?koi8-r?Q?YkBFbkKTJpXbjqxGqBGpTf7MqilhknzJpKDUW1mKc1i8hgOYVnkIVcr556ol6U?= =?koi8-r?Q?vWekEXs+BAqd3UlLMWvLdNRykpd+yPLBTLHbK+wyIPoh3ZtvsD8n79gorJnXTU?= =?koi8-r?Q?kA6wPTu/3JoiWvCknvWQfqPr1hHsTEKgK0E2p8aoYwbYs/YpjD4kPGYUnr1kA9?= =?koi8-r?Q?9DWt2vuWkkOqDhfUwr5Wam1SVrjq8xZAlSFf1X38UMG7vutDGX5+HsXroyCYtg?= =?koi8-r?Q?zH5H1dpXokxPJqHA2eiIigwN+Sexp/25JjzqxPFce/jNft0yBkK3WU8yjAX6Wd?= =?koi8-r?Q?YoGlGUNo5Z2Kiab1BXRURkBMpFmQNl+95Ddc9kNOqnSsW7lNNDswUBcDoIx/CN?= =?koi8-r?Q?CmoU50MqS1AGHyp1hFsa12A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB0740;6:f/xHdJBT4M7VQx+nVU9F7OzY8GdXrQ/NzGaVjW66X5VmXvvo+LE3NMoljHNnYNen0s7c0tekT+k8aFstoGON0I78z+rcs/HzL8aZ5RhWGXhwNkEfuWTRgdQCIEfM4fBVNmofuRidBfbcJgaHSEB+ZSwQ0XkcPj+qdrlwPj6Y9hg4/GKzDUdPAh/JVxEi3RDAQTnsGGk0R9ohJX7mq9FEnsz1+WO77TXrqNrDRS7h9coPcF9vzHRB2qwB+zUOXyy6U24tVcdeE0bB63Gy7wLoXKEbDH1ZNZzmME9UtAurBraWyNZorb0PVPv4M1Kss7ub/qggrUiLZK7SgYDCcZf0FVdqbIVwzOLZEC4mfNsQ+b8=;5:h0OULU4a4dvx37g+Thp/+mgobn7XjMg0ZoNAbQuAb6Fq3iM1mKb+D0PS8kGns0ITS2JI40l4QqpVikhL974cvkGHByQYi063BhLsMdhS5tpJ45MUAHXK8T5SKdAfJzxE0CGCi8XYgiH7eQTS5IqyYUPWO1TY+WxY/WxPkgvymtQ=;24:vhtU0ElQq4V5kuUuAEgaPZKsgAEcvsNkts7Cxmc+K2F/e6+5mWYByYSAbioh0JQcsDXRJKht2lR0YIm5zm9vcRdsk/yA1TRaLFbzjpJfz6s=;7:rFGpWM3zSReyTOtsT6vLqxl2Dj1ASxQzTGOUjMNK4lqteiF+QNPW6HfCjWliVTf/FkNrOotGZvwg8NIy6MaVwom0UzF5eLRbuF3FOlJP2ySVXPJBRy51xlH56UEnguIGMy7i9C0b2cXwGNSVxMebRfMA5xkfdUXZC4qh0TwPsG+FxDHRqjyq3DOO1G/Kr7xf78ireyn7oGrVa3KSzp/9JXes0TZkb2zcH5bNumA7QthDScFQl/yIBEiySxrrGVFD SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB0740;20:6kelYF2WVge20EBTJzOrtbfQEmNJDdF6zB/ht3jjsVNKI4BcKijrBMvrT9yDvzU6JVVcCRafSWoHggWQq59npZWLKd1B08jRnjAOxNgKt+PzZnJ9QAdgd8HmDqjnQHZbJmXe8OKsawG6pVO5UNKjS7+GQ7/Sh0DvYT3x0X+txXU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2018 23:49:59.2945 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 43aa9db4-acb0-4574-799b-08d55e0508eb X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR08MB0740 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 17, 2018 at 03:06:57PM -0800, Florian Fainelli wrote: > 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) What is the idea to have two separate counters? Can a delta between them be a bigger than 1? > > 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/ +Date: Mar 2014 > +KernelVersion: 3.15 > +Contact: netdev@vger.kernel.org > +Description: > + 32-bit unsigned integer counting the number of times the link has > + seen a change from UP to DOWN and vice versa > + > +What: /sys/class/net/ +Date: Jan 2018 > +KernelVersion: 4.16 > +Contact: netdev@vger.kernel.org > +Description: > + 32-bit unsigned integer counting the number of times the link has > + been up > + > +What: /sys/class/net/ +Date: Jan 2018 > +KernelVersion: 4.16 > +Contact: netdev@vger.kernel.org > +Description: > + 32-bit unsigned integer counting the number of times the link has > + been down > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index ed0799a12bf2..28f68f7513d0 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -1680,8 +1680,6 @@ struct net_device { > unsigned long base_addr; > int irq; > > - atomic_t carrier_changes; > - > /* > * Some hardware also needs these fields (state,dev_list, > * napi_list,unreg_list,close_list) but they are not > @@ -1719,6 +1717,10 @@ struct net_device { > atomic_long_t tx_dropped; > atomic_long_t rx_nohandler; > > + /* Stats to monitor link on/off, flapping */ > + atomic_t count_link_up; > + atomic_t count_link_down; > + > #ifdef CONFIG_WIRELESS_EXT > const struct iw_handler_def *wireless_handlers; > struct iw_public_data *wireless_data; > diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h > index f8f04fed6186..6e44b0674ba4 100644 > --- a/include/uapi/linux/if_link.h > +++ b/include/uapi/linux/if_link.h > @@ -161,6 +161,8 @@ enum { > IFLA_EVENT, > IFLA_NEW_NETNSID, > IFLA_IF_NETNSID, > + IFLA_COUNT_LINK_UP, > + IFLA_COUNT_LINK_DOWN, > __IFLA_MAX > }; > > diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c > index 7bf8b85ade16..9f732c3dc2ce 100644 > --- a/net/core/net-sysfs.c > +++ b/net/core/net-sysfs.c > @@ -295,10 +295,29 @@ static ssize_t carrier_changes_show(struct device *dev, > struct net_device *netdev = to_net_dev(dev); > > return sprintf(buf, fmt_dec, > - atomic_read(&netdev->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); > } > } > -- > 2.14.1 >