Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


0d5b907079e7d5d7941bd69ff615d033ec28ea56
[palacios.git] / palacios / include / palacios / vmm_list.h
1 /* Stolen From Linux list implementation */
2 /* 2008, Modifications by Jack Lange <jarusl@cs.northwestern.edu> */
3
4
5 #ifndef _VMM_LIST_H
6 #define _VMM_LIST_H
7
8
9 #ifdef __V3VEE__
10
11 #include <palacios/vmm_string.h>
12
13 #undef offsetof
14 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
15
16
17 #define container_of(ptr, type, member) ({                      \
18         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
19         (type *)( (char *)__mptr - offsetof(type,member) );})
20
21
22 static inline void prefetch(const void *x) {const void * foo; foo = x;}
23
24 /*
25  * These are non-NULL pointers that will result in page faults
26  * under normal circumstances, used to verify that nobody uses
27  * non-initialized list entries.
28  */
29 #define LIST_POISON1  ((void *) 0x00100100)
30 #define LIST_POISON2  ((void *) 0x00200200)
31
32 /*
33  * Simple doubly linked list implementation.
34  *
35  * Some of the internal functions ("__xxx") are useful when
36  * manipulating whole lists rather than single entries, as
37  * sometimes we already know the next/prev entries and we can
38  * generate better code by using them directly rather than
39  * using the generic single-entry routines.
40  */
41
42 struct list_head {
43         struct list_head *next, *prev;
44 };
45
46 #define LIST_HEAD_INIT(name) { &(name), &(name) }
47
48 #define LIST_HEAD(name) \
49         struct list_head name = LIST_HEAD_INIT(name)
50
51 static inline void INIT_LIST_HEAD(struct list_head *list)
52 {
53         list->next = list;
54         list->prev = list;
55 }
56
57 /*
58  * Insert a new entry between two known consecutive entries.
59  *
60  * This is only for internal list manipulation where we know
61  * the prev/next entries already!
62  */
63 static inline void __list_add(struct list_head *new,
64                               struct list_head *prev,
65                               struct list_head *next)
66 {
67         next->prev = new;
68         new->next = next;
69         new->prev = prev;
70         prev->next = new;
71 }
72
73 /**
74  * list_add - add a new entry
75  * @new: new entry to be added
76  * @head: list head to add it after
77  *
78  * Insert a new entry after the specified head.
79  * This is good for implementing stacks.
80  */
81 static inline void list_add(struct list_head *new, struct list_head *head)
82 {
83         __list_add(new, head, head->next);
84 }
85
86 /**
87  * list_add_tail - add a new entry
88  * @new: new entry to be added
89  * @head: list head to add it before
90  *
91  * Insert a new entry before the specified head.
92  * This is useful for implementing queues.
93  */
94 static inline void list_add_tail(struct list_head *new, struct list_head *head)
95 {
96         __list_add(new, head->prev, head);
97 }
98
99 /*
100  * Delete a list entry by making the prev/next entries
101  * point to each other.
102  *
103  * This is only for internal list manipulation where we know
104  * the prev/next entries already!
105  */
106 static inline void __list_del(struct list_head * prev, struct list_head * next)
107 {
108         next->prev = prev;
109         prev->next = next;
110 }
111
112 /**
113  * list_del - deletes entry from list.
114  * @entry: the element to delete from the list.
115  * Note: list_empty on entry does not return true after this, the entry is
116  * in an undefined state.
117  */
118 static inline void list_del(struct list_head *entry)
119 {
120         __list_del(entry->prev, entry->next);
121         entry->next = LIST_POISON1;
122         entry->prev = LIST_POISON2;
123 }
124
125 /**
126  * list_del_init - deletes entry from list and reinitialize it.
127  * @entry: the element to delete from the list.
128  */
129 static inline void list_del_init(struct list_head *entry)
130 {
131         __list_del(entry->prev, entry->next);
132         INIT_LIST_HEAD(entry);
133 }
134
135 /**
136  * list_move - delete from one list and add as another's head
137  * @list: the entry to move
138  * @head: the head that will precede our entry
139  */
140 static inline void list_move(struct list_head *list, struct list_head *head)
141 {
142         __list_del(list->prev, list->next);
143         list_add(list, head);
144 }
145
146 /**
147  * list_move_tail - delete from one list and add as another's tail
148  * @list: the entry to move
149  * @head: the head that will follow our entry
150  */
151 static inline void list_move_tail(struct list_head *list,
152                                   struct list_head *head)
153 {
154         __list_del(list->prev, list->next);
155         list_add_tail(list, head);
156 }
157
158 /**
159  * list_empty - tests whether a list is empty
160  * @head: the list to test.
161  */
162 static inline int list_empty(const struct list_head *head)
163 {
164         return head->next == head;
165 }
166
167 /**
168  * list_empty_careful - tests whether a list is
169  * empty _and_ checks that no other CPU might be
170  * in the process of still modifying either member
171  *
172  * NOTE: using list_empty_careful() without synchronization
173  * can only be safe if the only activity that can happen
174  * to the list entry is list_del_init(). Eg. it cannot be used
175  * if another CPU could re-list_add() it.
176  *
177  * @head: the list to test.
178  */
179 static inline int list_empty_careful(const struct list_head *head)
180 {
181         struct list_head *next = head->next;
182         return (next == head) && (next == head->prev);
183 }
184
185 static inline void __list_splice(struct list_head *list,
186                                  struct list_head *head)
187 {
188         struct list_head *first = list->next;
189         struct list_head *last = list->prev;
190         struct list_head *at = head->next;
191
192         first->prev = head;
193         head->next = first;
194
195         last->next = at;
196         at->prev = last;
197 }
198
199 /**
200  * list_splice - join two lists
201  * @list: the new list to add.
202  * @head: the place to add it in the first list.
203  */
204 static inline void list_splice(struct list_head *list, struct list_head *head)
205 {
206         if (!list_empty(list))
207                 __list_splice(list, head);
208 }
209
210 /**
211  * list_splice_init - join two lists and reinitialise the emptied list.
212  * @list: the new list to add.
213  * @head: the place to add it in the first list.
214  *
215  * The list at @list is reinitialised
216  */
217 static inline void list_splice_init(struct list_head *list,
218                                     struct list_head *head)
219 {
220         if (!list_empty(list)) {
221                 __list_splice(list, head);
222                 INIT_LIST_HEAD(list);
223         }
224 }
225
226 /**
227  * list_entry - get the struct for this entry
228  * @ptr:        the &struct list_head pointer.
229  * @type:       the type of the struct this is embedded in.
230  * @member:     the name of the list_struct within the struct.
231  */
232 #define list_entry(ptr, type, member) \
233         container_of(ptr, type, member)
234
235 /**
236  * list_entry - get the struct for the tail entry
237  * @ptr:        the list_head head pointer.
238  * @type:       the type of the struct this is embedded in.
239  * @member:     the name of the list_struct within the struct.
240  */
241 #define list_tail_entry(head, type, member) ({  \
242       type * tail = NULL;                       \
243       if ((head)->prev != (head)) {                     \
244         tail = list_entry((head)->prev, type, member);  \
245       }                                                 \
246       tail;                                             \
247 })
248
249 /**
250  * list_for_each        -       iterate over a list
251  * @pos:        the &struct list_head to use as a loop counter.
252  * @head:       the head for your list.
253  */
254 #define list_for_each(pos, head) \
255         for (pos = (head)->next; prefetch(pos->next), pos != (head); \
256                 pos = pos->next)
257
258 /**
259  * __list_for_each      -       iterate over a list
260  * @pos:        the &struct list_head to use as a loop counter.
261  * @head:       the head for your list.
262  *
263  * This variant differs from list_for_each() in that it's the
264  * simplest possible list iteration code, no prefetching is done.
265  * Use this for code that knows the list to be very short (empty
266  * or 1 entry) most of the time.
267  */
268 #define __list_for_each(pos, head) \
269         for (pos = (head)->next; pos != (head); pos = pos->next)
270
271 /**
272  * list_for_each_prev   -       iterate over a list backwards
273  * @pos:        the &struct list_head to use as a loop counter.
274  * @head:       the head for your list.
275  */
276 #define list_for_each_prev(pos, head) \
277         for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
278                 pos = pos->prev)
279
280 /**
281  * list_for_each_safe   -       iterate over a list safe against removal of list entry
282  * @pos:        the &struct list_head to use as a loop counter.
283  * @n:          another &struct list_head to use as temporary storage
284  * @head:       the head for your list.
285  */
286 #define list_for_each_safe(pos, n, head) \
287         for (pos = (head)->next, n = pos->next; pos != (head); \
288                 pos = n, n = pos->next)
289
290 /**
291  * list_for_each_entry  -       iterate over list of given type
292  * @pos:        the type * to use as a loop counter.
293  * @head:       the head for your list.
294  * @member:     the name of the list_struct within the struct.
295  */
296 #define list_for_each_entry(pos, head, member)                          \
297         for (pos = list_entry((head)->next, typeof(*pos), member);      \
298              prefetch(pos->member.next), &pos->member != (head);        \
299              pos = list_entry(pos->member.next, typeof(*pos), member))
300
301 /**
302  * list_for_each_entry_reverse - iterate backwards over list of given type.
303  * @pos:        the type * to use as a loop counter.
304  * @head:       the head for your list.
305  * @member:     the name of the list_struct within the struct.
306  */
307 #define list_for_each_entry_reverse(pos, head, member)                  \
308         for (pos = list_entry((head)->prev, typeof(*pos), member);      \
309              prefetch(pos->member.prev), &pos->member != (head);        \
310              pos = list_entry(pos->member.prev, typeof(*pos), member))
311
312 /**
313  * list_prepare_entry - prepare a pos entry for use as a start point in
314  *                      list_for_each_entry_continue
315  * @pos:        the type * to use as a start point
316  * @head:       the head of the list
317  * @member:     the name of the list_struct within the struct.
318  */
319 #define list_prepare_entry(pos, head, member) \
320         ((pos) ? : list_entry(head, typeof(*pos), member))
321
322 /**
323  * list_for_each_entry_continue -       iterate over list of given type
324  *                      continuing after existing point
325  * @pos:        the type * to use as a loop counter.
326  * @head:       the head for your list.
327  * @member:     the name of the list_struct within the struct.
328  */
329 #define list_for_each_entry_continue(pos, head, member)                 \
330         for (pos = list_entry(pos->member.next, typeof(*pos), member);  \
331              prefetch(pos->member.next), &pos->member != (head);        \
332              pos = list_entry(pos->member.next, typeof(*pos), member))
333
334 /**
335  * list_for_each_entry_from -   iterate over list of given type
336  *                      continuing from existing point
337  * @pos:        the type * to use as a loop counter.
338  * @head:       the head for your list.
339  * @member:     the name of the list_struct within the struct.
340  */
341 #define list_for_each_entry_from(pos, head, member)                     \
342         for (; prefetch(pos->member.next), &pos->member != (head);      \
343              pos = list_entry(pos->member.next, typeof(*pos), member))
344
345 /**
346  * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
347  * @pos:        the type * to use as a loop counter.
348  * @n:          another type * to use as temporary storage
349  * @head:       the head for your list.
350  * @member:     the name of the list_struct within the struct.
351  */
352 #define list_for_each_entry_safe(pos, n, head, member)                  \
353         for (pos = list_entry((head)->next, typeof(*pos), member),      \
354                 n = list_entry(pos->member.next, typeof(*pos), member); \
355              &pos->member != (head);                                    \
356              pos = n, n = list_entry(n->member.next, typeof(*n), member))
357
358 /**
359  * list_for_each_entry_safe_continue -  iterate over list of given type
360  *                      continuing after existing point safe against removal of list entry
361  * @pos:        the type * to use as a loop counter.
362  * @n:          another type * to use as temporary storage
363  * @head:       the head for your list.
364  * @member:     the name of the list_struct within the struct.
365  */
366 #define list_for_each_entry_safe_continue(pos, n, head, member)                 \
367         for (pos = list_entry(pos->member.next, typeof(*pos), member),          \
368                 n = list_entry(pos->member.next, typeof(*pos), member);         \
369              &pos->member != (head);                                            \
370              pos = n, n = list_entry(n->member.next, typeof(*n), member))
371
372 /**
373  * list_for_each_entry_safe_from - iterate over list of given type
374  *                      from existing point safe against removal of list entry
375  * @pos:        the type * to use as a loop counter.
376  * @n:          another type * to use as temporary storage
377  * @head:       the head for your list.
378  * @member:     the name of the list_struct within the struct.
379  */
380 #define list_for_each_entry_safe_from(pos, n, head, member)                     \
381         for (n = list_entry(pos->member.next, typeof(*pos), member);            \
382              &pos->member != (head);                                            \
383              pos = n, n = list_entry(n->member.next, typeof(*n), member))
384
385 /**
386  * list_for_each_entry_safe_reverse - iterate backwards over list of given type safe against
387  *                                    removal of list entry
388  * @pos:        the type * to use as a loop counter.
389  * @n:          another type * to use as temporary storage
390  * @head:       the head for your list.
391  * @member:     the name of the list_struct within the struct.
392  */
393 #define list_for_each_entry_safe_reverse(pos, n, head, member)          \
394         for (pos = list_entry((head)->prev, typeof(*pos), member),      \
395                 n = list_entry(pos->member.prev, typeof(*pos), member); \
396              &pos->member != (head);                                    \
397              pos = n, n = list_entry(n->member.prev, typeof(*n), member))
398
399 /*
400  * Double linked lists with a single pointer list head.
401  * Mostly useful for hash tables where the two pointer list head is
402  * too wasteful.
403  * You lose the ability to access the tail in O(1).
404  */
405
406 struct hlist_head {
407         struct hlist_node *first;
408 };
409
410 struct hlist_node {
411         struct hlist_node *next, **pprev;
412 };
413
414 #define HLIST_HEAD_INIT { .first = NULL }
415 #define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
416 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
417 static inline void INIT_HLIST_NODE(struct hlist_node *h)
418 {
419         h->next = NULL;
420         h->pprev = NULL;
421 }
422
423 static inline int hlist_unhashed(const struct hlist_node *h)
424 {
425         return !h->pprev;
426 }
427
428 static inline int hlist_empty(const struct hlist_head *h)
429 {
430         return !h->first;
431 }
432
433 static inline void __hlist_del(struct hlist_node *n)
434 {
435         struct hlist_node *next = n->next;
436         struct hlist_node **pprev = n->pprev;
437         *pprev = next;
438         if (next)
439                 next->pprev = pprev;
440 }
441
442 static inline void hlist_del(struct hlist_node *n)
443 {
444         __hlist_del(n);
445         n->next = LIST_POISON1;
446         n->pprev = LIST_POISON2;
447 }
448
449 static inline void hlist_del_init(struct hlist_node *n)
450 {
451         if (!hlist_unhashed(n)) {
452                 __hlist_del(n);
453                 INIT_HLIST_NODE(n);
454         }
455 }
456
457 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
458 {
459         struct hlist_node *first = h->first;
460         n->next = first;
461         if (first)
462                 first->pprev = &n->next;
463         h->first = n;
464         n->pprev = &h->first;
465 }
466
467 /* next must be != NULL */
468 static inline void hlist_add_before(struct hlist_node *n,
469                                         struct hlist_node *next)
470 {
471         n->pprev = next->pprev;
472         n->next = next;
473         next->pprev = &n->next;
474         *(n->pprev) = n;
475 }
476
477 static inline void hlist_add_after(struct hlist_node *n,
478                                         struct hlist_node *next)
479 {
480         next->next = n->next;
481         n->next = next;
482         next->pprev = &n->next;
483
484         if(next->next)
485                 next->next->pprev  = &next->next;
486 }
487
488 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
489
490 #define hlist_for_each(pos, head) \
491         for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
492              pos = pos->next)
493
494 #define hlist_for_each_safe(pos, n, head) \
495         for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
496              pos = n)
497
498 /**
499  * hlist_for_each_entry - iterate over list of given type
500  * @tpos:       the type * to use as a loop counter.
501  * @pos:        the &struct hlist_node to use as a loop counter.
502  * @head:       the head for your list.
503  * @member:     the name of the hlist_node within the struct.
504  */
505 #define hlist_for_each_entry(tpos, pos, head, member)                    \
506         for (pos = (head)->first;                                        \
507              pos && ({ prefetch(pos->next); 1;}) &&                      \
508                 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
509              pos = pos->next)
510
511 /**
512  * hlist_for_each_entry_continue - iterate over a hlist continuing after existing point
513  * @tpos:       the type * to use as a loop counter.
514  * @pos:        the &struct hlist_node to use as a loop counter.
515  * @member:     the name of the hlist_node within the struct.
516  */
517 #define hlist_for_each_entry_continue(tpos, pos, member)                 \
518         for (pos = (pos)->next;                                          \
519              pos && ({ prefetch(pos->next); 1;}) &&                      \
520                 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
521              pos = pos->next)
522
523 /**
524  * hlist_for_each_entry_from - iterate over a hlist continuing from existing point
525  * @tpos:       the type * to use as a loop counter.
526  * @pos:        the &struct hlist_node to use as a loop counter.
527  * @member:     the name of the hlist_node within the struct.
528  */
529 #define hlist_for_each_entry_from(tpos, pos, member)                     \
530         for (; pos && ({ prefetch(pos->next); 1;}) &&                    \
531                 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
532              pos = pos->next)
533
534 /**
535  * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
536  * @tpos:       the type * to use as a loop counter.
537  * @pos:        the &struct hlist_node to use as a loop counter.
538  * @n:          another &struct hlist_node to use as temporary storage
539  * @head:       the head for your list.
540  * @member:     the name of the hlist_node within the struct.
541  */
542 #define hlist_for_each_entry_safe(tpos, pos, n, head, member)            \
543         for (pos = (head)->first;                                        \
544              pos && ({ n = pos->next; 1; }) &&                           \
545                 ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
546              pos = n)
547
548
549
550 #endif // ! __V3VEE__
551
552 #endif