| .. | .. |
|---|
| 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 | * |
|---|