diff options
Diffstat (limited to 'include/linux/rculist.h')
-rw-r--r-- | include/linux/rculist.h | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 5710f43bbc9e..2c9b46cff3d7 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
@@ -208,7 +208,7 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
208 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). | 208 | * primitives such as list_add_rcu() as long as it's guarded by rcu_read_lock(). |
209 | */ | 209 | */ |
210 | #define list_entry_rcu(ptr, type, member) \ | 210 | #define list_entry_rcu(ptr, type, member) \ |
211 | container_of(rcu_dereference(ptr), type, member) | 211 | container_of(rcu_dereference_raw(ptr), type, member) |
212 | 212 | ||
213 | /** | 213 | /** |
214 | * list_first_entry_rcu - get the first element from a list | 214 | * list_first_entry_rcu - get the first element from a list |
@@ -225,9 +225,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
225 | list_entry_rcu((ptr)->next, type, member) | 225 | list_entry_rcu((ptr)->next, type, member) |
226 | 226 | ||
227 | #define __list_for_each_rcu(pos, head) \ | 227 | #define __list_for_each_rcu(pos, head) \ |
228 | for (pos = rcu_dereference((head)->next); \ | 228 | for (pos = rcu_dereference_raw((head)->next); \ |
229 | pos != (head); \ | 229 | pos != (head); \ |
230 | pos = rcu_dereference(pos->next)) | 230 | pos = rcu_dereference_raw(pos->next)) |
231 | 231 | ||
232 | /** | 232 | /** |
233 | * list_for_each_entry_rcu - iterate over rcu list of given type | 233 | * list_for_each_entry_rcu - iterate over rcu list of given type |
@@ -257,9 +257,23 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
257 | * as long as the traversal is guarded by rcu_read_lock(). | 257 | * as long as the traversal is guarded by rcu_read_lock(). |
258 | */ | 258 | */ |
259 | #define list_for_each_continue_rcu(pos, head) \ | 259 | #define list_for_each_continue_rcu(pos, head) \ |
260 | for ((pos) = rcu_dereference((pos)->next); \ | 260 | for ((pos) = rcu_dereference_raw((pos)->next); \ |
261 | prefetch((pos)->next), (pos) != (head); \ | 261 | prefetch((pos)->next), (pos) != (head); \ |
262 | (pos) = rcu_dereference((pos)->next)) | 262 | (pos) = rcu_dereference_raw((pos)->next)) |
263 | |||
264 | /** | ||
265 | * list_for_each_entry_continue_rcu - continue iteration over list of given type | ||
266 | * @pos: the type * to use as a loop cursor. | ||
267 | * @head: the head for your list. | ||
268 | * @member: the name of the list_struct within the struct. | ||
269 | * | ||
270 | * Continue to iterate over list of given type, continuing after | ||
271 | * the current position. | ||
272 | */ | ||
273 | #define list_for_each_entry_continue_rcu(pos, head, member) \ | ||
274 | for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \ | ||
275 | prefetch(pos->member.next), &pos->member != (head); \ | ||
276 | pos = list_entry_rcu(pos->member.next, typeof(*pos), member)) | ||
263 | 277 | ||
264 | /** | 278 | /** |
265 | * hlist_del_rcu - deletes entry from hash list without re-initialization | 279 | * hlist_del_rcu - deletes entry from hash list without re-initialization |
@@ -392,6 +406,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
392 | n->next->pprev = &n->next; | 406 | n->next->pprev = &n->next; |
393 | } | 407 | } |
394 | 408 | ||
409 | #define __hlist_for_each_rcu(pos, head) \ | ||
410 | for (pos = rcu_dereference((head)->first); \ | ||
411 | pos && ({ prefetch(pos->next); 1; }); \ | ||
412 | pos = rcu_dereference(pos->next)) | ||
413 | |||
395 | /** | 414 | /** |
396 | * hlist_for_each_entry_rcu - iterate over rcu list of given type | 415 | * hlist_for_each_entry_rcu - iterate over rcu list of given type |
397 | * @tpos: the type * to use as a loop cursor. | 416 | * @tpos: the type * to use as a loop cursor. |
@@ -404,10 +423,10 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
404 | * as long as the traversal is guarded by rcu_read_lock(). | 423 | * as long as the traversal is guarded by rcu_read_lock(). |
405 | */ | 424 | */ |
406 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ | 425 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ |
407 | for (pos = rcu_dereference((head)->first); \ | 426 | for (pos = rcu_dereference_raw((head)->first); \ |
408 | pos && ({ prefetch(pos->next); 1; }) && \ | 427 | pos && ({ prefetch(pos->next); 1; }) && \ |
409 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ | 428 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \ |
410 | pos = rcu_dereference(pos->next)) | 429 | pos = rcu_dereference_raw(pos->next)) |
411 | 430 | ||
412 | #endif /* __KERNEL__ */ | 431 | #endif /* __KERNEL__ */ |
413 | #endif | 432 | #endif |