1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
29f6d3c4bSStefan Richter struct list {
39f6d3c4bSStefan Richter struct list *next, *prev;
49f6d3c4bSStefan Richter };
59f6d3c4bSStefan Richter
69f6d3c4bSStefan Richter static inline void
list_init(struct list * list)79f6d3c4bSStefan Richter list_init(struct list *list)
89f6d3c4bSStefan Richter {
99f6d3c4bSStefan Richter list->next = list;
109f6d3c4bSStefan Richter list->prev = list;
119f6d3c4bSStefan Richter }
129f6d3c4bSStefan Richter
139f6d3c4bSStefan Richter static inline int
list_empty(struct list * list)149f6d3c4bSStefan Richter list_empty(struct list *list)
159f6d3c4bSStefan Richter {
169f6d3c4bSStefan Richter return list->next == list;
179f6d3c4bSStefan Richter }
189f6d3c4bSStefan Richter
199f6d3c4bSStefan Richter static inline void
list_insert(struct list * link,struct list * new_link)209f6d3c4bSStefan Richter list_insert(struct list *link, struct list *new_link)
219f6d3c4bSStefan Richter {
229f6d3c4bSStefan Richter new_link->prev = link->prev;
239f6d3c4bSStefan Richter new_link->next = link;
249f6d3c4bSStefan Richter new_link->prev->next = new_link;
259f6d3c4bSStefan Richter new_link->next->prev = new_link;
269f6d3c4bSStefan Richter }
279f6d3c4bSStefan Richter
289f6d3c4bSStefan Richter static inline void
list_append(struct list * list,struct list * new_link)299f6d3c4bSStefan Richter list_append(struct list *list, struct list *new_link)
309f6d3c4bSStefan Richter {
319f6d3c4bSStefan Richter list_insert((struct list *)list, new_link);
329f6d3c4bSStefan Richter }
339f6d3c4bSStefan Richter
349f6d3c4bSStefan Richter static inline void
list_prepend(struct list * list,struct list * new_link)359f6d3c4bSStefan Richter list_prepend(struct list *list, struct list *new_link)
369f6d3c4bSStefan Richter {
379f6d3c4bSStefan Richter list_insert(list->next, new_link);
389f6d3c4bSStefan Richter }
399f6d3c4bSStefan Richter
409f6d3c4bSStefan Richter static inline void
list_remove(struct list * link)419f6d3c4bSStefan Richter list_remove(struct list *link)
429f6d3c4bSStefan Richter {
439f6d3c4bSStefan Richter link->prev->next = link->next;
449f6d3c4bSStefan Richter link->next->prev = link->prev;
459f6d3c4bSStefan Richter }
469f6d3c4bSStefan Richter
479f6d3c4bSStefan Richter #define list_entry(link, type, member) \
489f6d3c4bSStefan Richter ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
499f6d3c4bSStefan Richter
509f6d3c4bSStefan Richter #define list_head(list, type, member) \
519f6d3c4bSStefan Richter list_entry((list)->next, type, member)
529f6d3c4bSStefan Richter
539f6d3c4bSStefan Richter #define list_tail(list, type, member) \
549f6d3c4bSStefan Richter list_entry((list)->prev, type, member)
559f6d3c4bSStefan Richter
569f6d3c4bSStefan Richter #define list_next(elm, member) \
579f6d3c4bSStefan Richter list_entry((elm)->member.next, typeof(*elm), member)
589f6d3c4bSStefan Richter
599f6d3c4bSStefan Richter #define list_for_each_entry(pos, list, member) \
609f6d3c4bSStefan Richter for (pos = list_head(list, typeof(*pos), member); \
619f6d3c4bSStefan Richter &pos->member != (list); \
629f6d3c4bSStefan Richter pos = list_next(pos, member))
639f6d3c4bSStefan Richter
64