5 #include <linux/types.h> 6 #include <linux/stddef.h> 7 #include <linux/poison.h> 8 #include <linux/const.h> 9 #include <linux/kernel.h> 10 #include <linux/prefetch.h> 11 #include <asm/system.h> 29 #define READ_ONCE(x) x 32 #define WRITE_ONCE(x,y) x = y 35 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 44 #define container_of(ptr, type, member) ({ \ 45 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 46 (type *)( (char *)__mptr - offsetof(type,member) );}) 70 #define LIST_HEAD_INIT(name) { &(name), &(name) } 72 #define LIST_HEAD(name) \ 73 struct list_head name = LIST_HEAD_INIT(name) 77 WRITE_ONCE(list->next, list);
81 #ifdef CONFIG_DEBUG_LIST 82 extern bool __list_add_valid(
struct list_head *newent,
85 extern bool __list_del_entry_valid(
struct list_head *entry);
92 newent++; prev++; next++;
111 if (!__list_add_valid(newent, prev, next))
117 WRITE_ONCE(prev->next, newent);
130 __list_add(newent, head, head->next);
144 __list_add(newent, head->prev, head);
157 WRITE_ONCE(prev->next, next);
168 if (!__list_del_entry_valid(entry))
171 __list_del(entry->prev, entry->next);
176 __list_del_entry(entry);
177 entry->next = (
struct list_head*)LIST_POISON1;
178 entry->prev = (
struct list_head*)LIST_POISON2;
191 newent->next = old->next;
192 newent->next->prev = newent;
193 newent->prev = old->prev;
194 newent->prev->next = newent;
200 list_replace(old, newent);
210 __list_del_entry(entry);
211 INIT_LIST_HEAD(entry);
221 __list_del_entry(list);
222 list_add(list, head);
233 __list_del_entry(list);
234 list_add_tail(list, head);
245 return list->next == head;
254 return READ_ONCE(head->next) == head;
273 return (next == head) && (next == head->prev);
284 if (!list_empty(head)) {
286 list_move_tail(first, head);
296 return !list_empty(head) && (head->next == head->prev);
302 struct list_head *new_first = entry->next;
303 list->next = head->next;
304 list->next->prev = list;
307 head->next = new_first;
308 new_first->prev = head;
328 if (list_empty(head))
330 if (list_is_singular(head) &&
331 (head->next != entry && head != entry))
334 INIT_LIST_HEAD(list);
336 __list_cut_position(list, head, entry);
361 if (!list_empty(list))
362 __list_splice(list, head, head->next);
373 if (!list_empty(list))
374 __list_splice(list, head->prev, head);
387 if (!list_empty(list)) {
388 __list_splice(list, head, head->next);
389 INIT_LIST_HEAD(list);
404 if (!list_empty(list)) {
405 __list_splice(list, head->prev, head);
406 INIT_LIST_HEAD(list);
416 #define list_entry(ptr, type, member) \ 417 container_of(ptr, type, member) 427 #define list_first_entry(ptr, type, member) \ 428 list_entry((ptr)->next, type, member) 438 #define list_last_entry(ptr, type, member) \ 439 list_entry((ptr)->prev, type, member) 449 #define list_first_entry_or_null(ptr, type, member) ({ \ 450 struct list_head *head__ = (ptr); \ 451 struct list_head *pos__ = READ_ONCE(head__->next); \ 452 pos__ != head__ ? list_entry(pos__, type, member) : NULL; \ 460 #define list_next_entry(pos, member) \ 461 list_entry((pos)->member.next, typeof(*(pos)), member) 468 #define list_prev_entry(pos, member) \ 469 list_entry((pos)->member.prev, typeof(*(pos)), member) 476 #define list_for_each(pos, head) \ 477 for (pos = (head)->next; pos != (head); pos = pos->next) 484 #define list_for_each_prev(pos, head) \ 485 for (pos = (head)->prev; pos != (head); pos = pos->prev) 493 #define list_for_each_safe(pos, n, head) \ 494 for (pos = (head)->next, n = pos->next; pos != (head); \ 495 pos = n, n = pos->next) 503 #define list_for_each_prev_safe(pos, n, head) \ 504 for (pos = (head)->prev, n = pos->prev; \ 506 pos = n, n = pos->prev) 514 #define list_for_each_entry(pos, head, member) \ 515 for (pos = list_first_entry(head, typeof(*pos), member); \ 516 &pos->member != (head); \ 517 pos = list_next_entry(pos, member)) 525 #define list_for_each_entry_reverse(pos, head, member) \ 526 for (pos = list_last_entry(head, typeof(*pos), member); \ 527 &pos->member != (head); \ 528 pos = list_prev_entry(pos, member)) 538 #define list_prepare_entry(pos, head, member) \ 539 ((pos) ? : list_entry(head, typeof(*pos), member)) 550 #define list_for_each_entry_continue(pos, head, member) \ 551 for (pos = list_next_entry(pos, member); \ 552 &pos->member != (head); \ 553 pos = list_next_entry(pos, member)) 564 #define list_for_each_entry_continue_reverse(pos, head, member) \ 565 for (pos = list_prev_entry(pos, member); \ 566 &pos->member != (head); \ 567 pos = list_prev_entry(pos, member)) 577 #define list_for_each_entry_from(pos, head, member) \ 578 for (; &pos->member != (head); \ 579 pos = list_next_entry(pos, member)) 590 #define list_for_each_entry_from_reverse(pos, head, member) \ 591 for (; &pos->member != (head); \ 592 pos = list_prev_entry(pos, member)) 601 #define list_for_each_entry_safe(pos, n, head, member) \ 602 for (pos = list_first_entry(head, typeof(*pos), member), \ 603 n = list_next_entry(pos, member); \ 604 &pos->member != (head); \ 605 pos = n, n = list_next_entry(n, member)) 617 #define list_for_each_entry_safe_continue(pos, n, head, member) \ 618 for (pos = list_next_entry(pos, member), \ 619 n = list_next_entry(pos, member); \ 620 &pos->member != (head); \ 621 pos = n, n = list_next_entry(n, member)) 633 #define list_for_each_entry_safe_from(pos, n, head, member) \ 634 for (n = list_next_entry(pos, member); \ 635 &pos->member != (head); \ 636 pos = n, n = list_next_entry(n, member)) 648 #define list_for_each_entry_safe_reverse(pos, n, head, member) \ 649 for (pos = list_last_entry(head, typeof(*pos), member), \ 650 n = list_prev_entry(pos, member); \ 651 &pos->member != (head); \ 652 pos = n, n = list_prev_entry(n, member)) 666 #define list_safe_reset_next(pos, n, member) \ 667 n = list_next_entry(pos, member) 676 #define HLIST_HEAD_INIT { .first = NULL } 677 #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } 678 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) 692 return !READ_ONCE(h->first);
700 WRITE_ONCE(*pprev, next);
714 if (!hlist_unhashed(n)) {
725 first->pprev = &n->next;
726 WRITE_ONCE(h->first, n);
727 n->pprev = &h->first;
734 n->pprev = next->pprev;
736 next->pprev = &n->next;
737 WRITE_ONCE(*(n->pprev), n);
743 n->next = prev->next;
744 WRITE_ONCE(prev->next, n);
745 n->pprev = &prev->next;
748 n->next->pprev = &n->next;
759 return h->pprev == &h->next;
769 return !n->next && n->pprev == &h->first;
779 newent->first = old->first;
781 newent->first->pprev = &newent->first;
785 #define hlist_entry(ptr, type, member) container_of(ptr,type,member) 787 #define hlist_for_each(pos, head) \ 788 for (pos = (head)->first; pos ; pos = pos->next) 790 #define hlist_for_each_safe(pos, n, head) \ 791 for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ 794 #define hlist_entry_safe(ptr, type, member) \ 795 ({ typeof(ptr) ____ptr = (ptr); \ 796 ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ 805 #define hlist_for_each_entry(pos, head, member) \ 806 for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ 808 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 815 #define hlist_for_each_entry_continue(pos, member) \ 816 for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ 818 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 825 #define hlist_for_each_entry_from(pos, member) \ 827 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 836 #define hlist_for_each_entry_safe(pos, n, head, member) \ 837 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ 838 pos && ({ n = pos->member.next; 1; }); \ 839 pos = hlist_entry_safe(n, typeof(*pos), member))
#define UPNP_INLINE
Declares an inline function.
Definition: UpnpGlobal.h:99
Defines constants that for some reason are not defined on some systems.