Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/rds/xlist.h
15109 views
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
13
static inline void INIT_XLIST_HEAD(struct xlist_head *list)
14
{
15
list->next = NULL;
16
}
17
18
static inline int xlist_empty(struct xlist_head *head)
19
{
20
return head->next == NULL;
21
}
22
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
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
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
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
82