1 #ifndef _LINUX_XLIST_H
2 #define _LINUX_XLIST_H
3 
4 #include <linux/stddef.h>
5 #include <linux/poison.h>
6 #include <linux/prefetch.h>
7 #include <asm/system.h>
8 
9 struct xlist_head {
10 	struct xlist_head *next;
11 };
12 
INIT_XLIST_HEAD(struct xlist_head * list)13 static inline void INIT_XLIST_HEAD(struct xlist_head *list)
14 {
15 	list->next = NULL;
16 }
17 
xlist_empty(struct xlist_head * head)18 static inline int xlist_empty(struct xlist_head *head)
19 {
20 	return head->next == NULL;
21 }
22 
xlist_add(struct xlist_head * new,struct xlist_head * tail,struct xlist_head * head)23 static inline void xlist_add(struct xlist_head *new, struct xlist_head *tail,
24 			     struct xlist_head *head)
25 {
26 	struct xlist_head *cur;
27 	struct xlist_head *check;
28 
29 	while (1) {
30 		cur = head->next;
31 		tail->next = cur;
32 		check = cmpxchg(&head->next, cur, new);
33 		if (check == cur)
34 			break;
35 	}
36 }
37 
xlist_del_head(struct xlist_head * head)38 static inline struct xlist_head *xlist_del_head(struct xlist_head *head)
39 {
40 	struct xlist_head *cur;
41 	struct xlist_head *check;
42 	struct xlist_head *next;
43 
44 	while (1) {
45 		cur = head->next;
46 		if (!cur)
47 			goto out;
48 
49 		next = cur->next;
50 		check = cmpxchg(&head->next, cur, next);
51 		if (check == cur)
52 			goto out;
53 	}
54 out:
55 	return cur;
56 }
57 
xlist_del_head_fast(struct xlist_head * head)58 static inline struct xlist_head *xlist_del_head_fast(struct xlist_head *head)
59 {
60 	struct xlist_head *cur;
61 
62 	cur = head->next;
63 	if (!cur)
64 		return NULL;
65 
66 	head->next = cur->next;
67 	return cur;
68 }
69 
xlist_splice(struct xlist_head * list,struct xlist_head * head)70 static inline void xlist_splice(struct xlist_head *list,
71 				struct xlist_head *head)
72 {
73 	struct xlist_head *cur;
74 
75 	WARN_ON(head->next);
76 	cur = xchg(&list->next, NULL);
77 	head->next = cur;
78 }
79 
80 #endif
81