1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2
3 #ifndef __LINUX_LIST_H
4 #define __LINUX_LIST_H
5
6 #include <linux/types.h>
7
8 #define LIST_HEAD_INIT(name) { &(name), &(name) }
9 #define LIST_HEAD(name) \
10 struct list_head name = LIST_HEAD_INIT(name)
11
12 #define POISON_POINTER_DELTA 0
13 #define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA)
14 #define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA)
15
16
INIT_LIST_HEAD(struct list_head * list)17 static inline void INIT_LIST_HEAD(struct list_head *list)
18 {
19 list->next = list;
20 list->prev = list;
21 }
22
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)23 static inline void __list_add(struct list_head *new,
24 struct list_head *prev,
25 struct list_head *next)
26 {
27 next->prev = new;
28 new->next = next;
29 new->prev = prev;
30 prev->next = new;
31 }
32
33 /**
34 * list_add - add a new entry
35 * @new: new entry to be added
36 * @head: list head to add it after
37 *
38 * Insert a new entry after the specified head.
39 * This is good for implementing stacks.
40 */
list_add(struct list_head * new,struct list_head * head)41 static inline void list_add(struct list_head *new, struct list_head *head)
42 {
43 __list_add(new, head, head->next);
44 }
45
46
47 /**
48 * list_add_tail - add a new entry
49 * @new: new entry to be added
50 * @head: list head to add it before
51 *
52 * Insert a new entry before the specified head.
53 * This is useful for implementing queues.
54 */
list_add_tail(struct list_head * new,struct list_head * head)55 static inline void list_add_tail(struct list_head *new, struct list_head *head)
56 {
57 __list_add(new, head->prev, head);
58 }
59
60 /*
61 * Delete a list entry by making the prev/next entries
62 * point to each other.
63 *
64 * This is only for internal list manipulation where we know
65 * the prev/next entries already!
66 */
__list_del(struct list_head * prev,struct list_head * next)67 static inline void __list_del(struct list_head * prev, struct list_head * next)
68 {
69 next->prev = prev;
70 prev->next = next;
71 }
72
73 /**
74 * list_del - deletes entry from list.
75 * @entry: the element to delete from the list.
76 * Note: list_empty() on entry does not return true after this, the entry is
77 * in an undefined state.
78 */
__list_del_entry(struct list_head * entry)79 static inline void __list_del_entry(struct list_head *entry)
80 {
81 __list_del(entry->prev, entry->next);
82 }
83
list_del(struct list_head * entry)84 static inline void list_del(struct list_head *entry)
85 {
86 __list_del(entry->prev, entry->next);
87 entry->next = LIST_POISON1;
88 entry->prev = LIST_POISON2;
89 }
90
list_empty(const struct list_head * head)91 static inline int list_empty(const struct list_head *head)
92 {
93 return head->next == head;
94 }
95
96 #define list_entry(ptr, type, member) \
97 container_of(ptr, type, member)
98 #define list_first_entry(ptr, type, member) \
99 list_entry((ptr)->next, type, member)
100 #define list_last_entry(ptr, type, member) \
101 list_entry((ptr)->prev, type, member)
102 #define list_next_entry(pos, member) \
103 list_entry((pos)->member.next, typeof(*(pos)), member)
104 #define list_prev_entry(pos, member) \
105 list_entry((pos)->member.prev, typeof(*(pos)), member)
106 #define list_for_each_entry(pos, head, member) \
107 for (pos = list_first_entry(head, typeof(*pos), member); \
108 &pos->member != (head); \
109 pos = list_next_entry(pos, member))
110 #define list_for_each_entry_from(pos, head, member) \
111 for (; &pos->member != (head); \
112 pos = list_next_entry(pos, member))
113 #define list_for_each_entry_safe(pos, n, head, member) \
114 for (pos = list_first_entry(head, typeof(*pos), member), \
115 n = list_next_entry(pos, member); \
116 &pos->member != (head); \
117 pos = n, n = list_next_entry(n, member))
118
119 #endif
120