.. | .. |
---|
23 | 23 | #define LIST_HEAD(name) \ |
---|
24 | 24 | struct list_head name = LIST_HEAD_INIT(name) |
---|
25 | 25 | |
---|
| 26 | +/** |
---|
| 27 | + * INIT_LIST_HEAD - Initialize a list_head structure |
---|
| 28 | + * @list: list_head structure to be initialized. |
---|
| 29 | + * |
---|
| 30 | + * Initializes the list_head to point to itself. If it is a list header, |
---|
| 31 | + * the result is an empty list. |
---|
| 32 | + */ |
---|
26 | 33 | static inline void INIT_LIST_HEAD(struct list_head *list) |
---|
27 | 34 | { |
---|
28 | 35 | WRITE_ONCE(list->next, list); |
---|
.. | .. |
---|
106 | 113 | WRITE_ONCE(prev->next, next); |
---|
107 | 114 | } |
---|
108 | 115 | |
---|
109 | | -/** |
---|
110 | | - * list_del - deletes entry from list. |
---|
111 | | - * @entry: the element to delete from the list. |
---|
112 | | - * Note: list_empty() on entry does not return true after this, the entry is |
---|
113 | | - * in an undefined state. |
---|
| 116 | +/* |
---|
| 117 | + * Delete a list entry and clear the 'prev' pointer. |
---|
| 118 | + * |
---|
| 119 | + * This is a special-purpose list clearing method used in the networking code |
---|
| 120 | + * for lists allocated as per-cpu, where we don't want to incur the extra |
---|
| 121 | + * WRITE_ONCE() overhead of a regular list_del_init(). The code that uses this |
---|
| 122 | + * needs to check the node 'prev' pointer instead of calling list_empty(). |
---|
114 | 123 | */ |
---|
| 124 | +static inline void __list_del_clearprev(struct list_head *entry) |
---|
| 125 | +{ |
---|
| 126 | + __list_del(entry->prev, entry->next); |
---|
| 127 | + entry->prev = NULL; |
---|
| 128 | +} |
---|
| 129 | + |
---|
115 | 130 | static inline void __list_del_entry(struct list_head *entry) |
---|
116 | 131 | { |
---|
117 | 132 | if (!__list_del_entry_valid(entry)) |
---|
.. | .. |
---|
120 | 135 | __list_del(entry->prev, entry->next); |
---|
121 | 136 | } |
---|
122 | 137 | |
---|
| 138 | +/** |
---|
| 139 | + * list_del - deletes entry from list. |
---|
| 140 | + * @entry: the element to delete from the list. |
---|
| 141 | + * Note: list_empty() on entry does not return true after this, the entry is |
---|
| 142 | + * in an undefined state. |
---|
| 143 | + */ |
---|
123 | 144 | static inline void list_del(struct list_head *entry) |
---|
124 | 145 | { |
---|
125 | 146 | __list_del_entry(entry); |
---|
.. | .. |
---|
143 | 164 | new->prev->next = new; |
---|
144 | 165 | } |
---|
145 | 166 | |
---|
| 167 | +/** |
---|
| 168 | + * list_replace_init - replace old entry by new one and initialize the old one |
---|
| 169 | + * @old : the element to be replaced |
---|
| 170 | + * @new : the new element to insert |
---|
| 171 | + * |
---|
| 172 | + * If @old was empty, it will be overwritten. |
---|
| 173 | + */ |
---|
146 | 174 | static inline void list_replace_init(struct list_head *old, |
---|
147 | | - struct list_head *new) |
---|
| 175 | + struct list_head *new) |
---|
148 | 176 | { |
---|
149 | 177 | list_replace(old, new); |
---|
150 | 178 | INIT_LIST_HEAD(old); |
---|
| 179 | +} |
---|
| 180 | + |
---|
| 181 | +/** |
---|
| 182 | + * list_swap - replace entry1 with entry2 and re-add entry1 at entry2's position |
---|
| 183 | + * @entry1: the location to place entry2 |
---|
| 184 | + * @entry2: the location to place entry1 |
---|
| 185 | + */ |
---|
| 186 | +static inline void list_swap(struct list_head *entry1, |
---|
| 187 | + struct list_head *entry2) |
---|
| 188 | +{ |
---|
| 189 | + struct list_head *pos = entry2->prev; |
---|
| 190 | + |
---|
| 191 | + list_del(entry2); |
---|
| 192 | + list_replace(entry1, entry2); |
---|
| 193 | + if (pos == entry1) |
---|
| 194 | + pos = entry2; |
---|
| 195 | + list_add(entry1, pos); |
---|
151 | 196 | } |
---|
152 | 197 | |
---|
153 | 198 | /** |
---|
.. | .. |
---|
184 | 229 | } |
---|
185 | 230 | |
---|
186 | 231 | /** |
---|
| 232 | + * list_bulk_move_tail - move a subsection of a list to its tail |
---|
| 233 | + * @head: the head that will follow our entry |
---|
| 234 | + * @first: first entry to move |
---|
| 235 | + * @last: last entry to move, can be the same as first |
---|
| 236 | + * |
---|
| 237 | + * Move all entries between @first and including @last before @head. |
---|
| 238 | + * All three entries must belong to the same linked list. |
---|
| 239 | + */ |
---|
| 240 | +static inline void list_bulk_move_tail(struct list_head *head, |
---|
| 241 | + struct list_head *first, |
---|
| 242 | + struct list_head *last) |
---|
| 243 | +{ |
---|
| 244 | + first->prev->next = last->next; |
---|
| 245 | + last->next->prev = first->prev; |
---|
| 246 | + |
---|
| 247 | + head->prev->next = first; |
---|
| 248 | + first->prev = head->prev; |
---|
| 249 | + |
---|
| 250 | + last->next = head; |
---|
| 251 | + head->prev = last; |
---|
| 252 | +} |
---|
| 253 | + |
---|
| 254 | +/** |
---|
| 255 | + * list_is_first -- tests whether @list is the first entry in list @head |
---|
| 256 | + * @list: the entry to test |
---|
| 257 | + * @head: the head of the list |
---|
| 258 | + */ |
---|
| 259 | +static inline int list_is_first(const struct list_head *list, |
---|
| 260 | + const struct list_head *head) |
---|
| 261 | +{ |
---|
| 262 | + return list->prev == head; |
---|
| 263 | +} |
---|
| 264 | + |
---|
| 265 | +/** |
---|
187 | 266 | * list_is_last - tests whether @list is the last entry in list @head |
---|
188 | 267 | * @list: the entry to test |
---|
189 | 268 | * @head: the head of the list |
---|
.. | .. |
---|
204 | 283 | } |
---|
205 | 284 | |
---|
206 | 285 | /** |
---|
| 286 | + * list_del_init_careful - deletes entry from list and reinitialize it. |
---|
| 287 | + * @entry: the element to delete from the list. |
---|
| 288 | + * |
---|
| 289 | + * This is the same as list_del_init(), except designed to be used |
---|
| 290 | + * together with list_empty_careful() in a way to guarantee ordering |
---|
| 291 | + * of other memory operations. |
---|
| 292 | + * |
---|
| 293 | + * Any memory operations done before a list_del_init_careful() are |
---|
| 294 | + * guaranteed to be visible after a list_empty_careful() test. |
---|
| 295 | + */ |
---|
| 296 | +static inline void list_del_init_careful(struct list_head *entry) |
---|
| 297 | +{ |
---|
| 298 | + __list_del_entry(entry); |
---|
| 299 | + entry->prev = entry; |
---|
| 300 | + smp_store_release(&entry->next, entry); |
---|
| 301 | +} |
---|
| 302 | + |
---|
| 303 | +/** |
---|
207 | 304 | * list_empty_careful - tests whether a list is empty and not being modified |
---|
208 | 305 | * @head: the list to test |
---|
209 | 306 | * |
---|
.. | .. |
---|
218 | 315 | */ |
---|
219 | 316 | static inline int list_empty_careful(const struct list_head *head) |
---|
220 | 317 | { |
---|
221 | | - struct list_head *next = head->next; |
---|
| 318 | + struct list_head *next = smp_load_acquire(&head->next); |
---|
222 | 319 | return (next == head) && (next == head->prev); |
---|
223 | 320 | } |
---|
224 | 321 | |
---|
.. | .. |
---|
234 | 331 | first = head->next; |
---|
235 | 332 | list_move_tail(first, head); |
---|
236 | 333 | } |
---|
| 334 | +} |
---|
| 335 | + |
---|
| 336 | +/** |
---|
| 337 | + * list_rotate_to_front() - Rotate list to specific item. |
---|
| 338 | + * @list: The desired new front of the list. |
---|
| 339 | + * @head: The head of the list. |
---|
| 340 | + * |
---|
| 341 | + * Rotates list so that @list becomes the new front of the list. |
---|
| 342 | + */ |
---|
| 343 | +static inline void list_rotate_to_front(struct list_head *list, |
---|
| 344 | + struct list_head *head) |
---|
| 345 | +{ |
---|
| 346 | + /* |
---|
| 347 | + * Deletes the list head from the list denoted by @head and |
---|
| 348 | + * places it as the tail of @list, this effectively rotates the |
---|
| 349 | + * list so that @list is at the front. |
---|
| 350 | + */ |
---|
| 351 | + list_move_tail(head, list); |
---|
237 | 352 | } |
---|
238 | 353 | |
---|
239 | 354 | /** |
---|
.. | .. |
---|
456 | 571 | for (pos = (head)->next; pos != (head); pos = pos->next) |
---|
457 | 572 | |
---|
458 | 573 | /** |
---|
| 574 | + * list_for_each_continue - continue iteration over a list |
---|
| 575 | + * @pos: the &struct list_head to use as a loop cursor. |
---|
| 576 | + * @head: the head for your list. |
---|
| 577 | + * |
---|
| 578 | + * Continue to iterate over a list, continuing after the current position. |
---|
| 579 | + */ |
---|
| 580 | +#define list_for_each_continue(pos, head) \ |
---|
| 581 | + for (pos = pos->next; pos != (head); pos = pos->next) |
---|
| 582 | + |
---|
| 583 | +/** |
---|
459 | 584 | * list_for_each_prev - iterate over a list backwards |
---|
460 | 585 | * @pos: the &struct list_head to use as a loop cursor. |
---|
461 | 586 | * @head: the head for your list. |
---|
.. | .. |
---|
670 | 795 | h->pprev = NULL; |
---|
671 | 796 | } |
---|
672 | 797 | |
---|
| 798 | +/** |
---|
| 799 | + * hlist_unhashed - Has node been removed from list and reinitialized? |
---|
| 800 | + * @h: Node to be checked |
---|
| 801 | + * |
---|
| 802 | + * Not that not all removal functions will leave a node in unhashed |
---|
| 803 | + * state. For example, hlist_nulls_del_init_rcu() does leave the |
---|
| 804 | + * node in unhashed state, but hlist_nulls_del() does not. |
---|
| 805 | + */ |
---|
673 | 806 | static inline int hlist_unhashed(const struct hlist_node *h) |
---|
674 | 807 | { |
---|
675 | 808 | return !h->pprev; |
---|
676 | 809 | } |
---|
677 | 810 | |
---|
| 811 | +/** |
---|
| 812 | + * hlist_unhashed_lockless - Version of hlist_unhashed for lockless use |
---|
| 813 | + * @h: Node to be checked |
---|
| 814 | + * |
---|
| 815 | + * This variant of hlist_unhashed() must be used in lockless contexts |
---|
| 816 | + * to avoid potential load-tearing. The READ_ONCE() is paired with the |
---|
| 817 | + * various WRITE_ONCE() in hlist helpers that are defined below. |
---|
| 818 | + */ |
---|
| 819 | +static inline int hlist_unhashed_lockless(const struct hlist_node *h) |
---|
| 820 | +{ |
---|
| 821 | + return !READ_ONCE(h->pprev); |
---|
| 822 | +} |
---|
| 823 | + |
---|
| 824 | +/** |
---|
| 825 | + * hlist_empty - Is the specified hlist_head structure an empty hlist? |
---|
| 826 | + * @h: Structure to check. |
---|
| 827 | + */ |
---|
678 | 828 | static inline int hlist_empty(const struct hlist_head *h) |
---|
679 | 829 | { |
---|
680 | 830 | return !READ_ONCE(h->first); |
---|
.. | .. |
---|
687 | 837 | |
---|
688 | 838 | WRITE_ONCE(*pprev, next); |
---|
689 | 839 | if (next) |
---|
690 | | - next->pprev = pprev; |
---|
| 840 | + WRITE_ONCE(next->pprev, pprev); |
---|
691 | 841 | } |
---|
692 | 842 | |
---|
| 843 | +/** |
---|
| 844 | + * hlist_del - Delete the specified hlist_node from its list |
---|
| 845 | + * @n: Node to delete. |
---|
| 846 | + * |
---|
| 847 | + * Note that this function leaves the node in hashed state. Use |
---|
| 848 | + * hlist_del_init() or similar instead to unhash @n. |
---|
| 849 | + */ |
---|
693 | 850 | static inline void hlist_del(struct hlist_node *n) |
---|
694 | 851 | { |
---|
695 | 852 | __hlist_del(n); |
---|
.. | .. |
---|
697 | 854 | n->pprev = LIST_POISON2; |
---|
698 | 855 | } |
---|
699 | 856 | |
---|
| 857 | +/** |
---|
| 858 | + * hlist_del_init - Delete the specified hlist_node from its list and initialize |
---|
| 859 | + * @n: Node to delete. |
---|
| 860 | + * |
---|
| 861 | + * Note that this function leaves the node in unhashed state. |
---|
| 862 | + */ |
---|
700 | 863 | static inline void hlist_del_init(struct hlist_node *n) |
---|
701 | 864 | { |
---|
702 | 865 | if (!hlist_unhashed(n)) { |
---|
.. | .. |
---|
705 | 868 | } |
---|
706 | 869 | } |
---|
707 | 870 | |
---|
| 871 | +/** |
---|
| 872 | + * hlist_add_head - add a new entry at the beginning of the hlist |
---|
| 873 | + * @n: new entry to be added |
---|
| 874 | + * @h: hlist head to add it after |
---|
| 875 | + * |
---|
| 876 | + * Insert a new entry after the specified head. |
---|
| 877 | + * This is good for implementing stacks. |
---|
| 878 | + */ |
---|
708 | 879 | static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) |
---|
709 | 880 | { |
---|
710 | 881 | struct hlist_node *first = h->first; |
---|
711 | | - n->next = first; |
---|
| 882 | + WRITE_ONCE(n->next, first); |
---|
712 | 883 | if (first) |
---|
713 | | - first->pprev = &n->next; |
---|
| 884 | + WRITE_ONCE(first->pprev, &n->next); |
---|
714 | 885 | WRITE_ONCE(h->first, n); |
---|
715 | | - n->pprev = &h->first; |
---|
| 886 | + WRITE_ONCE(n->pprev, &h->first); |
---|
716 | 887 | } |
---|
717 | 888 | |
---|
718 | | -/* next must be != NULL */ |
---|
| 889 | +/** |
---|
| 890 | + * hlist_add_before - add a new entry before the one specified |
---|
| 891 | + * @n: new entry to be added |
---|
| 892 | + * @next: hlist node to add it before, which must be non-NULL |
---|
| 893 | + */ |
---|
719 | 894 | static inline void hlist_add_before(struct hlist_node *n, |
---|
720 | | - struct hlist_node *next) |
---|
| 895 | + struct hlist_node *next) |
---|
721 | 896 | { |
---|
722 | | - n->pprev = next->pprev; |
---|
723 | | - n->next = next; |
---|
724 | | - next->pprev = &n->next; |
---|
| 897 | + WRITE_ONCE(n->pprev, next->pprev); |
---|
| 898 | + WRITE_ONCE(n->next, next); |
---|
| 899 | + WRITE_ONCE(next->pprev, &n->next); |
---|
725 | 900 | WRITE_ONCE(*(n->pprev), n); |
---|
726 | 901 | } |
---|
727 | 902 | |
---|
| 903 | +/** |
---|
| 904 | + * hlist_add_behing - add a new entry after the one specified |
---|
| 905 | + * @n: new entry to be added |
---|
| 906 | + * @prev: hlist node to add it after, which must be non-NULL |
---|
| 907 | + */ |
---|
728 | 908 | static inline void hlist_add_behind(struct hlist_node *n, |
---|
729 | 909 | struct hlist_node *prev) |
---|
730 | 910 | { |
---|
731 | | - n->next = prev->next; |
---|
| 911 | + WRITE_ONCE(n->next, prev->next); |
---|
732 | 912 | WRITE_ONCE(prev->next, n); |
---|
733 | | - n->pprev = &prev->next; |
---|
| 913 | + WRITE_ONCE(n->pprev, &prev->next); |
---|
734 | 914 | |
---|
735 | 915 | if (n->next) |
---|
736 | | - n->next->pprev = &n->next; |
---|
| 916 | + WRITE_ONCE(n->next->pprev, &n->next); |
---|
737 | 917 | } |
---|
738 | 918 | |
---|
739 | | -/* after that we'll appear to be on some hlist and hlist_del will work */ |
---|
| 919 | +/** |
---|
| 920 | + * hlist_add_fake - create a fake hlist consisting of a single headless node |
---|
| 921 | + * @n: Node to make a fake list out of |
---|
| 922 | + * |
---|
| 923 | + * This makes @n appear to be its own predecessor on a headless hlist. |
---|
| 924 | + * The point of this is to allow things like hlist_del() to work correctly |
---|
| 925 | + * in cases where there is no list. |
---|
| 926 | + */ |
---|
740 | 927 | static inline void hlist_add_fake(struct hlist_node *n) |
---|
741 | 928 | { |
---|
742 | 929 | n->pprev = &n->next; |
---|
743 | 930 | } |
---|
744 | 931 | |
---|
| 932 | +/** |
---|
| 933 | + * hlist_fake: Is this node a fake hlist? |
---|
| 934 | + * @h: Node to check for being a self-referential fake hlist. |
---|
| 935 | + */ |
---|
745 | 936 | static inline bool hlist_fake(struct hlist_node *h) |
---|
746 | 937 | { |
---|
747 | 938 | return h->pprev == &h->next; |
---|
748 | 939 | } |
---|
749 | 940 | |
---|
750 | | -/* |
---|
| 941 | +/** |
---|
| 942 | + * hlist_is_singular_node - is node the only element of the specified hlist? |
---|
| 943 | + * @n: Node to check for singularity. |
---|
| 944 | + * @h: Header for potentially singular list. |
---|
| 945 | + * |
---|
751 | 946 | * Check whether the node is the only node of the head without |
---|
752 | | - * accessing head: |
---|
| 947 | + * accessing head, thus avoiding unnecessary cache misses. |
---|
753 | 948 | */ |
---|
754 | 949 | static inline bool |
---|
755 | 950 | hlist_is_singular_node(struct hlist_node *n, struct hlist_head *h) |
---|
.. | .. |
---|
757 | 952 | return !n->next && n->pprev == &h->first; |
---|
758 | 953 | } |
---|
759 | 954 | |
---|
760 | | -/* |
---|
| 955 | +/** |
---|
| 956 | + * hlist_move_list - Move an hlist |
---|
| 957 | + * @old: hlist_head for old list. |
---|
| 958 | + * @new: hlist_head for new list. |
---|
| 959 | + * |
---|
761 | 960 | * Move a list from one list head to another. Fixup the pprev |
---|
762 | 961 | * reference of the first entry if it exists. |
---|
763 | 962 | */ |
---|
.. | .. |
---|
817 | 1016 | /** |
---|
818 | 1017 | * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry |
---|
819 | 1018 | * @pos: the type * to use as a loop cursor. |
---|
820 | | - * @n: another &struct hlist_node to use as temporary storage |
---|
| 1019 | + * @n: a &struct hlist_node to use as temporary storage |
---|
821 | 1020 | * @head: the head for your list. |
---|
822 | 1021 | * @member: the name of the hlist_node within the struct. |
---|
823 | 1022 | */ |
---|