mlxsw: spectrum: Add couple of lower device helper functions
Add functions that iterate over lower devices and find port device. As a dependency add netdev_for_each_all_lower_dev and netdev_for_each_all_lower_dev_rcu macro with netdev_all_lower_get_next and netdev_all_lower_get_next_rcu shelpers. Also, add functions to return mlxsw struct according to lower device found and mlxsw_port struct with a reference to lower device. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
61c503f976
commit
7ce856aaaf
@@ -5444,6 +5444,52 @@ void *netdev_lower_get_next(struct net_device *dev, struct list_head **iter)
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_lower_get_next);
|
||||
|
||||
/**
|
||||
* netdev_all_lower_get_next - Get the next device from all lower neighbour list
|
||||
* @dev: device
|
||||
* @iter: list_head ** of the current position
|
||||
*
|
||||
* Gets the next netdev_adjacent from the dev's all lower neighbour
|
||||
* list, starting from iter position. The caller must hold RTNL lock or
|
||||
* its own locking that guarantees that the neighbour all lower
|
||||
* list will remain unchanged.
|
||||
*/
|
||||
struct net_device *netdev_all_lower_get_next(struct net_device *dev, struct list_head **iter)
|
||||
{
|
||||
struct netdev_adjacent *lower;
|
||||
|
||||
lower = list_entry(*iter, struct netdev_adjacent, list);
|
||||
|
||||
if (&lower->list == &dev->all_adj_list.lower)
|
||||
return NULL;
|
||||
|
||||
*iter = lower->list.next;
|
||||
|
||||
return lower->dev;
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_all_lower_get_next);
|
||||
|
||||
/**
|
||||
* netdev_all_lower_get_next_rcu - Get the next device from all
|
||||
* lower neighbour list, RCU variant
|
||||
* @dev: device
|
||||
* @iter: list_head ** of the current position
|
||||
*
|
||||
* Gets the next netdev_adjacent from the dev's all lower neighbour
|
||||
* list, starting from iter position. The caller must hold RCU read lock.
|
||||
*/
|
||||
struct net_device *netdev_all_lower_get_next_rcu(struct net_device *dev,
|
||||
struct list_head **iter)
|
||||
{
|
||||
struct netdev_adjacent *lower;
|
||||
|
||||
lower = list_first_or_null_rcu(&dev->all_adj_list.lower,
|
||||
struct netdev_adjacent, list);
|
||||
|
||||
return lower ? lower->dev : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_all_lower_get_next_rcu);
|
||||
|
||||
/**
|
||||
* netdev_lower_get_first_private_rcu - Get the first ->private from the
|
||||
* lower neighbour list, RCU
|
||||
|
||||
Reference in New Issue
Block a user