| #ifndef _LINUX_XLIST_H | 
 | #define _LINUX_XLIST_H | 
 |  | 
 | #include <linux/stddef.h> | 
 | #include <linux/poison.h> | 
 | #include <linux/prefetch.h> | 
 | #include <asm/system.h> | 
 |  | 
 | struct xlist_head { | 
 | 	struct xlist_head *next; | 
 | }; | 
 |  | 
 | static inline void INIT_XLIST_HEAD(struct xlist_head *list) | 
 | { | 
 | 	list->next = NULL; | 
 | } | 
 |  | 
 | static inline int xlist_empty(struct xlist_head *head) | 
 | { | 
 | 	return head->next == NULL; | 
 | } | 
 |  | 
 | static inline void xlist_add(struct xlist_head *new, struct xlist_head *tail, | 
 | 			     struct xlist_head *head) | 
 | { | 
 | 	struct xlist_head *cur; | 
 | 	struct xlist_head *check; | 
 |  | 
 | 	while (1) { | 
 | 		cur = head->next; | 
 | 		tail->next = cur; | 
 | 		check = cmpxchg(&head->next, cur, new); | 
 | 		if (check == cur) | 
 | 			break; | 
 | 	} | 
 | } | 
 |  | 
 | static inline struct xlist_head *xlist_del_head(struct xlist_head *head) | 
 | { | 
 | 	struct xlist_head *cur; | 
 | 	struct xlist_head *check; | 
 | 	struct xlist_head *next; | 
 |  | 
 | 	while (1) { | 
 | 		cur = head->next; | 
 | 		if (!cur) | 
 | 			goto out; | 
 |  | 
 | 		next = cur->next; | 
 | 		check = cmpxchg(&head->next, cur, next); | 
 | 		if (check == cur) | 
 | 			goto out; | 
 | 	} | 
 | out: | 
 | 	return cur; | 
 | } | 
 |  | 
 | static inline struct xlist_head *xlist_del_head_fast(struct xlist_head *head) | 
 | { | 
 | 	struct xlist_head *cur; | 
 |  | 
 | 	cur = head->next; | 
 | 	if (!cur) | 
 | 		return NULL; | 
 |  | 
 | 	head->next = cur->next; | 
 | 	return cur; | 
 | } | 
 |  | 
 | static inline void xlist_splice(struct xlist_head *list, | 
 | 				struct xlist_head *head) | 
 | { | 
 | 	struct xlist_head *cur; | 
 |  | 
 | 	WARN_ON(head->next); | 
 | 	cur = xchg(&list->next, NULL); | 
 | 	head->next = cur; | 
 | } | 
 |  | 
 | #endif |