[RFC] netdev: debugging option

From: Stephen Hemminger
Date: Sun Jul 20 2008 - 02:04:58 EST


This adds a debugging option for network devices. It could grow to add other
uses, but for now just add some messages about device reference counting.

Signed-off-by: Stephen Hemminger <shemminger@xxxxxxxxxx>

--- a/include/linux/netdevice.h 2008-07-19 15:04:59.000000000 -0700
+++ b/include/linux/netdevice.h 2008-07-19 22:09:21.000000000 -0700
@@ -1236,6 +1236,14 @@ extern int netdev_budget;
/* Called by rtnetlink.c:rtnl_unlock() */
extern void netdev_run_todo(void);

+#ifdef CONFIG_DEBUG_NETDEV
+extern int netdev_debug;
+extern void __dev_hold(struct net_device *, const char *);
+extern void __dev_put(struct net_device *, const char *);
+
+#define dev_hold(dev) __dev_hold(dev, __FUNCTION__)
+#define dev_put(dev) __dev_put(dev, __FUNCTION__)
+#else
/**
* dev_put - release reference to device
* @dev: network device
@@ -1257,6 +1265,8 @@ static inline void dev_hold(struct net_d
{
atomic_inc(&dev->refcnt);
}
+#endif
+

/* Carrier loss detection, dial on demand. The functions netif_carrier_on
* and _off may be called from IRQ context, but it is caller
--- a/lib/Kconfig.debug 2008-07-19 15:03:14.000000000 -0700
+++ b/lib/Kconfig.debug 2008-07-19 15:04:50.000000000 -0700
@@ -428,6 +428,13 @@ config DEBUG_KOBJECT
If you say Y here, some extra kobject debugging messages will be sent
to the syslog.

+config DEBUG_NETDEV
+ bool "network device debugging"
+ depends on DEBUG_KERNEL
+ help
+ This option enables extra checking on usage and reference counting
+ of network devices.
+
config DEBUG_HIGHMEM
bool "Highmem debugging"
depends on DEBUG_KERNEL && HIGHMEM
--- a/net/core/dev.c 2008-07-19 15:12:06.000000000 -0700
+++ b/net/core/dev.c 2008-07-19 22:12:06.000000000 -0700
@@ -4091,6 +4091,30 @@ static void netdev_wait_allrefs(struct n
}
}

+#ifdef CONFIG_DEBUG_NETDEV
+/* This is for debugging reference counting of devices */
+int netdev_debug __read_mostly;
+
+void __dev_hold(struct net_device *dev, const char *func)
+{
+ atomic_inc(&dev->refcnt);
+ if (unlikely(netdev_debug))
+ printk(KERN_DEBUG "%s: dev_hold %d %s\n",
+ dev->name, atomic_read(&dev->refcnt), func);
+}
+EXPORT_SYMBOL(__dev_hold);
+
+void __dev_put(struct net_device *dev, const char *func)
+{
+ BUG_ON(atomic_read(&dev->refcnt) == 0);
+ if (unlikely(netdev_debug))
+ printk(KERN_DEBUG "%s: dev_put %d %s\n",
+ dev->name, atomic_read(&dev->refcnt), func);
+ atomic_dec(&dev->refcnt);
+}
+EXPORT_SYMBOL(__dev_put);
+#endif
+
/* The sequence is:
*
* rtnl_lock();
--- a/net/core/sysctl_net_core.c 2008-07-19 15:12:21.000000000 -0700
+++ b/net/core/sysctl_net_core.c 2008-07-19 15:29:53.000000000 -0700
@@ -140,6 +140,17 @@ static struct ctl_table net_core_table[]
.mode = 0644,
.proc_handler = &proc_dointvec
},
+#ifdef CONFIG_DEBUG_NETDEV
+ {
+ .ctl_name = CTL_UNNUMBERED,
+ .procname = "netdev_debug",
+ .data = &netdev_debug,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = &proc_dointvec
+ },
+
+#endif
{ .ctl_name = 0 }
};

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/