Linux 3.0-rc7
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / net / rds / xlist.h
blobe6b5190dadddc7307d80bc0bc87bc2dc4436ded6
1 #ifndef _LINUX_XLIST_H
2 #define _LINUX_XLIST_H
4 #include <linux/stddef.h>
5 #include <linux/poison.h>
6 #include <linux/prefetch.h>
7 #include <asm/system.h>
9 struct xlist_head {
10 struct xlist_head *next;
13 static inline void INIT_XLIST_HEAD(struct xlist_head *list)
15 list->next = NULL;
18 static inline int xlist_empty(struct xlist_head *head)
20 return head->next == NULL;
23 static inline void xlist_add(struct xlist_head *new, struct xlist_head *tail,
24 struct xlist_head *head)
26 struct xlist_head *cur;
27 struct xlist_head *check;
29 while (1) {
30 cur = head->next;
31 tail->next = cur;
32 check = cmpxchg(&head->next, cur, new);
33 if (check == cur)
34 break;
38 static inline struct xlist_head *xlist_del_head(struct xlist_head *head)
40 struct xlist_head *cur;
41 struct xlist_head *check;
42 struct xlist_head *next;
44 while (1) {
45 cur = head->next;
46 if (!cur)
47 goto out;
49 next = cur->next;
50 check = cmpxchg(&head->next, cur, next);
51 if (check == cur)
52 goto out;
54 out:
55 return cur;
58 static inline struct xlist_head *xlist_del_head_fast(struct xlist_head *head)
60 struct xlist_head *cur;
62 cur = head->next;
63 if (!cur)
64 return NULL;
66 head->next = cur->next;
67 return cur;
70 static inline void xlist_splice(struct xlist_head *list,
71 struct xlist_head *head)
73 struct xlist_head *cur;
75 WARN_ON(head->next);
76 cur = xchg(&list->next, NULL);
77 head->next = cur;
80 #endif