From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751322AbaC1GZm (ORCPT ); Fri, 28 Mar 2014 02:25:42 -0400 Received: from mail-ee0-f48.google.com ([74.125.83.48]:57047 "EHLO mail-ee0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751125AbaC1GZl (ORCPT ); Fri, 28 Mar 2014 02:25:41 -0400 Date: Fri, 28 Mar 2014 07:25:37 +0100 From: Jiri Pirko To: David Decotigny Cc: "David S. Miller" , Jamal Hadi Salim , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Eric Dumazet , "Eric W. Biederman" , Weilong Chen , Amir Vadai , Michael Dalton , Al Viro , Tejun Heo Subject: Re: [PATCH v1] net-sysfs: expose number of link up/down transitions Message-ID: <20140328062537.GA2805@minipsycho.orion> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fri, Mar 28, 2014 at 05:35:00AM CET, decot@googlers.com wrote: >Tested: > grep . /sys/class/net/*/count_link_* > + ip link set dev X down/up > >Signed-off-by: David Decotigny >--- > include/linux/netdevice.h | 4 ++++ > net/core/net-sysfs.c | 18 ++++++++++++++++++ > net/sched/sch_generic.c | 2 ++ > 3 files changed, 24 insertions(+) > >diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >index 4b6d12c..cf52869 100644 >--- a/include/linux/netdevice.h >+++ b/include/linux/netdevice.h >@@ -1315,6 +1315,10 @@ struct net_device { > * Do not use this in drivers. > */ > >+ /* Stats to monitor link on/off, flapping */ >+ atomic_t count_link_up; >+ atomic_t count_link_down; >+ > #ifdef CONFIG_WIRELESS_EXT > /* List of functions to handle Wireless Extensions (instead of ioctl). > * See for details. Jean II */ >diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c >index daed9a6..a65ac54 100644 >--- a/net/core/net-sysfs.c >+++ b/net/core/net-sysfs.c >@@ -253,6 +253,22 @@ static ssize_t operstate_show(struct device *dev, > } > static DEVICE_ATTR_RO(operstate); > >+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 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_up); >+static DEVICE_ATTR_RO(count_link_down); >+ If this is exposed in sysfs, this needs to be exposed via RT netlink as well. > /* read-write attributes */ > > static int change_mtu(struct net_device *net, unsigned long new_mtu) >@@ -386,6 +402,8 @@ static struct attribute *net_class_attrs[] = { > &dev_attr_duplex.attr, > &dev_attr_dormant.attr, > &dev_attr_operstate.attr, >+ &dev_attr_count_link_up.attr, >+ &dev_attr_count_link_down.attr, > &dev_attr_ifalias.attr, > &dev_attr_carrier.attr, > &dev_attr_mtu.attr, >diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c >index e82e43b..2d06943 100644 >--- a/net/sched/sch_generic.c >+++ b/net/sched/sch_generic.c >@@ -310,6 +310,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->count_link_up); > linkwatch_fire_event(dev); > if (netif_running(dev)) > __netdev_watchdog_up(dev); >@@ -328,6 +329,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->count_link_down); > linkwatch_fire_event(dev); > } > } >-- >1.9.1.423.g4596e3a >