Commit 67b62f98 authored by David Ahern's avatar David Ahern Committed by David S. Miller

net: dev: Improve debug statements for adjacency tracking

Adjacency code only has debugs for the insert case. Add debugs for
the remove path and make both consistently worded to make it easier
to follow the insert and removal with reference counts.

In addition, change the BUG to a WARN_ON. A missing adjacency at
removal time is not cause for a panic.
Signed-off-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0f524a80
...@@ -5561,6 +5561,9 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, ...@@ -5561,6 +5561,9 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
if (adj) { if (adj) {
adj->ref_nr += 1; adj->ref_nr += 1;
pr_debug("Insert adjacency: dev %s adj_dev %s adj->ref_nr %d\n",
dev->name, adj_dev->name, adj->ref_nr);
return 0; return 0;
} }
...@@ -5574,8 +5577,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, ...@@ -5574,8 +5577,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
adj->private = private; adj->private = private;
dev_hold(adj_dev); dev_hold(adj_dev);
pr_debug("dev_hold for %s, because of link added from %s to %s\n", pr_debug("Insert adjacency: dev %s adj_dev %s adj->ref_nr %d; dev_hold on %s\n",
adj_dev->name, dev->name, adj_dev->name); dev->name, adj_dev->name, adj->ref_nr, adj_dev->name);
if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) { if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) {
ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list);
...@@ -5614,17 +5617,22 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev, ...@@ -5614,17 +5617,22 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
{ {
struct netdev_adjacent *adj; struct netdev_adjacent *adj;
pr_debug("Remove adjacency: dev %s adj_dev %s ref_nr %d\n",
dev->name, adj_dev->name, ref_nr);
adj = __netdev_find_adj(adj_dev, dev_list); adj = __netdev_find_adj(adj_dev, dev_list);
if (!adj) { if (!adj) {
pr_err("tried to remove device %s from %s\n", pr_err("Adjacency does not exist for device %s from %s\n",
dev->name, adj_dev->name); dev->name, adj_dev->name);
BUG(); WARN_ON(1);
return;
} }
if (adj->ref_nr > ref_nr) { if (adj->ref_nr > ref_nr) {
pr_debug("%s to %s ref_nr-%d = %d\n", dev->name, adj_dev->name, pr_debug("adjacency: %s to %s ref_nr - %d = %d\n",
ref_nr, adj->ref_nr-ref_nr); dev->name, adj_dev->name, ref_nr,
adj->ref_nr - ref_nr);
adj->ref_nr -= ref_nr; adj->ref_nr -= ref_nr;
return; return;
} }
...@@ -5636,7 +5644,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev, ...@@ -5636,7 +5644,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
list_del_rcu(&adj->list); list_del_rcu(&adj->list);
pr_debug("dev_put for %s, because link removed from %s to %s\n", pr_debug("adjacency: dev_put for %s, because link removed from %s to %s\n",
adj_dev->name, dev->name, adj_dev->name); adj_dev->name, dev->name, adj_dev->name);
dev_put(adj_dev); dev_put(adj_dev);
kfree_rcu(adj, rcu); kfree_rcu(adj, rcu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment