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 <nikolay@redhat.com> Suggested-by: Jay Vosburgh <fubar@us.ibm.com> Suggested-by: Veaceslav Falico <vfalico@redhat.com> Signed-off-by: Ding Tianhong <dingtianhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2e52f4fe36
commit
e001bfad91
@@ -101,6 +101,10 @@
|
|||||||
netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \
|
netdev_adjacent_get_private(bond_slave_list(bond)->prev) : \
|
||||||
NULL)
|
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_first_slave(bond, pos) (pos == bond_first_slave(bond))
|
||||||
#define bond_is_last_slave(bond, pos) (pos == bond_last_slave(bond))
|
#define bond_is_last_slave(bond, pos) (pos == bond_last_slave(bond))
|
||||||
|
|
||||||
|
@@ -2907,6 +2907,7 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
|
|||||||
priv = netdev_lower_get_next_private_rcu(dev, &(iter)))
|
priv = netdev_lower_get_next_private_rcu(dev, &(iter)))
|
||||||
|
|
||||||
void *netdev_adjacent_get_private(struct list_head *adj_list);
|
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(struct net_device *dev);
|
||||||
struct net_device *netdev_master_upper_dev_get_rcu(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);
|
int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
|
||||||
|
@@ -4543,6 +4543,27 @@ void *netdev_lower_get_next_private_rcu(struct net_device *dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(netdev_lower_get_next_private_rcu);
|
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
|
* netdev_master_upper_dev_get_rcu - Get master upper device
|
||||||
* @dev: device
|
* @dev: device
|
||||||
|
Reference in New Issue
Block a user