diff options
Diffstat (limited to 'include/linux/rhashtable.h')
-rw-r--r-- | include/linux/rhashtable.h | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h index 9cda293c867d..36826c0166c5 100644 --- a/include/linux/rhashtable.h +++ b/include/linux/rhashtable.h | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/rculist.h> | 21 | #include <linux/rculist.h> |
22 | 22 | ||
23 | struct rhash_head { | 23 | struct rhash_head { |
24 | struct rhash_head *next; | 24 | struct rhash_head __rcu *next; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | #define INIT_HASH_HEAD(ptr) ((ptr)->next = NULL) | 27 | #define INIT_HASH_HEAD(ptr) ((ptr)->next = NULL) |
@@ -97,7 +97,7 @@ u32 rhashtable_obj_hashfn(const struct rhashtable *ht, void *ptr); | |||
97 | void rhashtable_insert(struct rhashtable *ht, struct rhash_head *node, gfp_t); | 97 | void rhashtable_insert(struct rhashtable *ht, struct rhash_head *node, gfp_t); |
98 | bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *node, gfp_t); | 98 | bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *node, gfp_t); |
99 | void rhashtable_remove_pprev(struct rhashtable *ht, struct rhash_head *obj, | 99 | void rhashtable_remove_pprev(struct rhashtable *ht, struct rhash_head *obj, |
100 | struct rhash_head **pprev, gfp_t flags); | 100 | struct rhash_head __rcu **pprev, gfp_t flags); |
101 | 101 | ||
102 | bool rht_grow_above_75(const struct rhashtable *ht, size_t new_size); | 102 | bool rht_grow_above_75(const struct rhashtable *ht, size_t new_size); |
103 | bool rht_shrink_below_30(const struct rhashtable *ht, size_t new_size); | 103 | bool rht_shrink_below_30(const struct rhashtable *ht, size_t new_size); |
@@ -117,18 +117,12 @@ void rhashtable_destroy(const struct rhashtable *ht); | |||
117 | #define rht_dereference_rcu(p, ht) \ | 117 | #define rht_dereference_rcu(p, ht) \ |
118 | rcu_dereference_check(p, lockdep_rht_mutex_is_held(ht)) | 118 | rcu_dereference_check(p, lockdep_rht_mutex_is_held(ht)) |
119 | 119 | ||
120 | /* Internal, use rht_obj() instead */ | ||
121 | #define rht_entry(ptr, type, member) container_of(ptr, type, member) | 120 | #define rht_entry(ptr, type, member) container_of(ptr, type, member) |
122 | #define rht_entry_safe(ptr, type, member) \ | 121 | #define rht_entry_safe(ptr, type, member) \ |
123 | ({ \ | 122 | ({ \ |
124 | typeof(ptr) __ptr = (ptr); \ | 123 | typeof(ptr) __ptr = (ptr); \ |
125 | __ptr ? rht_entry(__ptr, type, member) : NULL; \ | 124 | __ptr ? rht_entry(__ptr, type, member) : NULL; \ |
126 | }) | 125 | }) |
127 | #define rht_entry_safe_rcu(ptr, type, member) \ | ||
128 | ({ \ | ||
129 | typeof(*ptr) __rcu *__ptr = (typeof(*ptr) __rcu __force *)ptr; \ | ||
130 | __ptr ? container_of((typeof(ptr))rcu_dereference_raw(__ptr), type, member) : NULL; \ | ||
131 | }) | ||
132 | 126 | ||
133 | #define rht_next_entry_safe(pos, ht, member) \ | 127 | #define rht_next_entry_safe(pos, ht, member) \ |
134 | ({ \ | 128 | ({ \ |
@@ -205,9 +199,10 @@ void rhashtable_destroy(const struct rhashtable *ht); | |||
205 | * traversal is guarded by rcu_read_lock(). | 199 | * traversal is guarded by rcu_read_lock(). |
206 | */ | 200 | */ |
207 | #define rht_for_each_entry_rcu(pos, head, member) \ | 201 | #define rht_for_each_entry_rcu(pos, head, member) \ |
208 | for (pos = rht_entry_safe_rcu(head, typeof(*(pos)), member); \ | 202 | for (pos = rht_entry_safe(rcu_dereference_raw(head), \ |
203 | typeof(*(pos)), member); \ | ||
209 | pos; \ | 204 | pos; \ |
210 | pos = rht_entry_safe_rcu((pos)->member.next, \ | 205 | pos = rht_entry_safe(rcu_dereference_raw((pos)->member.next), \ |
211 | typeof(*(pos)), member)) | 206 | typeof(*(pos)), member)) |
212 | 207 | ||
213 | #endif /* _LINUX_RHASHTABLE_H */ | 208 | #endif /* _LINUX_RHASHTABLE_H */ |