1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun struct list {
3*4882a593Smuzhiyun struct list *next, *prev;
4*4882a593Smuzhiyun };
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun static inline void
list_init(struct list * list)7*4882a593Smuzhiyun list_init(struct list *list)
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun list->next = list;
10*4882a593Smuzhiyun list->prev = list;
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun static inline int
list_empty(struct list * list)14*4882a593Smuzhiyun list_empty(struct list *list)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun return list->next == list;
17*4882a593Smuzhiyun }
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun static inline void
list_insert(struct list * link,struct list * new_link)20*4882a593Smuzhiyun list_insert(struct list *link, struct list *new_link)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun new_link->prev = link->prev;
23*4882a593Smuzhiyun new_link->next = link;
24*4882a593Smuzhiyun new_link->prev->next = new_link;
25*4882a593Smuzhiyun new_link->next->prev = new_link;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun static inline void
list_append(struct list * list,struct list * new_link)29*4882a593Smuzhiyun list_append(struct list *list, struct list *new_link)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun list_insert((struct list *)list, new_link);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun static inline void
list_prepend(struct list * list,struct list * new_link)35*4882a593Smuzhiyun list_prepend(struct list *list, struct list *new_link)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun list_insert(list->next, new_link);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun static inline void
list_remove(struct list * link)41*4882a593Smuzhiyun list_remove(struct list *link)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun link->prev->next = link->next;
44*4882a593Smuzhiyun link->next->prev = link->prev;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #define list_entry(link, type, member) \
48*4882a593Smuzhiyun ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define list_head(list, type, member) \
51*4882a593Smuzhiyun list_entry((list)->next, type, member)
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #define list_tail(list, type, member) \
54*4882a593Smuzhiyun list_entry((list)->prev, type, member)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define list_next(elm, member) \
57*4882a593Smuzhiyun list_entry((elm)->member.next, typeof(*elm), member)
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define list_for_each_entry(pos, list, member) \
60*4882a593Smuzhiyun for (pos = list_head(list, typeof(*pos), member); \
61*4882a593Smuzhiyun &pos->member != (list); \
62*4882a593Smuzhiyun pos = list_next(pos, member))
63*4882a593Smuzhiyun
64