bonding: create bond_first_slave_rcu()
Subsystems (3)
PATCH v4 5/11 bonding: create bond_first_slave_rcu()
The bond_first_slave_rcu() will be used to instead of bond_first_slave() in rcu_read_lock().
According to the Jay Vosburgh's suggestion, the struct netdev_adjacent should hide from users who wanted to use it directly. so I package a new function to get the first slave of the bond.
Suggested-by Nikolay Aleksandrov <[email protected]>
Suggested-by Jay Vosburgh <[email protected]>
Suggested-by Veaceslav Falico <[email protected]>
Signed-off-by Ding Tianhong <[email protected]>
--- drivers/net/bonding/bonding.h | 4 ++++ include/linux/netdevice.h | 1 + net/core/dev.c | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+)
drivers/net/bonding/bonding.h +4 -0
@@ -91,6 +91,10 @@ netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \ NULL) +/* Caller must have rcu_read_lock */ +#define bond_first_slave_rcu (bond) \ + netdev_lower_get_first_private_rcu(bond->dev) +#define bond_is_first_slave (bond, pos) (pos == bond_first_slave(bond))#define bond_is_last_slave (bond, pos) (pos == bond_last_slave(bond))
include/linux/netdevice.h +1 -0
@@ -2869,6 +2869,7 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev, priv = netdev_lower_get_next_private_rcu(dev, &(iter)))void *netdev_adjacent_get_private (struct list_head *adj_list); +void *netdev_lower_get_first_private_rcu (struct net_device *dev);struct net_device *netdev_master_upper_dev_get (struct net_device *dev);struct net_device *netdev_master_upper_dev_get_rcu (struct net_device *dev);int netdev_upper_dev_link (struct net_device *dev,struct net_device *upper_dev);
net/core/dev.c +21 -0
@@ -4570,6 +4570,27 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,EXPORT_SYMBOL (netdev_lower_get_next_private_rcu);/** +* netdev_lower_get_first_private_rcu - Get the first ->private from the +* lower neighbour list, RCU +* variant +* @dev: device +* +* Gets the first netdev_adjacent->private from the dev's lower neighbour +* list. The caller must hold RCU read lock. +*/ +void *netdev_lower_get_first_private_rcu (struct net_device *dev) +{ +struct netdev_adjacent *lower; + + lower =list_first_or_null_rcu (&dev->adj_list.lower, + struct netdev_adjacent, list); +if (lower) +return lower->private; +return NULL ; +} +EXPORT_SYMBOL (netdev_lower_get_first_private_rcu); + +/** * netdev_master_upper_dev_get_rcu - Get master upper device * @dev: device *
Signature · 1 line
1.8.2.1