diff options
Diffstat (limited to 'include/linux/rculist.h')
| -rw-r--r-- | include/linux/rculist.h | 73 | 
1 files changed, 28 insertions, 45 deletions
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index e0f0fab2041..8089e35d47a 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -286,23 +286,6 @@ static inline void list_splice_init_rcu(struct list_head *list,  		&pos->member != (head); \  		pos = list_entry_rcu(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_continue_rcu - * @pos:	the &struct list_head to use as a loop cursor. - * @head:	the head for your list. - * - * Iterate over an rcu-protected list, continuing after current point. - * - * This list-traversal primitive may safely run concurrently with - * the _rcu list-mutation primitives such as list_add_rcu() - * as long as the traversal is guarded by rcu_read_lock(). - */ -#define list_for_each_continue_rcu(pos, head) \ -	for ((pos) = rcu_dereference_raw(list_next_rcu(pos)); \ -		(pos) != (head); \ -		(pos) = rcu_dereference_raw(list_next_rcu(pos))) -  /**   * list_for_each_entry_continue_rcu - continue iteration over list of given type   * @pos:	the type * to use as a loop cursor. @@ -462,8 +445,7 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,  /**   * hlist_for_each_entry_rcu - iterate over rcu list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   * @@ -471,16 +453,16 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,   * the _rcu list-mutation primitives such as hlist_add_head_rcu()   * as long as the traversal is guarded by rcu_read_lock().   */ -#define hlist_for_each_entry_rcu(tpos, pos, head, member)		\ -	for (pos = rcu_dereference_raw(hlist_first_rcu(head));		\ -		pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference_raw(hlist_next_rcu(pos))) +#define hlist_for_each_entry_rcu(pos, head, member)			\ +	for (pos = hlist_entry_safe (rcu_dereference_raw(hlist_first_rcu(head)),\ +			typeof(*(pos)), member);			\ +		pos;							\ +		pos = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(\ +			&(pos)->member)), typeof(*(pos)), member))  /**   * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   * @@ -488,35 +470,36 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,   * the _rcu list-mutation primitives such as hlist_add_head_rcu()   * as long as the traversal is guarded by rcu_read_lock().   */ -#define hlist_for_each_entry_rcu_bh(tpos, pos, head, member)		 \ -	for (pos = rcu_dereference_bh((head)->first);			 \ -		pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ -		pos = rcu_dereference_bh(pos->next)) +#define hlist_for_each_entry_rcu_bh(pos, head, member)			\ +	for (pos = hlist_entry_safe(rcu_dereference_bh(hlist_first_rcu(head)),\ +			typeof(*(pos)), member);			\ +		pos;							\ +		pos = hlist_entry_safe(rcu_dereference_bh(hlist_next_rcu(\ +			&(pos)->member)), typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue_rcu - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue_rcu(tpos, pos, member)		\ -	for (pos = rcu_dereference((pos)->next);			\ -	     pos &&							\ -	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ -	     pos = rcu_dereference(pos->next)) +#define hlist_for_each_entry_continue_rcu(pos, member)			\ +	for (pos = hlist_entry_safe(rcu_dereference((pos)->member.next),\ +			typeof(*(pos)), member);			\ +	     pos;							\ +	     pos = hlist_entry_safe(rcu_dereference((pos)->member.next),\ +			typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue_rcu_bh - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue_rcu_bh(tpos, pos, member)		\ -	for (pos = rcu_dereference_bh((pos)->next);			\ -	     pos &&							\ -	     ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });  \ -	     pos = rcu_dereference_bh(pos->next)) +#define hlist_for_each_entry_continue_rcu_bh(pos, member)		\ +	for (pos = hlist_entry_safe(rcu_dereference_bh((pos)->member.next),\ +			typeof(*(pos)), member);			\ +	     pos;							\ +	     pos = hlist_entry_safe(rcu_dereference_bh((pos)->member.next),\ +			typeof(*(pos)), member))  #endif	/* __KERNEL__ */  |