Skip to content

Commit

Permalink
net: use lists as arguments instead of bool upper
Browse files Browse the repository at this point in the history
Currently we make use of bool upper when we want to specify if we want to
work with upper/lower list. It's, however, harder to read, debug and
occupies a lot more code.

Fix this by just passing the correct upper/lower_dev_list list_head pointer
instead of bool upper, and work internally with it.

CC: "David S. Miller" <davem@davemloft.net>
CC: Eric Dumazet <edumazet@google.com>
CC: Jiri Pirko <jiri@resnulli.us>
CC: Alexander Duyck <alexander.h.duyck@intel.com>
CC: Cong Wang <amwang@redhat.com>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Veaceslav Falico authored and David S. Miller committed Sep 26, 2013
1 parent 4ed377e commit 7863c05
Showing 1 changed file with 22 additions and 32 deletions.
54 changes: 22 additions & 32 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -4385,12 +4385,9 @@ struct netdev_adjacent {

static struct netdev_adjacent *__netdev_find_adj(struct net_device *dev,
struct net_device *adj_dev,
bool upper)
struct list_head *dev_list)
{
struct netdev_adjacent *adj;
struct list_head *dev_list;

dev_list = upper ? &dev->upper_dev_list : &dev->lower_dev_list;

list_for_each_entry(adj, dev_list, list) {
if (adj->dev == adj_dev)
Expand All @@ -4402,13 +4399,13 @@ static struct netdev_adjacent *__netdev_find_adj(struct net_device *dev,
static inline struct netdev_adjacent *__netdev_find_upper(struct net_device *dev,
struct net_device *udev)
{
return __netdev_find_adj(dev, udev, true);
return __netdev_find_adj(dev, udev, &dev->upper_dev_list);
}

static inline struct netdev_adjacent *__netdev_find_lower(struct net_device *dev,
struct net_device *ldev)
{
return __netdev_find_adj(dev, ldev, false);
return __netdev_find_adj(dev, ldev, &dev->lower_dev_list);
}

/**
Expand Down Expand Up @@ -4514,12 +4511,12 @@ EXPORT_SYMBOL(netdev_master_upper_dev_get_rcu);

static int __netdev_adjacent_dev_insert(struct net_device *dev,
struct net_device *adj_dev,
bool neighbour, bool master,
bool upper)
struct list_head *dev_list,
bool neighbour, bool master)
{
struct netdev_adjacent *adj;

adj = __netdev_find_adj(dev, adj_dev, upper);
adj = __netdev_find_adj(dev, adj_dev, dev_list);

if (adj) {
BUG_ON(neighbour);
Expand All @@ -4538,19 +4535,14 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,

dev_hold(adj_dev);
pr_debug("dev_hold for %s, because of %s link added from %s to %s\n",
adj_dev->name, upper ? "upper" : "lower", dev->name,
adj_dev->name);
adj_dev->name, dev_list == &dev->upper_dev_list ?
"upper" : "lower", dev->name, adj_dev->name);

if (!upper) {
list_add_tail_rcu(&adj->list, &dev->lower_dev_list);
return 0;
}

/* Ensure that master upper link is always the first item in list. */
/* Ensure that master link is always the first item in list. */
if (master)
list_add_rcu(&adj->list, &dev->upper_dev_list);
list_add_rcu(&adj->list, dev_list);
else
list_add_tail_rcu(&adj->list, &dev->upper_dev_list);
list_add_tail_rcu(&adj->list, dev_list);

return 0;
}
Expand All @@ -4559,27 +4551,25 @@ static inline int __netdev_upper_dev_insert(struct net_device *dev,
struct net_device *udev,
bool master, bool neighbour)
{
return __netdev_adjacent_dev_insert(dev, udev, neighbour, master,
true);
return __netdev_adjacent_dev_insert(dev, udev, &dev->upper_dev_list,
neighbour, master);
}

static inline int __netdev_lower_dev_insert(struct net_device *dev,
struct net_device *ldev,
bool neighbour)
{
return __netdev_adjacent_dev_insert(dev, ldev, neighbour, false,
false);
return __netdev_adjacent_dev_insert(dev, ldev, &dev->lower_dev_list,
neighbour, false);
}

void __netdev_adjacent_dev_remove(struct net_device *dev,
struct net_device *adj_dev, bool upper)
struct net_device *adj_dev,
struct list_head *dev_list)
{
struct netdev_adjacent *adj;

if (upper)
adj = __netdev_find_upper(dev, adj_dev);
else
adj = __netdev_find_lower(dev, adj_dev);
adj = __netdev_find_adj(dev, adj_dev, dev_list);

if (!adj)
BUG();
Expand All @@ -4591,22 +4581,22 @@ void __netdev_adjacent_dev_remove(struct net_device *dev,

list_del_rcu(&adj->list);
pr_debug("dev_put for %s, because of %s link removed from %s to %s\n",
adj_dev->name, upper ? "upper" : "lower", dev->name,
adj_dev->name);
adj_dev->name, dev_list == &dev->upper_dev_list ?
"upper" : "lower", dev->name, adj_dev->name);
dev_put(adj_dev);
kfree_rcu(adj, rcu);
}

static inline void __netdev_upper_dev_remove(struct net_device *dev,
struct net_device *udev)
{
return __netdev_adjacent_dev_remove(dev, udev, true);
return __netdev_adjacent_dev_remove(dev, udev, &dev->upper_dev_list);
}

static inline void __netdev_lower_dev_remove(struct net_device *dev,
struct net_device *ldev)
{
return __netdev_adjacent_dev_remove(dev, ldev, false);
return __netdev_adjacent_dev_remove(dev, ldev, &dev->lower_dev_list);
}

int __netdev_adjacent_dev_insert_link(struct net_device *dev,
Expand Down

0 comments on commit 7863c05

Please sign in to comment.