mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 fedcc6da10
			
		
	
	
		fedcc6da10
		
	
	
	
	
		
			
			The debugfs core now will print a message if this function fails, so don't duplicate that logic. Also, no need to change the code logic if the call fails either, as no debugfs calls should interrupt normal kernel code for any reason. Cc: Jay Vosburgh <j.vosburgh@gmail.com> Cc: Veaceslav Falico <vfalico@gmail.com> Cc: Andy Gospodarek <andy@greyhouse.net> Cc: "David S. Miller" <davem@davemloft.net> Cc: netdev@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			126 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| #include <linux/kernel.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/device.h>
 | |
| #include <linux/netdevice.h>
 | |
| 
 | |
| #include <net/bonding.h>
 | |
| #include <net/bond_alb.h>
 | |
| 
 | |
| #if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_NET_NS)
 | |
| 
 | |
| #include <linux/debugfs.h>
 | |
| #include <linux/seq_file.h>
 | |
| 
 | |
| static struct dentry *bonding_debug_root;
 | |
| 
 | |
| /* Show RLB hash table */
 | |
| static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)
 | |
| {
 | |
| 	struct bonding *bond = m->private;
 | |
| 	struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
 | |
| 	struct rlb_client_info *client_info;
 | |
| 	u32 hash_index;
 | |
| 
 | |
| 	if (BOND_MODE(bond) != BOND_MODE_ALB)
 | |
| 		return 0;
 | |
| 
 | |
| 	seq_printf(m, "SourceIP        DestinationIP   "
 | |
| 			"Destination MAC   DEV\n");
 | |
| 
 | |
| 	spin_lock_bh(&bond->mode_lock);
 | |
| 
 | |
| 	hash_index = bond_info->rx_hashtbl_used_head;
 | |
| 	for (; hash_index != RLB_NULL_INDEX;
 | |
| 	     hash_index = client_info->used_next) {
 | |
| 		client_info = &(bond_info->rx_hashtbl[hash_index]);
 | |
| 		seq_printf(m, "%-15pI4 %-15pI4 %-17pM %s\n",
 | |
| 			&client_info->ip_src,
 | |
| 			&client_info->ip_dst,
 | |
| 			&client_info->mac_dst,
 | |
| 			client_info->slave->dev->name);
 | |
| 	}
 | |
| 
 | |
| 	spin_unlock_bh(&bond->mode_lock);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| DEFINE_SHOW_ATTRIBUTE(bond_debug_rlb_hash);
 | |
| 
 | |
| void bond_debug_register(struct bonding *bond)
 | |
| {
 | |
| 	if (!bonding_debug_root)
 | |
| 		return;
 | |
| 
 | |
| 	bond->debug_dir =
 | |
| 		debugfs_create_dir(bond->dev->name, bonding_debug_root);
 | |
| 
 | |
| 	debugfs_create_file("rlb_hash_table", 0400, bond->debug_dir,
 | |
| 				bond, &bond_debug_rlb_hash_fops);
 | |
| }
 | |
| 
 | |
| void bond_debug_unregister(struct bonding *bond)
 | |
| {
 | |
| 	if (!bonding_debug_root)
 | |
| 		return;
 | |
| 
 | |
| 	debugfs_remove_recursive(bond->debug_dir);
 | |
| }
 | |
| 
 | |
| void bond_debug_reregister(struct bonding *bond)
 | |
| {
 | |
| 	struct dentry *d;
 | |
| 
 | |
| 	if (!bonding_debug_root)
 | |
| 		return;
 | |
| 
 | |
| 	d = debugfs_rename(bonding_debug_root, bond->debug_dir,
 | |
| 			   bonding_debug_root, bond->dev->name);
 | |
| 	if (d) {
 | |
| 		bond->debug_dir = d;
 | |
| 	} else {
 | |
| 		netdev_warn(bond->dev, "failed to reregister, so just unregister old one\n");
 | |
| 		bond_debug_unregister(bond);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void bond_create_debugfs(void)
 | |
| {
 | |
| 	bonding_debug_root = debugfs_create_dir("bonding", NULL);
 | |
| 
 | |
| 	if (!bonding_debug_root) {
 | |
| 		pr_warn("Warning: Cannot create bonding directory in debugfs\n");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void bond_destroy_debugfs(void)
 | |
| {
 | |
| 	debugfs_remove_recursive(bonding_debug_root);
 | |
| 	bonding_debug_root = NULL;
 | |
| }
 | |
| 
 | |
| 
 | |
| #else /* !CONFIG_DEBUG_FS */
 | |
| 
 | |
| void bond_debug_register(struct bonding *bond)
 | |
| {
 | |
| }
 | |
| 
 | |
| void bond_debug_unregister(struct bonding *bond)
 | |
| {
 | |
| }
 | |
| 
 | |
| void bond_debug_reregister(struct bonding *bond)
 | |
| {
 | |
| }
 | |
| 
 | |
| void bond_create_debugfs(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| void bond_destroy_debugfs(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| #endif /* CONFIG_DEBUG_FS */
 |