aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaku Izumi <izumi.taku@jp.fujitsu.com>2010-12-09 10:17:13 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-10 19:24:33 -0500
commitf073c7ca29a4a7e14060d9d3ddf09bfbb7cd9cc0 (patch)
treed545b7e77908ffb101c16d1be8cfe641828fa9b9
parent6c2c9d964e71770e7d6efc1a82f3621005d12185 (diff)
bonding: add the debugfs facility to the bonding driver
This patch provides the debugfs facility to the bonding driver. The "bonding" directory is created in the debugfs root and directories of each bonding interface (like bond0, bond1...) are created in that. # mount -t debugfs none /sys/kernel/debug # ls /sys/kernel/debug/bonding bond0 bond1 Signed-off-by: Taku Izumi <izumi.taku@jp.fujitsu.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bonding/Makefile2
-rw-r--r--drivers/net/bonding/bond_debugfs.c96
-rw-r--r--drivers/net/bonding/bond_main.c10
-rw-r--r--drivers/net/bonding/bonding.h9
4 files changed, 115 insertions, 2 deletions
diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile
index 6f9c6faef24c..0e2737eac8b7 100644
--- a/drivers/net/bonding/Makefile
+++ b/drivers/net/bonding/Makefile
@@ -4,7 +4,7 @@
4 4
5obj-$(CONFIG_BONDING) += bonding.o 5obj-$(CONFIG_BONDING) += bonding.o
6 6
7bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o 7bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o bond_debugfs.o
8 8
9ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o 9ipv6-$(subst m,y,$(CONFIG_IPV6)) += bond_ipv6.o
10bonding-objs += $(ipv6-y) 10bonding-objs += $(ipv6-y)
diff --git a/drivers/net/bonding/bond_debugfs.c b/drivers/net/bonding/bond_debugfs.c
new file mode 100644
index 000000000000..ae1eb2fc3a47
--- /dev/null
+++ b/drivers/net/bonding/bond_debugfs.c
@@ -0,0 +1,96 @@
1#include <linux/kernel.h>
2#include <linux/module.h>
3#include <linux/device.h>
4#include <linux/netdevice.h>
5
6#include "bonding.h"
7
8#ifdef CONFIG_DEBUG_FS
9
10#include <linux/debugfs.h>
11#include <linux/seq_file.h>
12
13static struct dentry *bonding_debug_root;
14
15void bond_debug_register(struct bonding *bond)
16{
17 if (!bonding_debug_root)
18 return;
19
20 bond->debug_dir =
21 debugfs_create_dir(bond->dev->name, bonding_debug_root);
22
23 if (!bond->debug_dir) {
24 pr_warning("%s: Warning: failed to register to debugfs\n",
25 bond->dev->name);
26 return;
27 }
28}
29
30void bond_debug_unregister(struct bonding *bond)
31{
32 if (!bonding_debug_root)
33 return;
34
35 debugfs_remove_recursive(bond->debug_dir);
36}
37
38void bond_debug_reregister(struct bonding *bond)
39{
40 struct dentry *d;
41
42 if (!bonding_debug_root)
43 return;
44
45 d = debugfs_rename(bonding_debug_root, bond->debug_dir,
46 bonding_debug_root, bond->dev->name);
47 if (d) {
48 bond->debug_dir = d;
49 } else {
50 pr_warning("%s: Warning: failed to reregister, "
51 "so just unregister old one\n",
52 bond->dev->name);
53 bond_debug_unregister(bond);
54 }
55}
56
57void bond_create_debugfs(void)
58{
59 bonding_debug_root = debugfs_create_dir("bonding", NULL);
60
61 if (!bonding_debug_root) {
62 pr_warning("Warning: Cannot create bonding directory"
63 " in debugfs\n");
64 }
65}
66
67void bond_destroy_debugfs(void)
68{
69 debugfs_remove_recursive(bonding_debug_root);
70 bonding_debug_root = NULL;
71}
72
73
74#else /* !CONFIG_DEBUG_FS */
75
76void bond_debug_register(struct bonding *bond)
77{
78}
79
80void bond_debug_unregister(struct bonding *bond)
81{
82}
83
84void bond_debug_reregister(struct bonding *bond)
85{
86}
87
88void bond_create_debugfs(void)
89{
90}
91
92void bond_destroy_debugfs(void)
93{
94}
95
96#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index bb33b3b347fa..07011e42cec7 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3503,6 +3503,8 @@ static int bond_event_changename(struct bonding *bond)
3503 bond_remove_proc_entry(bond); 3503 bond_remove_proc_entry(bond);
3504 bond_create_proc_entry(bond); 3504 bond_create_proc_entry(bond);
3505 3505
3506 bond_debug_reregister(bond);
3507
3506 return NOTIFY_DONE; 3508 return NOTIFY_DONE;
3507} 3509}
3508 3510
@@ -4785,6 +4787,8 @@ static void bond_uninit(struct net_device *bond_dev)
4785 4787
4786 bond_remove_proc_entry(bond); 4788 bond_remove_proc_entry(bond);
4787 4789
4790 bond_debug_unregister(bond);
4791
4788 __hw_addr_flush(&bond->mc_list); 4792 __hw_addr_flush(&bond->mc_list);
4789 4793
4790 list_for_each_entry_safe(vlan, tmp, &bond->vlan_list, vlan_list) { 4794 list_for_each_entry_safe(vlan, tmp, &bond->vlan_list, vlan_list) {
@@ -5187,6 +5191,8 @@ static int bond_init(struct net_device *bond_dev)
5187 5191
5188 bond_prepare_sysfs_group(bond); 5192 bond_prepare_sysfs_group(bond);
5189 5193
5194 bond_debug_register(bond);
5195
5190 __hw_addr_init(&bond->mc_list); 5196 __hw_addr_init(&bond->mc_list);
5191 return 0; 5197 return 0;
5192} 5198}
@@ -5308,6 +5314,8 @@ static int __init bonding_init(void)
5308 if (res) 5314 if (res)
5309 goto err_link; 5315 goto err_link;
5310 5316
5317 bond_create_debugfs();
5318
5311 for (i = 0; i < max_bonds; i++) { 5319 for (i = 0; i < max_bonds; i++) {
5312 res = bond_create(&init_net, NULL); 5320 res = bond_create(&init_net, NULL);
5313 if (res) 5321 if (res)
@@ -5318,7 +5326,6 @@ static int __init bonding_init(void)
5318 if (res) 5326 if (res)
5319 goto err; 5327 goto err;
5320 5328
5321
5322 register_netdevice_notifier(&bond_netdev_notifier); 5329 register_netdevice_notifier(&bond_netdev_notifier);
5323 register_inetaddr_notifier(&bond_inetaddr_notifier); 5330 register_inetaddr_notifier(&bond_inetaddr_notifier);
5324 bond_register_ipv6_notifier(); 5331 bond_register_ipv6_notifier();
@@ -5342,6 +5349,7 @@ static void __exit bonding_exit(void)
5342 bond_unregister_ipv6_notifier(); 5349 bond_unregister_ipv6_notifier();
5343 5350
5344 bond_destroy_sysfs(); 5351 bond_destroy_sysfs();
5352 bond_destroy_debugfs();
5345 5353
5346 rtnl_link_unregister(&bond_link_ops); 5354 rtnl_link_unregister(&bond_link_ops);
5347 unregister_pernet_subsys(&bond_net_ops); 5355 unregister_pernet_subsys(&bond_net_ops);
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
index ad3ae46a4c01..03710f8f5c49 100644
--- a/drivers/net/bonding/bonding.h
+++ b/drivers/net/bonding/bonding.h
@@ -259,6 +259,10 @@ struct bonding {
259#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 259#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
260 struct in6_addr master_ipv6; 260 struct in6_addr master_ipv6;
261#endif 261#endif
262#ifdef CONFIG_DEBUG_FS
263 /* debugging suport via debugfs */
264 struct dentry *debug_dir;
265#endif /* CONFIG_DEBUG_FS */
262}; 266};
263 267
264/** 268/**
@@ -380,6 +384,11 @@ void bond_select_active_slave(struct bonding *bond);
380void bond_change_active_slave(struct bonding *bond, struct slave *new_active); 384void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
381void bond_register_arp(struct bonding *); 385void bond_register_arp(struct bonding *);
382void bond_unregister_arp(struct bonding *); 386void bond_unregister_arp(struct bonding *);
387void bond_create_debugfs(void);
388void bond_destroy_debugfs(void);
389void bond_debug_register(struct bonding *bond);
390void bond_debug_unregister(struct bonding *bond);
391void bond_debug_reregister(struct bonding *bond);
383 392
384struct bond_net { 393struct bond_net {
385 struct net * net; /* Associated network namespace */ 394 struct net * net; /* Associated network namespace */