netdev: add netdev_continue_rcu
This adds an RCU macro for continuing search, useful for some network devices like vlan. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
856540ee31
commit
254245d233
|
@ -1079,6 +1079,8 @@ extern rwlock_t dev_base_lock; /* Device list lock */
|
||||||
list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list)
|
list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list)
|
||||||
#define for_each_netdev_continue(net, d) \
|
#define for_each_netdev_continue(net, d) \
|
||||||
list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)
|
list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)
|
||||||
|
#define for_each_netdev_continue_rcu(net, d) \
|
||||||
|
list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list)
|
||||||
#define net_device_entry(lh) list_entry(lh, struct net_device, dev_list)
|
#define net_device_entry(lh) list_entry(lh, struct net_device, dev_list)
|
||||||
|
|
||||||
static inline struct net_device *next_net_device(struct net_device *dev)
|
static inline struct net_device *next_net_device(struct net_device *dev)
|
||||||
|
|
|
@ -261,6 +261,20 @@ static inline void list_splice_init_rcu(struct list_head *list,
|
||||||
prefetch((pos)->next), (pos) != (head); \
|
prefetch((pos)->next), (pos) != (head); \
|
||||||
(pos) = rcu_dereference((pos)->next))
|
(pos) = rcu_dereference((pos)->next))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* list_for_each_entry_continue_rcu - continue iteration over list of given type
|
||||||
|
* @pos: the type * to use as a loop cursor.
|
||||||
|
* @head: the head for your list.
|
||||||
|
* @member: the name of the list_struct within the struct.
|
||||||
|
*
|
||||||
|
* Continue to iterate over list of given type, continuing after
|
||||||
|
* the current position.
|
||||||
|
*/
|
||||||
|
#define list_for_each_entry_continue_rcu(pos, head, member) \
|
||||||
|
for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \
|
||||||
|
prefetch(pos->member.next), &pos->member != (head); \
|
||||||
|
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hlist_del_rcu - deletes entry from hash list without re-initialization
|
* hlist_del_rcu - deletes entry from hash list without re-initialization
|
||||||
* @n: the element to delete from the hash list.
|
* @n: the element to delete from the hash list.
|
||||||
|
|
Loading…
Reference in New Issue