1*508ec739SDaniel Rosenberg /* SPDX-License-Identifier: GPL-2.0-or-later */
2*508ec739SDaniel Rosenberg
3*508ec739SDaniel Rosenberg #ifndef _LINUX_LIST_H
4*508ec739SDaniel Rosenberg #define _LINUX_LIST_H
5*508ec739SDaniel Rosenberg
6*508ec739SDaniel Rosenberg #ifndef offsetof
7*508ec739SDaniel Rosenberg #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
8*508ec739SDaniel Rosenberg #endif
9*508ec739SDaniel Rosenberg
10*508ec739SDaniel Rosenberg #define container_of(ptr, type, member) ({ \
11*508ec739SDaniel Rosenberg const typeof(((type *)0)->member) * __mptr = (ptr); \
12*508ec739SDaniel Rosenberg (type *)((char *)__mptr - offsetof(type, member)); \
13*508ec739SDaniel Rosenberg })
14*508ec739SDaniel Rosenberg
15*508ec739SDaniel Rosenberg /*
16*508ec739SDaniel Rosenberg * These are non-NULL pointers that will result in page faults
17*508ec739SDaniel Rosenberg * under normal circumstances, used to verify that nobody uses
18*508ec739SDaniel Rosenberg * non-initialized list entries.
19*508ec739SDaniel Rosenberg */
20*508ec739SDaniel Rosenberg #define LIST_POISON1 ((void *) 0x00100100)
21*508ec739SDaniel Rosenberg #define LIST_POISON2 ((void *) 0x00200200)
22*508ec739SDaniel Rosenberg
23*508ec739SDaniel Rosenberg /**
24*508ec739SDaniel Rosenberg * Simple doubly linked list implementation.
25*508ec739SDaniel Rosenberg *
26*508ec739SDaniel Rosenberg * Some of the internal functions ("__xxx") are useful when
27*508ec739SDaniel Rosenberg * manipulating whole lists rather than single entries, as
28*508ec739SDaniel Rosenberg * sometimes we already know the next/prev entries and we can
29*508ec739SDaniel Rosenberg * generate better code by using them directly rather than
30*508ec739SDaniel Rosenberg * using the generic single-entry routines.
31*508ec739SDaniel Rosenberg */
32*508ec739SDaniel Rosenberg struct list_head {
33*508ec739SDaniel Rosenberg struct list_head *next, *prev;
34*508ec739SDaniel Rosenberg };
35*508ec739SDaniel Rosenberg
36*508ec739SDaniel Rosenberg #define LIST_HEAD_INIT(name) { &(name), &(name) }
37*508ec739SDaniel Rosenberg
38*508ec739SDaniel Rosenberg #define LIST_HEAD(name) \
39*508ec739SDaniel Rosenberg struct list_head name = LIST_HEAD_INIT(name)
40*508ec739SDaniel Rosenberg
41*508ec739SDaniel Rosenberg #define INIT_LIST_HEAD(ptr) do { \
42*508ec739SDaniel Rosenberg (ptr)->next = (ptr); (ptr)->prev = (ptr); \
43*508ec739SDaniel Rosenberg } while (0)
44*508ec739SDaniel Rosenberg
45*508ec739SDaniel Rosenberg /*
46*508ec739SDaniel Rosenberg * Insert a new entry between two known consecutive entries.
47*508ec739SDaniel Rosenberg *
48*508ec739SDaniel Rosenberg * This is only for internal list manipulation where we know
49*508ec739SDaniel Rosenberg * the prev/next entries already!
50*508ec739SDaniel Rosenberg */
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)51*508ec739SDaniel Rosenberg static inline void __list_add(struct list_head *new,
52*508ec739SDaniel Rosenberg struct list_head *prev,
53*508ec739SDaniel Rosenberg struct list_head *next)
54*508ec739SDaniel Rosenberg {
55*508ec739SDaniel Rosenberg next->prev = new;
56*508ec739SDaniel Rosenberg new->next = next;
57*508ec739SDaniel Rosenberg new->prev = prev;
58*508ec739SDaniel Rosenberg prev->next = new;
59*508ec739SDaniel Rosenberg }
60*508ec739SDaniel Rosenberg
61*508ec739SDaniel Rosenberg /**
62*508ec739SDaniel Rosenberg * list_add - add a new entry
63*508ec739SDaniel Rosenberg * @new: new entry to be added
64*508ec739SDaniel Rosenberg * @head: list head to add it after
65*508ec739SDaniel Rosenberg *
66*508ec739SDaniel Rosenberg * Insert a new entry after the specified head.
67*508ec739SDaniel Rosenberg * This is good for implementing stacks.
68*508ec739SDaniel Rosenberg */
list_add(struct list_head * new,struct list_head * head)69*508ec739SDaniel Rosenberg static inline void list_add(struct list_head *new, struct list_head *head)
70*508ec739SDaniel Rosenberg {
71*508ec739SDaniel Rosenberg __list_add(new, head, head->next);
72*508ec739SDaniel Rosenberg }
73*508ec739SDaniel Rosenberg
74*508ec739SDaniel Rosenberg /**
75*508ec739SDaniel Rosenberg * list_add_tail - add a new entry
76*508ec739SDaniel Rosenberg * @new: new entry to be added
77*508ec739SDaniel Rosenberg * @head: list head to add it before
78*508ec739SDaniel Rosenberg *
79*508ec739SDaniel Rosenberg * Insert a new entry before the specified head.
80*508ec739SDaniel Rosenberg * This is useful for implementing queues.
81*508ec739SDaniel Rosenberg */
list_add_tail(struct list_head * new,struct list_head * head)82*508ec739SDaniel Rosenberg static inline void list_add_tail(struct list_head *new, struct list_head *head)
83*508ec739SDaniel Rosenberg {
84*508ec739SDaniel Rosenberg __list_add(new, head->prev, head);
85*508ec739SDaniel Rosenberg }
86*508ec739SDaniel Rosenberg
87*508ec739SDaniel Rosenberg /*
88*508ec739SDaniel Rosenberg * Delete a list entry by making the prev/next entries
89*508ec739SDaniel Rosenberg * point to each other.
90*508ec739SDaniel Rosenberg *
91*508ec739SDaniel Rosenberg * This is only for internal list manipulation where we know
92*508ec739SDaniel Rosenberg * the prev/next entries already!
93*508ec739SDaniel Rosenberg */
__list_del(struct list_head * prev,struct list_head * next)94*508ec739SDaniel Rosenberg static inline void __list_del(struct list_head *prev, struct list_head *next)
95*508ec739SDaniel Rosenberg {
96*508ec739SDaniel Rosenberg next->prev = prev;
97*508ec739SDaniel Rosenberg prev->next = next;
98*508ec739SDaniel Rosenberg }
99*508ec739SDaniel Rosenberg
100*508ec739SDaniel Rosenberg /**
101*508ec739SDaniel Rosenberg * list_del - deletes entry from list.
102*508ec739SDaniel Rosenberg * @entry: the element to delete from the list.
103*508ec739SDaniel Rosenberg * Note: list_empty on entry does not return true after this, the entry is
104*508ec739SDaniel Rosenberg * in an undefined state.
105*508ec739SDaniel Rosenberg */
list_del(struct list_head * entry)106*508ec739SDaniel Rosenberg static inline void list_del(struct list_head *entry)
107*508ec739SDaniel Rosenberg {
108*508ec739SDaniel Rosenberg __list_del(entry->prev, entry->next);
109*508ec739SDaniel Rosenberg entry->next = LIST_POISON1;
110*508ec739SDaniel Rosenberg entry->prev = LIST_POISON2;
111*508ec739SDaniel Rosenberg }
112*508ec739SDaniel Rosenberg
113*508ec739SDaniel Rosenberg /**
114*508ec739SDaniel Rosenberg * list_del_init - deletes entry from list and reinitialize it.
115*508ec739SDaniel Rosenberg * @entry: the element to delete from the list.
116*508ec739SDaniel Rosenberg */
list_del_init(struct list_head * entry)117*508ec739SDaniel Rosenberg static inline void list_del_init(struct list_head *entry)
118*508ec739SDaniel Rosenberg {
119*508ec739SDaniel Rosenberg __list_del(entry->prev, entry->next);
120*508ec739SDaniel Rosenberg INIT_LIST_HEAD(entry);
121*508ec739SDaniel Rosenberg }
122*508ec739SDaniel Rosenberg
123*508ec739SDaniel Rosenberg /**
124*508ec739SDaniel Rosenberg * list_move - delete from one list and add as another's head
125*508ec739SDaniel Rosenberg * @list: the entry to move
126*508ec739SDaniel Rosenberg * @head: the head that will precede our entry
127*508ec739SDaniel Rosenberg */
list_move(struct list_head * list,struct list_head * head)128*508ec739SDaniel Rosenberg static inline void list_move(struct list_head *list, struct list_head *head)
129*508ec739SDaniel Rosenberg {
130*508ec739SDaniel Rosenberg __list_del(list->prev, list->next);
131*508ec739SDaniel Rosenberg list_add(list, head);
132*508ec739SDaniel Rosenberg }
133*508ec739SDaniel Rosenberg
134*508ec739SDaniel Rosenberg /**
135*508ec739SDaniel Rosenberg * list_move_tail - delete from one list and add as another's tail
136*508ec739SDaniel Rosenberg * @list: the entry to move
137*508ec739SDaniel Rosenberg * @head: the head that will follow our entry
138*508ec739SDaniel Rosenberg */
list_move_tail(struct list_head * list,struct list_head * head)139*508ec739SDaniel Rosenberg static inline void list_move_tail(struct list_head *list,
140*508ec739SDaniel Rosenberg struct list_head *head)
141*508ec739SDaniel Rosenberg {
142*508ec739SDaniel Rosenberg __list_del(list->prev, list->next);
143*508ec739SDaniel Rosenberg list_add_tail(list, head);
144*508ec739SDaniel Rosenberg }
145*508ec739SDaniel Rosenberg
146*508ec739SDaniel Rosenberg /**
147*508ec739SDaniel Rosenberg * list_empty - tests whether a list is empty
148*508ec739SDaniel Rosenberg * @head: the list to test.
149*508ec739SDaniel Rosenberg */
list_empty(const struct list_head * head)150*508ec739SDaniel Rosenberg static inline int list_empty(const struct list_head *head)
151*508ec739SDaniel Rosenberg {
152*508ec739SDaniel Rosenberg return head->next == head;
153*508ec739SDaniel Rosenberg }
154*508ec739SDaniel Rosenberg
__list_splice(struct list_head * list,struct list_head * head)155*508ec739SDaniel Rosenberg static inline void __list_splice(struct list_head *list,
156*508ec739SDaniel Rosenberg struct list_head *head)
157*508ec739SDaniel Rosenberg {
158*508ec739SDaniel Rosenberg struct list_head *first = list->next;
159*508ec739SDaniel Rosenberg struct list_head *last = list->prev;
160*508ec739SDaniel Rosenberg struct list_head *at = head->next;
161*508ec739SDaniel Rosenberg
162*508ec739SDaniel Rosenberg first->prev = head;
163*508ec739SDaniel Rosenberg head->next = first;
164*508ec739SDaniel Rosenberg
165*508ec739SDaniel Rosenberg last->next = at;
166*508ec739SDaniel Rosenberg at->prev = last;
167*508ec739SDaniel Rosenberg }
168*508ec739SDaniel Rosenberg
169*508ec739SDaniel Rosenberg /**
170*508ec739SDaniel Rosenberg * list_splice - join two lists
171*508ec739SDaniel Rosenberg * @list: the new list to add.
172*508ec739SDaniel Rosenberg * @head: the place to add it in the first list.
173*508ec739SDaniel Rosenberg */
list_splice(struct list_head * list,struct list_head * head)174*508ec739SDaniel Rosenberg static inline void list_splice(struct list_head *list, struct list_head *head)
175*508ec739SDaniel Rosenberg {
176*508ec739SDaniel Rosenberg if (!list_empty(list))
177*508ec739SDaniel Rosenberg __list_splice(list, head);
178*508ec739SDaniel Rosenberg }
179*508ec739SDaniel Rosenberg
180*508ec739SDaniel Rosenberg /**
181*508ec739SDaniel Rosenberg * list_splice_init - join two lists and reinitialise the emptied list.
182*508ec739SDaniel Rosenberg * @list: the new list to add.
183*508ec739SDaniel Rosenberg * @head: the place to add it in the first list.
184*508ec739SDaniel Rosenberg *
185*508ec739SDaniel Rosenberg * The list at @list is reinitialised
186*508ec739SDaniel Rosenberg */
list_splice_init(struct list_head * list,struct list_head * head)187*508ec739SDaniel Rosenberg static inline void list_splice_init(struct list_head *list,
188*508ec739SDaniel Rosenberg struct list_head *head)
189*508ec739SDaniel Rosenberg {
190*508ec739SDaniel Rosenberg if (!list_empty(list)) {
191*508ec739SDaniel Rosenberg __list_splice(list, head);
192*508ec739SDaniel Rosenberg INIT_LIST_HEAD(list);
193*508ec739SDaniel Rosenberg }
194*508ec739SDaniel Rosenberg }
195*508ec739SDaniel Rosenberg
196*508ec739SDaniel Rosenberg /**
197*508ec739SDaniel Rosenberg * list_entry - get the struct for this entry
198*508ec739SDaniel Rosenberg * @ptr: the &struct list_head pointer.
199*508ec739SDaniel Rosenberg * @type: the type of the struct this is embedded in.
200*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
201*508ec739SDaniel Rosenberg */
202*508ec739SDaniel Rosenberg #define list_entry(ptr, type, member) \
203*508ec739SDaniel Rosenberg container_of(ptr, type, member)
204*508ec739SDaniel Rosenberg
205*508ec739SDaniel Rosenberg /**
206*508ec739SDaniel Rosenberg * list_for_each - iterate over a list
207*508ec739SDaniel Rosenberg * @pos: the &struct list_head to use as a loop counter.
208*508ec739SDaniel Rosenberg * @head: the head for your list.
209*508ec739SDaniel Rosenberg */
210*508ec739SDaniel Rosenberg
211*508ec739SDaniel Rosenberg #define list_for_each(pos, head) \
212*508ec739SDaniel Rosenberg for (pos = (head)->next; pos != (head); \
213*508ec739SDaniel Rosenberg pos = pos->next)
214*508ec739SDaniel Rosenberg
215*508ec739SDaniel Rosenberg /**
216*508ec739SDaniel Rosenberg * __list_for_each - iterate over a list
217*508ec739SDaniel Rosenberg * @pos: the &struct list_head to use as a loop counter.
218*508ec739SDaniel Rosenberg * @head: the head for your list.
219*508ec739SDaniel Rosenberg *
220*508ec739SDaniel Rosenberg * This variant differs from list_for_each() in that it's the
221*508ec739SDaniel Rosenberg * simplest possible list iteration code, no prefetching is done.
222*508ec739SDaniel Rosenberg * Use this for code that knows the list to be very short (empty
223*508ec739SDaniel Rosenberg * or 1 entry) most of the time.
224*508ec739SDaniel Rosenberg */
225*508ec739SDaniel Rosenberg #define __list_for_each(pos, head) \
226*508ec739SDaniel Rosenberg for (pos = (head)->next; pos != (head); pos = pos->next)
227*508ec739SDaniel Rosenberg
228*508ec739SDaniel Rosenberg /**
229*508ec739SDaniel Rosenberg * list_for_each_prev - iterate over a list backwards
230*508ec739SDaniel Rosenberg * @pos: the &struct list_head to use as a loop counter.
231*508ec739SDaniel Rosenberg * @head: the head for your list.
232*508ec739SDaniel Rosenberg */
233*508ec739SDaniel Rosenberg #define list_for_each_prev(pos, head) \
234*508ec739SDaniel Rosenberg for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
235*508ec739SDaniel Rosenberg pos = pos->prev)
236*508ec739SDaniel Rosenberg
237*508ec739SDaniel Rosenberg /**
238*508ec739SDaniel Rosenberg * list_for_each_safe - iterate over a list safe against removal of list entry
239*508ec739SDaniel Rosenberg * @pos: the &struct list_head to use as a loop counter.
240*508ec739SDaniel Rosenberg * @n: another &struct list_head to use as temporary storage
241*508ec739SDaniel Rosenberg * @head: the head for your list.
242*508ec739SDaniel Rosenberg */
243*508ec739SDaniel Rosenberg #define list_for_each_safe(pos, n, head) \
244*508ec739SDaniel Rosenberg for (pos = (head)->next, n = pos->next; pos != (head); \
245*508ec739SDaniel Rosenberg pos = n, n = pos->next)
246*508ec739SDaniel Rosenberg
247*508ec739SDaniel Rosenberg /**
248*508ec739SDaniel Rosenberg * list_for_each_entry - iterate over list of given type
249*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
250*508ec739SDaniel Rosenberg * @head: the head for your list.
251*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
252*508ec739SDaniel Rosenberg */
253*508ec739SDaniel Rosenberg #define list_for_each_entry(pos, head, member) \
254*508ec739SDaniel Rosenberg for (pos = list_entry((head)->next, typeof(*pos), member); \
255*508ec739SDaniel Rosenberg &pos->member != (head); \
256*508ec739SDaniel Rosenberg pos = list_entry(pos->member.next, typeof(*pos), member))
257*508ec739SDaniel Rosenberg
258*508ec739SDaniel Rosenberg /**
259*508ec739SDaniel Rosenberg * list_for_each_entry_reverse - iterate backwards over list of given type.
260*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
261*508ec739SDaniel Rosenberg * @head: the head for your list.
262*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
263*508ec739SDaniel Rosenberg */
264*508ec739SDaniel Rosenberg #define list_for_each_entry_reverse(pos, head, member) \
265*508ec739SDaniel Rosenberg for (pos = list_entry((head)->prev, typeof(*pos), member); \
266*508ec739SDaniel Rosenberg &pos->member != (head); \
267*508ec739SDaniel Rosenberg pos = list_entry(pos->member.prev, typeof(*pos), member))
268*508ec739SDaniel Rosenberg
269*508ec739SDaniel Rosenberg /**
270*508ec739SDaniel Rosenberg * list_prepare_entry - prepare a pos entry for use as a start point in
271*508ec739SDaniel Rosenberg * list_for_each_entry_continue
272*508ec739SDaniel Rosenberg * @pos: the type * to use as a start point
273*508ec739SDaniel Rosenberg * @head: the head of the list
274*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
275*508ec739SDaniel Rosenberg */
276*508ec739SDaniel Rosenberg #define list_prepare_entry(pos, head, member) \
277*508ec739SDaniel Rosenberg ((pos) ? : list_entry(head, typeof(*pos), member))
278*508ec739SDaniel Rosenberg
279*508ec739SDaniel Rosenberg /**
280*508ec739SDaniel Rosenberg * list_for_each_entry_continue - iterate over list of given type
281*508ec739SDaniel Rosenberg * continuing after existing point
282*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
283*508ec739SDaniel Rosenberg * @head: the head for your list.
284*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
285*508ec739SDaniel Rosenberg */
286*508ec739SDaniel Rosenberg #define list_for_each_entry_continue(pos, head, member) \
287*508ec739SDaniel Rosenberg for (pos = list_entry(pos->member.next, typeof(*pos), member); \
288*508ec739SDaniel Rosenberg &pos->member != (head); \
289*508ec739SDaniel Rosenberg pos = list_entry(pos->member.next, typeof(*pos), member))
290*508ec739SDaniel Rosenberg
291*508ec739SDaniel Rosenberg /**
292*508ec739SDaniel Rosenberg * list_for_each_entry_safe - iterate over list of given type safe against
293*508ec739SDaniel Rosenberg * removal of list entry
294*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
295*508ec739SDaniel Rosenberg * @n: another type * to use as temporary storage
296*508ec739SDaniel Rosenberg * @head: the head for your list.
297*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
298*508ec739SDaniel Rosenberg */
299*508ec739SDaniel Rosenberg #define list_for_each_entry_safe(pos, n, head, member) \
300*508ec739SDaniel Rosenberg for (pos = list_entry((head)->next, typeof(*pos), member), \
301*508ec739SDaniel Rosenberg n = list_entry(pos->member.next, typeof(*pos), member); \
302*508ec739SDaniel Rosenberg &pos->member != (head); \
303*508ec739SDaniel Rosenberg pos = n, n = list_entry(n->member.next, typeof(*n), member))
304*508ec739SDaniel Rosenberg
305*508ec739SDaniel Rosenberg /**
306*508ec739SDaniel Rosenberg * list_for_each_entry_safe_continue - iterate over list of given type
307*508ec739SDaniel Rosenberg * continuing after existing point safe against removal of list entry
308*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
309*508ec739SDaniel Rosenberg * @n: another type * to use as temporary storage
310*508ec739SDaniel Rosenberg * @head: the head for your list.
311*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
312*508ec739SDaniel Rosenberg */
313*508ec739SDaniel Rosenberg #define list_for_each_entry_safe_continue(pos, n, head, member) \
314*508ec739SDaniel Rosenberg for (pos = list_entry(pos->member.next, typeof(*pos), member), \
315*508ec739SDaniel Rosenberg n = list_entry(pos->member.next, typeof(*pos), member); \
316*508ec739SDaniel Rosenberg &pos->member != (head); \
317*508ec739SDaniel Rosenberg pos = n, n = list_entry(n->member.next, typeof(*n), member))
318*508ec739SDaniel Rosenberg
319*508ec739SDaniel Rosenberg /**
320*508ec739SDaniel Rosenberg * list_for_each_entry_safe_reverse - iterate backwards over list of given
321*508ec739SDaniel Rosenberg * type safe against removal of list entry
322*508ec739SDaniel Rosenberg * @pos: the type * to use as a loop counter.
323*508ec739SDaniel Rosenberg * @n: another type * to use as temporary storage
324*508ec739SDaniel Rosenberg * @head: the head for your list.
325*508ec739SDaniel Rosenberg * @member: the name of the list_struct within the struct.
326*508ec739SDaniel Rosenberg */
327*508ec739SDaniel Rosenberg #define list_for_each_entry_safe_reverse(pos, n, head, member) \
328*508ec739SDaniel Rosenberg for (pos = list_entry((head)->prev, typeof(*pos), member), \
329*508ec739SDaniel Rosenberg n = list_entry(pos->member.prev, typeof(*pos), member); \
330*508ec739SDaniel Rosenberg &pos->member != (head); \
331*508ec739SDaniel Rosenberg pos = n, n = list_entry(n->member.prev, typeof(*n), member))
332*508ec739SDaniel Rosenberg
333*508ec739SDaniel Rosenberg #endif
334