1*a71a9546SAutomerger Merge Worker #ifndef _LINUX_LIST_H
2*a71a9546SAutomerger Merge Worker #define _LINUX_LIST_H
3*a71a9546SAutomerger Merge Worker
4*a71a9546SAutomerger Merge Worker #undef offsetof
5*a71a9546SAutomerger Merge Worker #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
6*a71a9546SAutomerger Merge Worker
7*a71a9546SAutomerger Merge Worker /**
8*a71a9546SAutomerger Merge Worker * container_of - cast a member of a structure out to the containing structure
9*a71a9546SAutomerger Merge Worker *
10*a71a9546SAutomerger Merge Worker * @ptr: the pointer to the member.
11*a71a9546SAutomerger Merge Worker * @type: the type of the container struct this is embedded in.
12*a71a9546SAutomerger Merge Worker * @member: the name of the member within the struct.
13*a71a9546SAutomerger Merge Worker *
14*a71a9546SAutomerger Merge Worker */
15*a71a9546SAutomerger Merge Worker #define container_of(ptr, type, member) ({ \
16*a71a9546SAutomerger Merge Worker const typeof( ((type *)0)->member ) *__mptr = (ptr); \
17*a71a9546SAutomerger Merge Worker (type *)( (char *)__mptr - offsetof(type,member) );})
18*a71a9546SAutomerger Merge Worker
19*a71a9546SAutomerger Merge Worker /*
20*a71a9546SAutomerger Merge Worker * Check at compile time that something is of a particular type.
21*a71a9546SAutomerger Merge Worker * Always evaluates to 1 so you may use it easily in comparisons.
22*a71a9546SAutomerger Merge Worker */
23*a71a9546SAutomerger Merge Worker #define typecheck(type,x) \
24*a71a9546SAutomerger Merge Worker ({ type __dummy; \
25*a71a9546SAutomerger Merge Worker typeof(x) __dummy2; \
26*a71a9546SAutomerger Merge Worker (void)(&__dummy == &__dummy2); \
27*a71a9546SAutomerger Merge Worker 1; \
28*a71a9546SAutomerger Merge Worker })
29*a71a9546SAutomerger Merge Worker
30*a71a9546SAutomerger Merge Worker #define prefetch(x) ((void)0)
31*a71a9546SAutomerger Merge Worker
32*a71a9546SAutomerger Merge Worker /* empty define to make this work in userspace -HW */
33*a71a9546SAutomerger Merge Worker #define smp_wmb()
34*a71a9546SAutomerger Merge Worker
35*a71a9546SAutomerger Merge Worker /*
36*a71a9546SAutomerger Merge Worker * These are non-NULL pointers that will result in page faults
37*a71a9546SAutomerger Merge Worker * under normal circumstances, used to verify that nobody uses
38*a71a9546SAutomerger Merge Worker * non-initialized list entries.
39*a71a9546SAutomerger Merge Worker */
40*a71a9546SAutomerger Merge Worker #define LIST_POISON1 ((void *) 0x00100100)
41*a71a9546SAutomerger Merge Worker #define LIST_POISON2 ((void *) 0x00200200)
42*a71a9546SAutomerger Merge Worker
43*a71a9546SAutomerger Merge Worker /*
44*a71a9546SAutomerger Merge Worker * Simple doubly linked list implementation.
45*a71a9546SAutomerger Merge Worker *
46*a71a9546SAutomerger Merge Worker * Some of the internal functions ("__xxx") are useful when
47*a71a9546SAutomerger Merge Worker * manipulating whole lists rather than single entries, as
48*a71a9546SAutomerger Merge Worker * sometimes we already know the next/prev entries and we can
49*a71a9546SAutomerger Merge Worker * generate better code by using them directly rather than
50*a71a9546SAutomerger Merge Worker * using the generic single-entry routines.
51*a71a9546SAutomerger Merge Worker */
52*a71a9546SAutomerger Merge Worker
53*a71a9546SAutomerger Merge Worker struct list_head {
54*a71a9546SAutomerger Merge Worker struct list_head *next, *prev;
55*a71a9546SAutomerger Merge Worker };
56*a71a9546SAutomerger Merge Worker
57*a71a9546SAutomerger Merge Worker #define LIST_HEAD_INIT(name) { &(name), &(name) }
58*a71a9546SAutomerger Merge Worker
59*a71a9546SAutomerger Merge Worker #define LIST_HEAD(name) \
60*a71a9546SAutomerger Merge Worker struct list_head name = LIST_HEAD_INIT(name)
61*a71a9546SAutomerger Merge Worker
62*a71a9546SAutomerger Merge Worker #define INIT_LIST_HEAD(ptr) do { \
63*a71a9546SAutomerger Merge Worker (ptr)->next = (ptr); (ptr)->prev = (ptr); \
64*a71a9546SAutomerger Merge Worker } while (0)
65*a71a9546SAutomerger Merge Worker
66*a71a9546SAutomerger Merge Worker /*
67*a71a9546SAutomerger Merge Worker * Insert a new entry between two known consecutive entries.
68*a71a9546SAutomerger Merge Worker *
69*a71a9546SAutomerger Merge Worker * This is only for internal list manipulation where we know
70*a71a9546SAutomerger Merge Worker * the prev/next entries already!
71*a71a9546SAutomerger Merge Worker */
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)72*a71a9546SAutomerger Merge Worker static inline void __list_add(struct list_head *new,
73*a71a9546SAutomerger Merge Worker struct list_head *prev,
74*a71a9546SAutomerger Merge Worker struct list_head *next)
75*a71a9546SAutomerger Merge Worker {
76*a71a9546SAutomerger Merge Worker next->prev = new;
77*a71a9546SAutomerger Merge Worker new->next = next;
78*a71a9546SAutomerger Merge Worker new->prev = prev;
79*a71a9546SAutomerger Merge Worker prev->next = new;
80*a71a9546SAutomerger Merge Worker }
81*a71a9546SAutomerger Merge Worker
82*a71a9546SAutomerger Merge Worker /**
83*a71a9546SAutomerger Merge Worker * list_add - add a new entry
84*a71a9546SAutomerger Merge Worker * @new: new entry to be added
85*a71a9546SAutomerger Merge Worker * @head: list head to add it after
86*a71a9546SAutomerger Merge Worker *
87*a71a9546SAutomerger Merge Worker * Insert a new entry after the specified head.
88*a71a9546SAutomerger Merge Worker * This is good for implementing stacks.
89*a71a9546SAutomerger Merge Worker */
list_add(struct list_head * new,struct list_head * head)90*a71a9546SAutomerger Merge Worker static inline void list_add(struct list_head *new, struct list_head *head)
91*a71a9546SAutomerger Merge Worker {
92*a71a9546SAutomerger Merge Worker __list_add(new, head, head->next);
93*a71a9546SAutomerger Merge Worker }
94*a71a9546SAutomerger Merge Worker
95*a71a9546SAutomerger Merge Worker /**
96*a71a9546SAutomerger Merge Worker * list_add_tail - add a new entry
97*a71a9546SAutomerger Merge Worker * @new: new entry to be added
98*a71a9546SAutomerger Merge Worker * @head: list head to add it before
99*a71a9546SAutomerger Merge Worker *
100*a71a9546SAutomerger Merge Worker * Insert a new entry before the specified head.
101*a71a9546SAutomerger Merge Worker * This is useful for implementing queues.
102*a71a9546SAutomerger Merge Worker */
list_add_tail(struct list_head * new,struct list_head * head)103*a71a9546SAutomerger Merge Worker static inline void list_add_tail(struct list_head *new, struct list_head *head)
104*a71a9546SAutomerger Merge Worker {
105*a71a9546SAutomerger Merge Worker __list_add(new, head->prev, head);
106*a71a9546SAutomerger Merge Worker }
107*a71a9546SAutomerger Merge Worker
108*a71a9546SAutomerger Merge Worker /*
109*a71a9546SAutomerger Merge Worker * Insert a new entry between two known consecutive entries.
110*a71a9546SAutomerger Merge Worker *
111*a71a9546SAutomerger Merge Worker * This is only for internal list manipulation where we know
112*a71a9546SAutomerger Merge Worker * the prev/next entries already!
113*a71a9546SAutomerger Merge Worker */
__list_add_rcu(struct list_head * new,struct list_head * prev,struct list_head * next)114*a71a9546SAutomerger Merge Worker static inline void __list_add_rcu(struct list_head * new,
115*a71a9546SAutomerger Merge Worker struct list_head * prev, struct list_head * next)
116*a71a9546SAutomerger Merge Worker {
117*a71a9546SAutomerger Merge Worker new->next = next;
118*a71a9546SAutomerger Merge Worker new->prev = prev;
119*a71a9546SAutomerger Merge Worker smp_wmb();
120*a71a9546SAutomerger Merge Worker next->prev = new;
121*a71a9546SAutomerger Merge Worker prev->next = new;
122*a71a9546SAutomerger Merge Worker }
123*a71a9546SAutomerger Merge Worker
124*a71a9546SAutomerger Merge Worker /**
125*a71a9546SAutomerger Merge Worker * list_add_rcu - add a new entry to rcu-protected list
126*a71a9546SAutomerger Merge Worker * @new: new entry to be added
127*a71a9546SAutomerger Merge Worker * @head: list head to add it after
128*a71a9546SAutomerger Merge Worker *
129*a71a9546SAutomerger Merge Worker * Insert a new entry after the specified head.
130*a71a9546SAutomerger Merge Worker * This is good for implementing stacks.
131*a71a9546SAutomerger Merge Worker *
132*a71a9546SAutomerger Merge Worker * The caller must take whatever precautions are necessary
133*a71a9546SAutomerger Merge Worker * (such as holding appropriate locks) to avoid racing
134*a71a9546SAutomerger Merge Worker * with another list-mutation primitive, such as list_add_rcu()
135*a71a9546SAutomerger Merge Worker * or list_del_rcu(), running on this same list.
136*a71a9546SAutomerger Merge Worker * However, it is perfectly legal to run concurrently with
137*a71a9546SAutomerger Merge Worker * the _rcu list-traversal primitives, such as
138*a71a9546SAutomerger Merge Worker * list_for_each_entry_rcu().
139*a71a9546SAutomerger Merge Worker */
list_add_rcu(struct list_head * new,struct list_head * head)140*a71a9546SAutomerger Merge Worker static inline void list_add_rcu(struct list_head *new, struct list_head *head)
141*a71a9546SAutomerger Merge Worker {
142*a71a9546SAutomerger Merge Worker __list_add_rcu(new, head, head->next);
143*a71a9546SAutomerger Merge Worker }
144*a71a9546SAutomerger Merge Worker
145*a71a9546SAutomerger Merge Worker /**
146*a71a9546SAutomerger Merge Worker * list_add_tail_rcu - add a new entry to rcu-protected list
147*a71a9546SAutomerger Merge Worker * @new: new entry to be added
148*a71a9546SAutomerger Merge Worker * @head: list head to add it before
149*a71a9546SAutomerger Merge Worker *
150*a71a9546SAutomerger Merge Worker * Insert a new entry before the specified head.
151*a71a9546SAutomerger Merge Worker * This is useful for implementing queues.
152*a71a9546SAutomerger Merge Worker *
153*a71a9546SAutomerger Merge Worker * The caller must take whatever precautions are necessary
154*a71a9546SAutomerger Merge Worker * (such as holding appropriate locks) to avoid racing
155*a71a9546SAutomerger Merge Worker * with another list-mutation primitive, such as list_add_tail_rcu()
156*a71a9546SAutomerger Merge Worker * or list_del_rcu(), running on this same list.
157*a71a9546SAutomerger Merge Worker * However, it is perfectly legal to run concurrently with
158*a71a9546SAutomerger Merge Worker * the _rcu list-traversal primitives, such as
159*a71a9546SAutomerger Merge Worker * list_for_each_entry_rcu().
160*a71a9546SAutomerger Merge Worker */
list_add_tail_rcu(struct list_head * new,struct list_head * head)161*a71a9546SAutomerger Merge Worker static inline void list_add_tail_rcu(struct list_head *new,
162*a71a9546SAutomerger Merge Worker struct list_head *head)
163*a71a9546SAutomerger Merge Worker {
164*a71a9546SAutomerger Merge Worker __list_add_rcu(new, head->prev, head);
165*a71a9546SAutomerger Merge Worker }
166*a71a9546SAutomerger Merge Worker
167*a71a9546SAutomerger Merge Worker /*
168*a71a9546SAutomerger Merge Worker * Delete a list entry by making the prev/next entries
169*a71a9546SAutomerger Merge Worker * point to each other.
170*a71a9546SAutomerger Merge Worker *
171*a71a9546SAutomerger Merge Worker * This is only for internal list manipulation where we know
172*a71a9546SAutomerger Merge Worker * the prev/next entries already!
173*a71a9546SAutomerger Merge Worker */
__list_del(struct list_head * prev,struct list_head * next)174*a71a9546SAutomerger Merge Worker static inline void __list_del(struct list_head * prev, struct list_head * next)
175*a71a9546SAutomerger Merge Worker {
176*a71a9546SAutomerger Merge Worker next->prev = prev;
177*a71a9546SAutomerger Merge Worker prev->next = next;
178*a71a9546SAutomerger Merge Worker }
179*a71a9546SAutomerger Merge Worker
180*a71a9546SAutomerger Merge Worker /**
181*a71a9546SAutomerger Merge Worker * list_del - deletes entry from list.
182*a71a9546SAutomerger Merge Worker * @entry: the element to delete from the list.
183*a71a9546SAutomerger Merge Worker * Note: list_empty on entry does not return true after this, the entry is
184*a71a9546SAutomerger Merge Worker * in an undefined state.
185*a71a9546SAutomerger Merge Worker */
list_del(struct list_head * entry)186*a71a9546SAutomerger Merge Worker static inline void list_del(struct list_head *entry)
187*a71a9546SAutomerger Merge Worker {
188*a71a9546SAutomerger Merge Worker __list_del(entry->prev, entry->next);
189*a71a9546SAutomerger Merge Worker entry->next = LIST_POISON1;
190*a71a9546SAutomerger Merge Worker entry->prev = LIST_POISON2;
191*a71a9546SAutomerger Merge Worker }
192*a71a9546SAutomerger Merge Worker
193*a71a9546SAutomerger Merge Worker /**
194*a71a9546SAutomerger Merge Worker * list_del_rcu - deletes entry from list without re-initialization
195*a71a9546SAutomerger Merge Worker * @entry: the element to delete from the list.
196*a71a9546SAutomerger Merge Worker *
197*a71a9546SAutomerger Merge Worker * Note: list_empty on entry does not return true after this,
198*a71a9546SAutomerger Merge Worker * the entry is in an undefined state. It is useful for RCU based
199*a71a9546SAutomerger Merge Worker * lockfree traversal.
200*a71a9546SAutomerger Merge Worker *
201*a71a9546SAutomerger Merge Worker * In particular, it means that we can not poison the forward
202*a71a9546SAutomerger Merge Worker * pointers that may still be used for walking the list.
203*a71a9546SAutomerger Merge Worker *
204*a71a9546SAutomerger Merge Worker * The caller must take whatever precautions are necessary
205*a71a9546SAutomerger Merge Worker * (such as holding appropriate locks) to avoid racing
206*a71a9546SAutomerger Merge Worker * with another list-mutation primitive, such as list_del_rcu()
207*a71a9546SAutomerger Merge Worker * or list_add_rcu(), running on this same list.
208*a71a9546SAutomerger Merge Worker * However, it is perfectly legal to run concurrently with
209*a71a9546SAutomerger Merge Worker * the _rcu list-traversal primitives, such as
210*a71a9546SAutomerger Merge Worker * list_for_each_entry_rcu().
211*a71a9546SAutomerger Merge Worker *
212*a71a9546SAutomerger Merge Worker * Note that the caller is not permitted to immediately free
213*a71a9546SAutomerger Merge Worker * the newly deleted entry. Instead, either synchronize_kernel()
214*a71a9546SAutomerger Merge Worker * or call_rcu() must be used to defer freeing until an RCU
215*a71a9546SAutomerger Merge Worker * grace period has elapsed.
216*a71a9546SAutomerger Merge Worker */
list_del_rcu(struct list_head * entry)217*a71a9546SAutomerger Merge Worker static inline void list_del_rcu(struct list_head *entry)
218*a71a9546SAutomerger Merge Worker {
219*a71a9546SAutomerger Merge Worker __list_del(entry->prev, entry->next);
220*a71a9546SAutomerger Merge Worker entry->prev = LIST_POISON2;
221*a71a9546SAutomerger Merge Worker }
222*a71a9546SAutomerger Merge Worker
223*a71a9546SAutomerger Merge Worker /**
224*a71a9546SAutomerger Merge Worker * list_del_init - deletes entry from list and reinitialize it.
225*a71a9546SAutomerger Merge Worker * @entry: the element to delete from the list.
226*a71a9546SAutomerger Merge Worker */
list_del_init(struct list_head * entry)227*a71a9546SAutomerger Merge Worker static inline void list_del_init(struct list_head *entry)
228*a71a9546SAutomerger Merge Worker {
229*a71a9546SAutomerger Merge Worker __list_del(entry->prev, entry->next);
230*a71a9546SAutomerger Merge Worker INIT_LIST_HEAD(entry);
231*a71a9546SAutomerger Merge Worker }
232*a71a9546SAutomerger Merge Worker
233*a71a9546SAutomerger Merge Worker /**
234*a71a9546SAutomerger Merge Worker * list_move - delete from one list and add as another's head
235*a71a9546SAutomerger Merge Worker * @list: the entry to move
236*a71a9546SAutomerger Merge Worker * @head: the head that will precede our entry
237*a71a9546SAutomerger Merge Worker */
list_move(struct list_head * list,struct list_head * head)238*a71a9546SAutomerger Merge Worker static inline void list_move(struct list_head *list, struct list_head *head)
239*a71a9546SAutomerger Merge Worker {
240*a71a9546SAutomerger Merge Worker __list_del(list->prev, list->next);
241*a71a9546SAutomerger Merge Worker list_add(list, head);
242*a71a9546SAutomerger Merge Worker }
243*a71a9546SAutomerger Merge Worker
244*a71a9546SAutomerger Merge Worker /**
245*a71a9546SAutomerger Merge Worker * list_move_tail - delete from one list and add as another's tail
246*a71a9546SAutomerger Merge Worker * @list: the entry to move
247*a71a9546SAutomerger Merge Worker * @head: the head that will follow our entry
248*a71a9546SAutomerger Merge Worker */
list_move_tail(struct list_head * list,struct list_head * head)249*a71a9546SAutomerger Merge Worker static inline void list_move_tail(struct list_head *list,
250*a71a9546SAutomerger Merge Worker struct list_head *head)
251*a71a9546SAutomerger Merge Worker {
252*a71a9546SAutomerger Merge Worker __list_del(list->prev, list->next);
253*a71a9546SAutomerger Merge Worker list_add_tail(list, head);
254*a71a9546SAutomerger Merge Worker }
255*a71a9546SAutomerger Merge Worker
256*a71a9546SAutomerger Merge Worker /**
257*a71a9546SAutomerger Merge Worker * list_empty - tests whether a list is empty
258*a71a9546SAutomerger Merge Worker * @head: the list to test.
259*a71a9546SAutomerger Merge Worker */
list_empty(const struct list_head * head)260*a71a9546SAutomerger Merge Worker static inline int list_empty(const struct list_head *head)
261*a71a9546SAutomerger Merge Worker {
262*a71a9546SAutomerger Merge Worker return head->next == head;
263*a71a9546SAutomerger Merge Worker }
264*a71a9546SAutomerger Merge Worker
265*a71a9546SAutomerger Merge Worker /**
266*a71a9546SAutomerger Merge Worker * list_empty_careful - tests whether a list is
267*a71a9546SAutomerger Merge Worker * empty _and_ checks that no other CPU might be
268*a71a9546SAutomerger Merge Worker * in the process of still modifying either member
269*a71a9546SAutomerger Merge Worker *
270*a71a9546SAutomerger Merge Worker * NOTE: using list_empty_careful() without synchronization
271*a71a9546SAutomerger Merge Worker * can only be safe if the only activity that can happen
272*a71a9546SAutomerger Merge Worker * to the list entry is list_del_init(). Eg. it cannot be used
273*a71a9546SAutomerger Merge Worker * if another CPU could re-list_add() it.
274*a71a9546SAutomerger Merge Worker *
275*a71a9546SAutomerger Merge Worker * @head: the list to test.
276*a71a9546SAutomerger Merge Worker */
list_empty_careful(const struct list_head * head)277*a71a9546SAutomerger Merge Worker static inline int list_empty_careful(const struct list_head *head)
278*a71a9546SAutomerger Merge Worker {
279*a71a9546SAutomerger Merge Worker struct list_head *next = head->next;
280*a71a9546SAutomerger Merge Worker return (next == head) && (next == head->prev);
281*a71a9546SAutomerger Merge Worker }
282*a71a9546SAutomerger Merge Worker
__list_splice(struct list_head * list,struct list_head * head)283*a71a9546SAutomerger Merge Worker static inline void __list_splice(struct list_head *list,
284*a71a9546SAutomerger Merge Worker struct list_head *head)
285*a71a9546SAutomerger Merge Worker {
286*a71a9546SAutomerger Merge Worker struct list_head *first = list->next;
287*a71a9546SAutomerger Merge Worker struct list_head *last = list->prev;
288*a71a9546SAutomerger Merge Worker struct list_head *at = head->next;
289*a71a9546SAutomerger Merge Worker
290*a71a9546SAutomerger Merge Worker first->prev = head;
291*a71a9546SAutomerger Merge Worker head->next = first;
292*a71a9546SAutomerger Merge Worker
293*a71a9546SAutomerger Merge Worker last->next = at;
294*a71a9546SAutomerger Merge Worker at->prev = last;
295*a71a9546SAutomerger Merge Worker }
296*a71a9546SAutomerger Merge Worker
297*a71a9546SAutomerger Merge Worker /**
298*a71a9546SAutomerger Merge Worker * list_splice - join two lists
299*a71a9546SAutomerger Merge Worker * @list: the new list to add.
300*a71a9546SAutomerger Merge Worker * @head: the place to add it in the first list.
301*a71a9546SAutomerger Merge Worker */
list_splice(struct list_head * list,struct list_head * head)302*a71a9546SAutomerger Merge Worker static inline void list_splice(struct list_head *list, struct list_head *head)
303*a71a9546SAutomerger Merge Worker {
304*a71a9546SAutomerger Merge Worker if (!list_empty(list))
305*a71a9546SAutomerger Merge Worker __list_splice(list, head);
306*a71a9546SAutomerger Merge Worker }
307*a71a9546SAutomerger Merge Worker
308*a71a9546SAutomerger Merge Worker /**
309*a71a9546SAutomerger Merge Worker * list_splice_init - join two lists and reinitialise the emptied list.
310*a71a9546SAutomerger Merge Worker * @list: the new list to add.
311*a71a9546SAutomerger Merge Worker * @head: the place to add it in the first list.
312*a71a9546SAutomerger Merge Worker *
313*a71a9546SAutomerger Merge Worker * The list at @list is reinitialised
314*a71a9546SAutomerger Merge Worker */
list_splice_init(struct list_head * list,struct list_head * head)315*a71a9546SAutomerger Merge Worker static inline void list_splice_init(struct list_head *list,
316*a71a9546SAutomerger Merge Worker struct list_head *head)
317*a71a9546SAutomerger Merge Worker {
318*a71a9546SAutomerger Merge Worker if (!list_empty(list)) {
319*a71a9546SAutomerger Merge Worker __list_splice(list, head);
320*a71a9546SAutomerger Merge Worker INIT_LIST_HEAD(list);
321*a71a9546SAutomerger Merge Worker }
322*a71a9546SAutomerger Merge Worker }
323*a71a9546SAutomerger Merge Worker
324*a71a9546SAutomerger Merge Worker /**
325*a71a9546SAutomerger Merge Worker * list_entry - get the struct for this entry
326*a71a9546SAutomerger Merge Worker * @ptr: the &struct list_head pointer.
327*a71a9546SAutomerger Merge Worker * @type: the type of the struct this is embedded in.
328*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
329*a71a9546SAutomerger Merge Worker */
330*a71a9546SAutomerger Merge Worker #define list_entry(ptr, type, member) \
331*a71a9546SAutomerger Merge Worker container_of(ptr, type, member)
332*a71a9546SAutomerger Merge Worker
333*a71a9546SAutomerger Merge Worker /**
334*a71a9546SAutomerger Merge Worker * list_for_each - iterate over a list
335*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
336*a71a9546SAutomerger Merge Worker * @head: the head for your list.
337*a71a9546SAutomerger Merge Worker */
338*a71a9546SAutomerger Merge Worker #define list_for_each(pos, head) \
339*a71a9546SAutomerger Merge Worker for (pos = (head)->next, prefetch(pos->next); pos != (head); \
340*a71a9546SAutomerger Merge Worker pos = pos->next, prefetch(pos->next))
341*a71a9546SAutomerger Merge Worker
342*a71a9546SAutomerger Merge Worker /**
343*a71a9546SAutomerger Merge Worker * __list_for_each - iterate over a list
344*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
345*a71a9546SAutomerger Merge Worker * @head: the head for your list.
346*a71a9546SAutomerger Merge Worker *
347*a71a9546SAutomerger Merge Worker * This variant differs from list_for_each() in that it's the
348*a71a9546SAutomerger Merge Worker * simplest possible list iteration code, no prefetching is done.
349*a71a9546SAutomerger Merge Worker * Use this for code that knows the list to be very short (empty
350*a71a9546SAutomerger Merge Worker * or 1 entry) most of the time.
351*a71a9546SAutomerger Merge Worker */
352*a71a9546SAutomerger Merge Worker #define __list_for_each(pos, head) \
353*a71a9546SAutomerger Merge Worker for (pos = (head)->next; pos != (head); pos = pos->next)
354*a71a9546SAutomerger Merge Worker
355*a71a9546SAutomerger Merge Worker /**
356*a71a9546SAutomerger Merge Worker * list_for_each_prev - iterate over a list backwards
357*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
358*a71a9546SAutomerger Merge Worker * @head: the head for your list.
359*a71a9546SAutomerger Merge Worker */
360*a71a9546SAutomerger Merge Worker #define list_for_each_prev(pos, head) \
361*a71a9546SAutomerger Merge Worker for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \
362*a71a9546SAutomerger Merge Worker pos = pos->prev, prefetch(pos->prev))
363*a71a9546SAutomerger Merge Worker
364*a71a9546SAutomerger Merge Worker /**
365*a71a9546SAutomerger Merge Worker * list_for_each_safe - iterate over a list safe against removal of list entry
366*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
367*a71a9546SAutomerger Merge Worker * @n: another &struct list_head to use as temporary storage
368*a71a9546SAutomerger Merge Worker * @head: the head for your list.
369*a71a9546SAutomerger Merge Worker */
370*a71a9546SAutomerger Merge Worker #define list_for_each_safe(pos, n, head) \
371*a71a9546SAutomerger Merge Worker for (pos = (head)->next, n = pos->next; pos != (head); \
372*a71a9546SAutomerger Merge Worker pos = n, n = pos->next)
373*a71a9546SAutomerger Merge Worker
374*a71a9546SAutomerger Merge Worker /**
375*a71a9546SAutomerger Merge Worker * list_for_each_entry - iterate over list of given type
376*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
377*a71a9546SAutomerger Merge Worker * @head: the head for your list.
378*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
379*a71a9546SAutomerger Merge Worker */
380*a71a9546SAutomerger Merge Worker #define list_for_each_entry(pos, head, member) \
381*a71a9546SAutomerger Merge Worker for (pos = list_entry((head)->next, typeof(*pos), member), \
382*a71a9546SAutomerger Merge Worker prefetch(pos->member.next); \
383*a71a9546SAutomerger Merge Worker &pos->member != (head); \
384*a71a9546SAutomerger Merge Worker pos = list_entry(pos->member.next, typeof(*pos), member), \
385*a71a9546SAutomerger Merge Worker prefetch(pos->member.next))
386*a71a9546SAutomerger Merge Worker
387*a71a9546SAutomerger Merge Worker /**
388*a71a9546SAutomerger Merge Worker * list_for_each_entry_reverse - iterate backwards over list of given type.
389*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
390*a71a9546SAutomerger Merge Worker * @head: the head for your list.
391*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
392*a71a9546SAutomerger Merge Worker */
393*a71a9546SAutomerger Merge Worker #define list_for_each_entry_reverse(pos, head, member) \
394*a71a9546SAutomerger Merge Worker for (pos = list_entry((head)->prev, typeof(*pos), member), \
395*a71a9546SAutomerger Merge Worker prefetch(pos->member.prev); \
396*a71a9546SAutomerger Merge Worker &pos->member != (head); \
397*a71a9546SAutomerger Merge Worker pos = list_entry(pos->member.prev, typeof(*pos), member), \
398*a71a9546SAutomerger Merge Worker prefetch(pos->member.prev))
399*a71a9546SAutomerger Merge Worker
400*a71a9546SAutomerger Merge Worker /**
401*a71a9546SAutomerger Merge Worker * list_prepare_entry - prepare a pos entry for use as a start point in
402*a71a9546SAutomerger Merge Worker * list_for_each_entry_continue
403*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a start point
404*a71a9546SAutomerger Merge Worker * @head: the head of the list
405*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
406*a71a9546SAutomerger Merge Worker */
407*a71a9546SAutomerger Merge Worker #define list_prepare_entry(pos, head, member) \
408*a71a9546SAutomerger Merge Worker ((pos) ? : list_entry(head, typeof(*pos), member))
409*a71a9546SAutomerger Merge Worker
410*a71a9546SAutomerger Merge Worker /**
411*a71a9546SAutomerger Merge Worker * list_for_each_entry_continue - iterate over list of given type
412*a71a9546SAutomerger Merge Worker * continuing after existing point
413*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
414*a71a9546SAutomerger Merge Worker * @head: the head for your list.
415*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
416*a71a9546SAutomerger Merge Worker */
417*a71a9546SAutomerger Merge Worker #define list_for_each_entry_continue(pos, head, member) \
418*a71a9546SAutomerger Merge Worker for (pos = list_entry(pos->member.next, typeof(*pos), member), \
419*a71a9546SAutomerger Merge Worker prefetch(pos->member.next); \
420*a71a9546SAutomerger Merge Worker &pos->member != (head); \
421*a71a9546SAutomerger Merge Worker pos = list_entry(pos->member.next, typeof(*pos), member), \
422*a71a9546SAutomerger Merge Worker prefetch(pos->member.next))
423*a71a9546SAutomerger Merge Worker
424*a71a9546SAutomerger Merge Worker /**
425*a71a9546SAutomerger Merge Worker * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
426*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
427*a71a9546SAutomerger Merge Worker * @n: another type * to use as temporary storage
428*a71a9546SAutomerger Merge Worker * @head: the head for your list.
429*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
430*a71a9546SAutomerger Merge Worker */
431*a71a9546SAutomerger Merge Worker #define list_for_each_entry_safe(pos, n, head, member) \
432*a71a9546SAutomerger Merge Worker for (pos = list_entry((head)->next, typeof(*pos), member), \
433*a71a9546SAutomerger Merge Worker n = list_entry(pos->member.next, typeof(*pos), member); \
434*a71a9546SAutomerger Merge Worker &pos->member != (head); \
435*a71a9546SAutomerger Merge Worker pos = n, n = list_entry(n->member.next, typeof(*n), member))
436*a71a9546SAutomerger Merge Worker
437*a71a9546SAutomerger Merge Worker /**
438*a71a9546SAutomerger Merge Worker * list_for_each_rcu - iterate over an rcu-protected list
439*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
440*a71a9546SAutomerger Merge Worker * @head: the head for your list.
441*a71a9546SAutomerger Merge Worker *
442*a71a9546SAutomerger Merge Worker * This list-traversal primitive may safely run concurrently with
443*a71a9546SAutomerger Merge Worker * the _rcu list-mutation primitives such as list_add_rcu()
444*a71a9546SAutomerger Merge Worker * as long as the traversal is guarded by rcu_read_lock().
445*a71a9546SAutomerger Merge Worker */
446*a71a9546SAutomerger Merge Worker #define list_for_each_rcu(pos, head) \
447*a71a9546SAutomerger Merge Worker for (pos = (head)->next, prefetch(pos->next); pos != (head); \
448*a71a9546SAutomerger Merge Worker pos = pos->next, ({ smp_read_barrier_depends(); 0;}), prefetch(pos->next))
449*a71a9546SAutomerger Merge Worker
450*a71a9546SAutomerger Merge Worker #define __list_for_each_rcu(pos, head) \
451*a71a9546SAutomerger Merge Worker for (pos = (head)->next; pos != (head); \
452*a71a9546SAutomerger Merge Worker pos = pos->next, ({ smp_read_barrier_depends(); 0;}))
453*a71a9546SAutomerger Merge Worker
454*a71a9546SAutomerger Merge Worker /**
455*a71a9546SAutomerger Merge Worker * list_for_each_safe_rcu - iterate over an rcu-protected list safe
456*a71a9546SAutomerger Merge Worker * against removal of list entry
457*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
458*a71a9546SAutomerger Merge Worker * @n: another &struct list_head to use as temporary storage
459*a71a9546SAutomerger Merge Worker * @head: the head for your list.
460*a71a9546SAutomerger Merge Worker *
461*a71a9546SAutomerger Merge Worker * This list-traversal primitive may safely run concurrently with
462*a71a9546SAutomerger Merge Worker * the _rcu list-mutation primitives such as list_add_rcu()
463*a71a9546SAutomerger Merge Worker * as long as the traversal is guarded by rcu_read_lock().
464*a71a9546SAutomerger Merge Worker */
465*a71a9546SAutomerger Merge Worker #define list_for_each_safe_rcu(pos, n, head) \
466*a71a9546SAutomerger Merge Worker for (pos = (head)->next, n = pos->next; pos != (head); \
467*a71a9546SAutomerger Merge Worker pos = n, ({ smp_read_barrier_depends(); 0;}), n = pos->next)
468*a71a9546SAutomerger Merge Worker
469*a71a9546SAutomerger Merge Worker /**
470*a71a9546SAutomerger Merge Worker * list_for_each_entry_rcu - iterate over rcu list of given type
471*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
472*a71a9546SAutomerger Merge Worker * @head: the head for your list.
473*a71a9546SAutomerger Merge Worker * @member: the name of the list_struct within the struct.
474*a71a9546SAutomerger Merge Worker *
475*a71a9546SAutomerger Merge Worker * This list-traversal primitive may safely run concurrently with
476*a71a9546SAutomerger Merge Worker * the _rcu list-mutation primitives such as list_add_rcu()
477*a71a9546SAutomerger Merge Worker * as long as the traversal is guarded by rcu_read_lock().
478*a71a9546SAutomerger Merge Worker */
479*a71a9546SAutomerger Merge Worker #define list_for_each_entry_rcu(pos, head, member) \
480*a71a9546SAutomerger Merge Worker for (pos = list_entry((head)->next, typeof(*pos), member), \
481*a71a9546SAutomerger Merge Worker prefetch(pos->member.next); \
482*a71a9546SAutomerger Merge Worker &pos->member != (head); \
483*a71a9546SAutomerger Merge Worker pos = list_entry(pos->member.next, typeof(*pos), member), \
484*a71a9546SAutomerger Merge Worker ({ smp_read_barrier_depends(); 0;}), \
485*a71a9546SAutomerger Merge Worker prefetch(pos->member.next))
486*a71a9546SAutomerger Merge Worker
487*a71a9546SAutomerger Merge Worker
488*a71a9546SAutomerger Merge Worker /**
489*a71a9546SAutomerger Merge Worker * list_for_each_continue_rcu - iterate over an rcu-protected list
490*a71a9546SAutomerger Merge Worker * continuing after existing point.
491*a71a9546SAutomerger Merge Worker * @pos: the &struct list_head to use as a loop counter.
492*a71a9546SAutomerger Merge Worker * @head: the head for your list.
493*a71a9546SAutomerger Merge Worker *
494*a71a9546SAutomerger Merge Worker * This list-traversal primitive may safely run concurrently with
495*a71a9546SAutomerger Merge Worker * the _rcu list-mutation primitives such as list_add_rcu()
496*a71a9546SAutomerger Merge Worker * as long as the traversal is guarded by rcu_read_lock().
497*a71a9546SAutomerger Merge Worker */
498*a71a9546SAutomerger Merge Worker #define list_for_each_continue_rcu(pos, head) \
499*a71a9546SAutomerger Merge Worker for ((pos) = (pos)->next, prefetch((pos)->next); (pos) != (head); \
500*a71a9546SAutomerger Merge Worker (pos) = (pos)->next, ({ smp_read_barrier_depends(); 0;}), prefetch((pos)->next))
501*a71a9546SAutomerger Merge Worker
502*a71a9546SAutomerger Merge Worker /*
503*a71a9546SAutomerger Merge Worker * Double linked lists with a single pointer list head.
504*a71a9546SAutomerger Merge Worker * Mostly useful for hash tables where the two pointer list head is
505*a71a9546SAutomerger Merge Worker * too wasteful.
506*a71a9546SAutomerger Merge Worker * You lose the ability to access the tail in O(1).
507*a71a9546SAutomerger Merge Worker */
508*a71a9546SAutomerger Merge Worker
509*a71a9546SAutomerger Merge Worker struct hlist_head {
510*a71a9546SAutomerger Merge Worker struct hlist_node *first;
511*a71a9546SAutomerger Merge Worker };
512*a71a9546SAutomerger Merge Worker
513*a71a9546SAutomerger Merge Worker struct hlist_node {
514*a71a9546SAutomerger Merge Worker struct hlist_node *next, **pprev;
515*a71a9546SAutomerger Merge Worker };
516*a71a9546SAutomerger Merge Worker
517*a71a9546SAutomerger Merge Worker #define HLIST_HEAD_INIT { .first = NULL }
518*a71a9546SAutomerger Merge Worker #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
519*a71a9546SAutomerger Merge Worker #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
520*a71a9546SAutomerger Merge Worker #define INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL)
521*a71a9546SAutomerger Merge Worker
hlist_unhashed(const struct hlist_node * h)522*a71a9546SAutomerger Merge Worker static inline int hlist_unhashed(const struct hlist_node *h)
523*a71a9546SAutomerger Merge Worker {
524*a71a9546SAutomerger Merge Worker return !h->pprev;
525*a71a9546SAutomerger Merge Worker }
526*a71a9546SAutomerger Merge Worker
hlist_empty(const struct hlist_head * h)527*a71a9546SAutomerger Merge Worker static inline int hlist_empty(const struct hlist_head *h)
528*a71a9546SAutomerger Merge Worker {
529*a71a9546SAutomerger Merge Worker return !h->first;
530*a71a9546SAutomerger Merge Worker }
531*a71a9546SAutomerger Merge Worker
__hlist_del(struct hlist_node * n)532*a71a9546SAutomerger Merge Worker static inline void __hlist_del(struct hlist_node *n)
533*a71a9546SAutomerger Merge Worker {
534*a71a9546SAutomerger Merge Worker struct hlist_node *next = n->next;
535*a71a9546SAutomerger Merge Worker struct hlist_node **pprev = n->pprev;
536*a71a9546SAutomerger Merge Worker *pprev = next;
537*a71a9546SAutomerger Merge Worker if (next)
538*a71a9546SAutomerger Merge Worker next->pprev = pprev;
539*a71a9546SAutomerger Merge Worker }
540*a71a9546SAutomerger Merge Worker
hlist_del(struct hlist_node * n)541*a71a9546SAutomerger Merge Worker static inline void hlist_del(struct hlist_node *n)
542*a71a9546SAutomerger Merge Worker {
543*a71a9546SAutomerger Merge Worker __hlist_del(n);
544*a71a9546SAutomerger Merge Worker n->next = LIST_POISON1;
545*a71a9546SAutomerger Merge Worker n->pprev = LIST_POISON2;
546*a71a9546SAutomerger Merge Worker }
547*a71a9546SAutomerger Merge Worker
548*a71a9546SAutomerger Merge Worker /**
549*a71a9546SAutomerger Merge Worker * hlist_del_rcu - deletes entry from hash list without re-initialization
550*a71a9546SAutomerger Merge Worker * @n: the element to delete from the hash list.
551*a71a9546SAutomerger Merge Worker *
552*a71a9546SAutomerger Merge Worker * Note: list_unhashed() on entry does not return true after this,
553*a71a9546SAutomerger Merge Worker * the entry is in an undefined state. It is useful for RCU based
554*a71a9546SAutomerger Merge Worker * lockfree traversal.
555*a71a9546SAutomerger Merge Worker *
556*a71a9546SAutomerger Merge Worker * In particular, it means that we can not poison the forward
557*a71a9546SAutomerger Merge Worker * pointers that may still be used for walking the hash list.
558*a71a9546SAutomerger Merge Worker *
559*a71a9546SAutomerger Merge Worker * The caller must take whatever precautions are necessary
560*a71a9546SAutomerger Merge Worker * (such as holding appropriate locks) to avoid racing
561*a71a9546SAutomerger Merge Worker * with another list-mutation primitive, such as hlist_add_head_rcu()
562*a71a9546SAutomerger Merge Worker * or hlist_del_rcu(), running on this same list.
563*a71a9546SAutomerger Merge Worker * However, it is perfectly legal to run concurrently with
564*a71a9546SAutomerger Merge Worker * the _rcu list-traversal primitives, such as
565*a71a9546SAutomerger Merge Worker * hlist_for_each_entry().
566*a71a9546SAutomerger Merge Worker */
hlist_del_rcu(struct hlist_node * n)567*a71a9546SAutomerger Merge Worker static inline void hlist_del_rcu(struct hlist_node *n)
568*a71a9546SAutomerger Merge Worker {
569*a71a9546SAutomerger Merge Worker __hlist_del(n);
570*a71a9546SAutomerger Merge Worker n->pprev = LIST_POISON2;
571*a71a9546SAutomerger Merge Worker }
572*a71a9546SAutomerger Merge Worker
hlist_del_init(struct hlist_node * n)573*a71a9546SAutomerger Merge Worker static inline void hlist_del_init(struct hlist_node *n)
574*a71a9546SAutomerger Merge Worker {
575*a71a9546SAutomerger Merge Worker if (n->pprev) {
576*a71a9546SAutomerger Merge Worker __hlist_del(n);
577*a71a9546SAutomerger Merge Worker INIT_HLIST_NODE(n);
578*a71a9546SAutomerger Merge Worker }
579*a71a9546SAutomerger Merge Worker }
580*a71a9546SAutomerger Merge Worker
581*a71a9546SAutomerger Merge Worker #define hlist_del_rcu_init hlist_del_init
582*a71a9546SAutomerger Merge Worker
hlist_add_head(struct hlist_node * n,struct hlist_head * h)583*a71a9546SAutomerger Merge Worker static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
584*a71a9546SAutomerger Merge Worker {
585*a71a9546SAutomerger Merge Worker struct hlist_node *first = h->first;
586*a71a9546SAutomerger Merge Worker n->next = first;
587*a71a9546SAutomerger Merge Worker if (first)
588*a71a9546SAutomerger Merge Worker first->pprev = &n->next;
589*a71a9546SAutomerger Merge Worker h->first = n;
590*a71a9546SAutomerger Merge Worker n->pprev = &h->first;
591*a71a9546SAutomerger Merge Worker }
592*a71a9546SAutomerger Merge Worker
593*a71a9546SAutomerger Merge Worker
594*a71a9546SAutomerger Merge Worker /**
595*a71a9546SAutomerger Merge Worker * hlist_add_head_rcu - adds the specified element to the specified hlist,
596*a71a9546SAutomerger Merge Worker * while permitting racing traversals.
597*a71a9546SAutomerger Merge Worker * @n: the element to add to the hash list.
598*a71a9546SAutomerger Merge Worker * @h: the list to add to.
599*a71a9546SAutomerger Merge Worker *
600*a71a9546SAutomerger Merge Worker * The caller must take whatever precautions are necessary
601*a71a9546SAutomerger Merge Worker * (such as holding appropriate locks) to avoid racing
602*a71a9546SAutomerger Merge Worker * with another list-mutation primitive, such as hlist_add_head_rcu()
603*a71a9546SAutomerger Merge Worker * or hlist_del_rcu(), running on this same list.
604*a71a9546SAutomerger Merge Worker * However, it is perfectly legal to run concurrently with
605*a71a9546SAutomerger Merge Worker * the _rcu list-traversal primitives, such as
606*a71a9546SAutomerger Merge Worker * hlist_for_each_entry(), but only if smp_read_barrier_depends()
607*a71a9546SAutomerger Merge Worker * is used to prevent memory-consistency problems on Alpha CPUs.
608*a71a9546SAutomerger Merge Worker * Regardless of the type of CPU, the list-traversal primitive
609*a71a9546SAutomerger Merge Worker * must be guarded by rcu_read_lock().
610*a71a9546SAutomerger Merge Worker *
611*a71a9546SAutomerger Merge Worker * OK, so why don't we have an hlist_for_each_entry_rcu()???
612*a71a9546SAutomerger Merge Worker */
hlist_add_head_rcu(struct hlist_node * n,struct hlist_head * h)613*a71a9546SAutomerger Merge Worker static inline void hlist_add_head_rcu(struct hlist_node *n,
614*a71a9546SAutomerger Merge Worker struct hlist_head *h)
615*a71a9546SAutomerger Merge Worker {
616*a71a9546SAutomerger Merge Worker struct hlist_node *first = h->first;
617*a71a9546SAutomerger Merge Worker n->next = first;
618*a71a9546SAutomerger Merge Worker n->pprev = &h->first;
619*a71a9546SAutomerger Merge Worker smp_wmb();
620*a71a9546SAutomerger Merge Worker if (first)
621*a71a9546SAutomerger Merge Worker first->pprev = &n->next;
622*a71a9546SAutomerger Merge Worker h->first = n;
623*a71a9546SAutomerger Merge Worker }
624*a71a9546SAutomerger Merge Worker
625*a71a9546SAutomerger Merge Worker /* next must be != NULL */
hlist_add_before(struct hlist_node * n,struct hlist_node * next)626*a71a9546SAutomerger Merge Worker static inline void hlist_add_before(struct hlist_node *n,
627*a71a9546SAutomerger Merge Worker struct hlist_node *next)
628*a71a9546SAutomerger Merge Worker {
629*a71a9546SAutomerger Merge Worker n->pprev = next->pprev;
630*a71a9546SAutomerger Merge Worker n->next = next;
631*a71a9546SAutomerger Merge Worker next->pprev = &n->next;
632*a71a9546SAutomerger Merge Worker *(n->pprev) = n;
633*a71a9546SAutomerger Merge Worker }
634*a71a9546SAutomerger Merge Worker
hlist_add_after(struct hlist_node * n,struct hlist_node * next)635*a71a9546SAutomerger Merge Worker static inline void hlist_add_after(struct hlist_node *n,
636*a71a9546SAutomerger Merge Worker struct hlist_node *next)
637*a71a9546SAutomerger Merge Worker {
638*a71a9546SAutomerger Merge Worker next->next = n->next;
639*a71a9546SAutomerger Merge Worker n->next = next;
640*a71a9546SAutomerger Merge Worker next->pprev = &n->next;
641*a71a9546SAutomerger Merge Worker
642*a71a9546SAutomerger Merge Worker if(next->next)
643*a71a9546SAutomerger Merge Worker next->next->pprev = &next->next;
644*a71a9546SAutomerger Merge Worker }
645*a71a9546SAutomerger Merge Worker
646*a71a9546SAutomerger Merge Worker #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
647*a71a9546SAutomerger Merge Worker
648*a71a9546SAutomerger Merge Worker #define hlist_for_each(pos, head) \
649*a71a9546SAutomerger Merge Worker for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
650*a71a9546SAutomerger Merge Worker pos = pos->next)
651*a71a9546SAutomerger Merge Worker
652*a71a9546SAutomerger Merge Worker #define hlist_for_each_safe(pos, n, head) \
653*a71a9546SAutomerger Merge Worker for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
654*a71a9546SAutomerger Merge Worker pos = n)
655*a71a9546SAutomerger Merge Worker
656*a71a9546SAutomerger Merge Worker /**
657*a71a9546SAutomerger Merge Worker * hlist_for_each_entry - iterate over list of given type
658*a71a9546SAutomerger Merge Worker * @tpos: the type * to use as a loop counter.
659*a71a9546SAutomerger Merge Worker * @pos: the &struct hlist_node to use as a loop counter.
660*a71a9546SAutomerger Merge Worker * @head: the head for your list.
661*a71a9546SAutomerger Merge Worker * @member: the name of the hlist_node within the struct.
662*a71a9546SAutomerger Merge Worker */
663*a71a9546SAutomerger Merge Worker #define hlist_for_each_entry(tpos, pos, head, member) \
664*a71a9546SAutomerger Merge Worker for (pos = (head)->first; \
665*a71a9546SAutomerger Merge Worker pos && ({ prefetch(pos->next); 1;}) && \
666*a71a9546SAutomerger Merge Worker ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
667*a71a9546SAutomerger Merge Worker pos = pos->next)
668*a71a9546SAutomerger Merge Worker
669*a71a9546SAutomerger Merge Worker /**
670*a71a9546SAutomerger Merge Worker * hlist_for_each_entry_continue - iterate over a hlist continuing after existing point
671*a71a9546SAutomerger Merge Worker * @tpos: the type * to use as a loop counter.
672*a71a9546SAutomerger Merge Worker * @pos: the &struct hlist_node to use as a loop counter.
673*a71a9546SAutomerger Merge Worker * @member: the name of the hlist_node within the struct.
674*a71a9546SAutomerger Merge Worker */
675*a71a9546SAutomerger Merge Worker #define hlist_for_each_entry_continue(tpos, pos, member) \
676*a71a9546SAutomerger Merge Worker for (pos = (pos)->next; \
677*a71a9546SAutomerger Merge Worker pos && ({ prefetch(pos->next); 1;}) && \
678*a71a9546SAutomerger Merge Worker ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
679*a71a9546SAutomerger Merge Worker pos = pos->next)
680*a71a9546SAutomerger Merge Worker
681*a71a9546SAutomerger Merge Worker /**
682*a71a9546SAutomerger Merge Worker * hlist_for_each_entry_from - iterate over a hlist continuing from existing point
683*a71a9546SAutomerger Merge Worker * @tpos: the type * to use as a loop counter.
684*a71a9546SAutomerger Merge Worker * @pos: the &struct hlist_node to use as a loop counter.
685*a71a9546SAutomerger Merge Worker * @member: the name of the hlist_node within the struct.
686*a71a9546SAutomerger Merge Worker */
687*a71a9546SAutomerger Merge Worker #define hlist_for_each_entry_from(tpos, pos, member) \
688*a71a9546SAutomerger Merge Worker for (; pos && ({ prefetch(pos->next); 1;}) && \
689*a71a9546SAutomerger Merge Worker ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
690*a71a9546SAutomerger Merge Worker pos = pos->next)
691*a71a9546SAutomerger Merge Worker
692*a71a9546SAutomerger Merge Worker /**
693*a71a9546SAutomerger Merge Worker * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
694*a71a9546SAutomerger Merge Worker * @tpos: the type * to use as a loop counter.
695*a71a9546SAutomerger Merge Worker * @pos: the &struct hlist_node to use as a loop counter.
696*a71a9546SAutomerger Merge Worker * @n: another &struct hlist_node to use as temporary storage
697*a71a9546SAutomerger Merge Worker * @head: the head for your list.
698*a71a9546SAutomerger Merge Worker * @member: the name of the hlist_node within the struct.
699*a71a9546SAutomerger Merge Worker */
700*a71a9546SAutomerger Merge Worker #define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
701*a71a9546SAutomerger Merge Worker for (pos = (head)->first; \
702*a71a9546SAutomerger Merge Worker pos && ({ n = pos->next; 1; }) && \
703*a71a9546SAutomerger Merge Worker ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
704*a71a9546SAutomerger Merge Worker pos = n)
705*a71a9546SAutomerger Merge Worker
706*a71a9546SAutomerger Merge Worker /**
707*a71a9546SAutomerger Merge Worker * hlist_for_each_entry_rcu - iterate over rcu list of given type
708*a71a9546SAutomerger Merge Worker * @pos: the type * to use as a loop counter.
709*a71a9546SAutomerger Merge Worker * @pos: the &struct hlist_node to use as a loop counter.
710*a71a9546SAutomerger Merge Worker * @head: the head for your list.
711*a71a9546SAutomerger Merge Worker * @member: the name of the hlist_node within the struct.
712*a71a9546SAutomerger Merge Worker *
713*a71a9546SAutomerger Merge Worker * This list-traversal primitive may safely run concurrently with
714*a71a9546SAutomerger Merge Worker * the _rcu list-mutation primitives such as hlist_add_rcu()
715*a71a9546SAutomerger Merge Worker * as long as the traversal is guarded by rcu_read_lock().
716*a71a9546SAutomerger Merge Worker */
717*a71a9546SAutomerger Merge Worker #define hlist_for_each_entry_rcu(tpos, pos, head, member) \
718*a71a9546SAutomerger Merge Worker for (pos = (head)->first; \
719*a71a9546SAutomerger Merge Worker pos && ({ prefetch(pos->next); 1;}) && \
720*a71a9546SAutomerger Merge Worker ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
721*a71a9546SAutomerger Merge Worker pos = pos->next, ({ smp_read_barrier_depends(); 0; }) )
722*a71a9546SAutomerger Merge Worker
723*a71a9546SAutomerger Merge Worker #endif
724