blob: e6b5190dadddc7307d80bc0bc87bc2dc4436ded6 [file] [log] [blame]
Chris Mason6fa70da2010-06-11 11:17:59 -07001#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
9struct xlist_head {
10 struct xlist_head *next;
11};
12
Andy Groverfbf4d7e2010-06-11 16:24:42 -070013static inline void INIT_XLIST_HEAD(struct xlist_head *list)
14{
15 list->next = NULL;
16}
Chris Mason6fa70da2010-06-11 11:17:59 -070017
Andy Groverfbf4d7e2010-06-11 16:24:42 -070018static inline int xlist_empty(struct xlist_head *head)
19{
20 return head->next == NULL;
21}
22
23static inline void xlist_add(struct xlist_head *new, struct xlist_head *tail,
24 struct xlist_head *head)
Chris Mason6fa70da2010-06-11 11:17:59 -070025{
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
Chris Mason6fa70da2010-06-11 11:17:59 -070038static 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
Chris Mason6fa70da2010-06-11 11:17:59 -070049 next = cur->next;
50 check = cmpxchg(&head->next, cur, next);
51 if (check == cur)
52 goto out;
53 }
54out:
55 return cur;
56}
57
58static inline struct xlist_head *xlist_del_head_fast(struct xlist_head *head)
59{
60 struct xlist_head *cur;
61
62 cur = head->next;
Andy Groverfbf4d7e2010-06-11 16:24:42 -070063 if (!cur)
Chris Mason6fa70da2010-06-11 11:17:59 -070064 return NULL;
65
66 head->next = cur->next;
67 return cur;
68}
69
70static 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
Chris Mason6fa70da2010-06-11 11:17:59 -070080#endif