.. | .. |
---|
25 | 25 | } |
---|
26 | 26 | |
---|
27 | 27 | /** |
---|
28 | | - * hlist_bl_del_init_rcu - deletes entry from hash list with re-initialization |
---|
29 | | - * @n: the element to delete from the hash list. |
---|
30 | | - * |
---|
31 | | - * Note: hlist_bl_unhashed() on the node returns true after this. It is |
---|
32 | | - * useful for RCU based read lockfree traversal if the writer side |
---|
33 | | - * must know if the list entry is still hashed or already unhashed. |
---|
34 | | - * |
---|
35 | | - * In particular, it means that we can not poison the forward pointers |
---|
36 | | - * that may still be used for walking the hash list and we can only |
---|
37 | | - * zero the pprev pointer so list_unhashed() will return true after |
---|
38 | | - * this. |
---|
39 | | - * |
---|
40 | | - * The caller must take whatever precautions are necessary (such as |
---|
41 | | - * holding appropriate locks) to avoid racing with another |
---|
42 | | - * list-mutation primitive, such as hlist_bl_add_head_rcu() or |
---|
43 | | - * hlist_bl_del_rcu(), running on this same list. However, it is |
---|
44 | | - * perfectly legal to run concurrently with the _rcu list-traversal |
---|
45 | | - * primitives, such as hlist_bl_for_each_entry_rcu(). |
---|
46 | | - */ |
---|
47 | | -static inline void hlist_bl_del_init_rcu(struct hlist_bl_node *n) |
---|
48 | | -{ |
---|
49 | | - if (!hlist_bl_unhashed(n)) { |
---|
50 | | - __hlist_bl_del(n); |
---|
51 | | - n->pprev = NULL; |
---|
52 | | - } |
---|
53 | | -} |
---|
54 | | - |
---|
55 | | -/** |
---|
56 | 28 | * hlist_bl_del_rcu - deletes entry from hash list without re-initialization |
---|
57 | 29 | * @n: the element to delete from the hash list. |
---|
58 | 30 | * |
---|