linux/tools/include/linux/list.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __TOOLS_LINUX_LIST_H
   3#define __TOOLS_LINUX_LIST_H
   4
   5#include <linux/types.h>
   6#include <linux/poison.h>
   7#include <linux/kernel.h>
   8#include <linux/compiler.h>
   9
  10/*
  11 * Simple doubly linked list implementation.
  12 *
  13 * Some of the internal functions ("__xxx") are useful when
  14 * manipulating whole lists rather than single entries, as
  15 * sometimes we already know the next/prev entries and we can
  16 * generate better code by using them directly rather than
  17 * using the generic single-entry routines.
  18 */
  19
  20#define LIST_HEAD_INIT(name) { &(name), &(name) }
  21
  22#define LIST_HEAD(name) \
  23        struct list_head name = LIST_HEAD_INIT(name)
  24
  25static inline void INIT_LIST_HEAD(struct list_head *list)
  26{
  27        list->next = list;
  28        list->prev = list;
  29}
  30
  31/*
  32 * Insert a new entry between two known consecutive entries.
  33 *
  34 * This is only for internal list manipulation where we know
  35 * the prev/next entries already!
  36 */
  37#ifndef CONFIG_DEBUG_LIST
  38static inline void __list_add(struct list_head *new,
  39                              struct list_head *prev,
  40                              struct list_head *next)
  41{
  42        next->prev = new;
  43        new->next = next;
  44        new->prev = prev;
  45        prev->next = new;
  46}
  47#else
  48extern void __list_add(struct list_head *new,
  49                              struct list_head *prev,
  50                              struct list_head *next);
  51#endif
  52
  53/**
  54 * list_add - add a new entry
  55 * @new: new entry to be added
  56 * @head: list head to add it after
  57 *
  58 * Insert a new entry after the specified head.
  59 * This is good for implementing stacks.
  60 */
  61static inline void list_add(struct list_head *new, struct list_head *head)
  62{
  63        __list_add(new, head, head->next);
  64}
  65
  66
  67/**
  68 * list_add_tail - add a new entry
  69 * @new: new entry to be added
  70 * @head: list head to add it before
  71 *
  72 * Insert a new entry before the specified head.
  73 * This is useful for implementing queues.
  74 */
  75static inline void list_add_tail(struct list_head *new, struct list_head *head)
  76{
  77        __list_add(new, head->prev, head);
  78}
  79
  80/*
  81 * Delete a list entry by making the prev/next entries
  82 * point to each other.
  83 *
  84 * This is only for internal list manipulation where we know
  85 * the prev/next entries already!
  86 */
  87static inline void __list_del(struct list_head * prev, struct list_head * next)
  88{
  89        next->prev = prev;
  90        WRITE_ONCE(prev->next, next);
  91}
  92
  93/**
  94 * list_del - deletes entry from list.
  95 * @entry: the element to delete from the list.
  96 * Note: list_empty() on entry does not return true after this, the entry is
  97 * in an undefined state.
  98 */
  99#ifndef CONFIG_DEBUG_LIST
 100static inline void __list_del_entry(struct list_head *entry)
 101{
 102        __list_del(entry->prev, entry->next);
 103}
 104
 105static inline void list_del(struct list_head *entry)
 106{
 107        __list_del(entry->prev, entry->next);
 108        entry->next = LIST_POISON1;
 109        entry->prev = LIST_POISON2;
 110}
 111#else
 112extern void __list_del_entry(struct list_head *entry);
 113extern void list_del(struct list_head *entry);
 114#endif
 115
 116/**
 117 * list_replace - replace old entry by new one
 118 * @old : the element to be replaced
 119 * @new : the new element to insert
 120 *
 121 * If @old was empty, it will be overwritten.
 122 */
 123static inline void list_replace(struct list_head *old,
 124                                struct list_head *new)
 125{
 126        new->next = old->next;
 127        new->next->prev = new;
 128        new->prev = old->prev;
 129        new->prev->next = new;
 130}
 131
 132static inline void list_replace_init(struct list_head *old,
 133                                        struct list_head *new)
 134{
 135        list_replace(old, new);
 136        INIT_LIST_HEAD(old);
 137}
 138
 139/**
 140 * list_del_init - deletes entry from list and reinitialize it.
 141 * @entry: the element to delete from the list.
 142 */
 143static inline void list_del_init(struct list_head *entry)
 144{
 145        __list_del_entry(entry);
 146        INIT_LIST_HEAD(entry);
 147}
 148
 149/**
 150 * list_move - delete from one list and add as another's head
 151 * @list: the entry to move
 152 * @head: the head that will precede our entry
 153 */
 154static inline void list_move(struct list_head *list, struct list_head *head)
 155{
 156        __list_del_entry(list);
 157        list_add(list, head);
 158}
 159
 160/**
 161 * list_move_tail - delete from one list and add as another's tail
 162 * @list: the entry to move
 163 * @head: the head that will follow our entry
 164 */
 165static inline void list_move_tail(struct list_head *list,
 166                                  struct list_head *head)
 167{
 168        __list_del_entry(list);
 169        list_add_tail(list, head);
 170}
 171
 172/**
 173 * list_is_last - tests whether @list is the last entry in list @head
 174 * @list: the entry to test
 175 * @head: the head of the list
 176 */
 177static inline int list_is_last(const struct list_head *list,
 178                                const struct list_head *head)
 179{
 180        return list->next == head;
 181}
 182
 183/**
 184 * list_empty - tests whether a list is empty
 185 * @head: the list to test.
 186 */
 187static inline int list_empty(const struct list_head *head)
 188{
 189        return head->next == head;
 190}
 191
 192/**
 193 * list_empty_careful - tests whether a list is empty and not being modified
 194 * @head: the list to test
 195 *
 196 * Description:
 197 * tests whether a list is empty _and_ checks that no other CPU might be
 198 * in the process of modifying either member (next or prev)
 199 *
 200 * NOTE: using list_empty_careful() without synchronization
 201 * can only be safe if the only activity that can happen
 202 * to the list entry is list_del_init(). Eg. it cannot be used
 203 * if another CPU could re-list_add() it.
 204 */
 205static inline int list_empty_careful(const struct list_head *head)
 206{
 207        struct list_head *next = head->next;
 208        return (next == head) && (next == head->prev);
 209}
 210
 211/**
 212 * list_rotate_left - rotate the list to the left
 213 * @head: the head of the list
 214 */
 215static inline void list_rotate_left(struct list_head *head)
 216{
 217        struct list_head *first;
 218
 219        if (!list_empty(head)) {
 220                first = head->next;
 221                list_move_tail(first, head);
 222        }
 223}
 224
 225/**
 226 * list_is_singular - tests whether a list has just one entry.
 227 * @head: the list to test.
 228 */
 229static inline int list_is_singular(const struct list_head *head)
 230{
 231        return !list_empty(head) && (head->next == head->prev);
 232}
 233
 234static inline void __list_cut_position(struct list_head *list,
 235                struct list_head *head, struct list_head *entry)
 236{
 237        struct list_head *new_first = entry->next;
 238        list->next = head->next;
 239        list->next->prev = list;
 240        list->prev = entry;
 241        entry->next = list;
 242        head->next = new_first;
 243        new_first->prev = head;
 244}
 245
 246/**
 247 * list_cut_position - cut a list into two
 248 * @list: a new list to add all removed entries
 249 * @head: a list with entries
 250 * @entry: an entry within head, could be the head itself
 251 *      and if so we won't cut the list
 252 *
 253 * This helper moves the initial part of @head, up to and
 254 * including @entry, from @head to @list. You should
 255 * pass on @entry an element you know is on @head. @list
 256 * should be an empty list or a list you do not care about
 257 * losing its data.
 258 *
 259 */
 260static inline void list_cut_position(struct list_head *list,
 261                struct list_head *head, struct list_head *entry)
 262{
 263        if (list_empty(head))
 264                return;
 265        if (list_is_singular(head) &&
 266                (head->next != entry && head != entry))
 267                return;
 268        if (entry == head)
 269                INIT_LIST_HEAD(list);
 270        else
 271                __list_cut_position(list, head, entry);
 272}
 273
 274static inline void __list_splice(const struct list_head *list,
 275                                 struct list_head *prev,
 276                                 struct list_head *next)
 277{
 278        struct list_head *first = list->next;
 279        struct list_head *last = list->prev;
 280
 281        first->prev = prev;
 282        prev->next = first;
 283
 284        last->next = next;
 285        next->prev = last;
 286}
 287
 288/**
 289 * list_splice - join two lists, this is designed for stacks
 290 * @list: the new list to add.
 291 * @head: the place to add it in the first list.
 292 */
 293static inline void list_splice(const struct list_head *list,
 294                                struct list_head *head)
 295{
 296        if (!list_empty(list))
 297                __list_splice(list, head, head->next);
 298}
 299
 300/**
 301 * list_splice_tail - join two lists, each list being a queue
 302 * @list: the new list to add.
 303 * @head: the place to add it in the first list.
 304 */
 305static inline void list_splice_tail(struct list_head *list,
 306                                struct list_head *head)
 307{
 308        if (!list_empty(list))
 309                __list_splice(list, head->prev, head);
 310}
 311
 312/**
 313 * list_splice_init - join two lists and reinitialise the emptied list.
 314 * @list: the new list to add.
 315 * @head: the place to add it in the first list.
 316 *
 317 * The list at @list is reinitialised
 318 */
 319static inline void list_splice_init(struct list_head *list,
 320                                    struct list_head *head)
 321{
 322        if (!list_empty(list)) {
 323                __list_splice(list, head, head->next);
 324                INIT_LIST_HEAD(list);
 325        }
 326}
 327
 328/**
 329 * list_splice_tail_init - join two lists and reinitialise the emptied list
 330 * @list: the new list to add.
 331 * @head: the place to add it in the first list.
 332 *
 333 * Each of the lists is a queue.
 334 * The list at @list is reinitialised
 335 */
 336static inline void list_splice_tail_init(struct list_head *list,
 337                                         struct list_head *head)
 338{
 339        if (!list_empty(list)) {
 340                __list_splice(list, head->prev, head);
 341                INIT_LIST_HEAD(list);
 342        }
 343}
 344
 345/**
 346 * list_entry - get the struct for this entry
 347 * @ptr:        the &struct list_head pointer.
 348 * @type:       the type of the struct this is embedded in.
 349 * @member:     the name of the list_head within the struct.
 350 */
 351#define list_entry(ptr, type, member) \
 352        container_of(ptr, type, member)
 353
 354/**
 355 * list_first_entry - get the first element from a list
 356 * @ptr:        the list head to take the element from.
 357 * @type:       the type of the struct this is embedded in.
 358 * @member:     the name of the list_head within the struct.
 359 *
 360 * Note, that list is expected to be not empty.
 361 */
 362#define list_first_entry(ptr, type, member) \
 363        list_entry((ptr)->next, type, member)
 364
 365/**
 366 * list_last_entry - get the last element from a list
 367 * @ptr:        the list head to take the element from.
 368 * @type:       the type of the struct this is embedded in.
 369 * @member:     the name of the list_head within the struct.
 370 *
 371 * Note, that list is expected to be not empty.
 372 */
 373#define list_last_entry(ptr, type, member) \
 374        list_entry((ptr)->prev, type, member)
 375
 376/**
 377 * list_first_entry_or_null - get the first element from a list
 378 * @ptr:        the list head to take the element from.
 379 * @type:       the type of the struct this is embedded in.
 380 * @member:     the name of the list_head within the struct.
 381 *
 382 * Note that if the list is empty, it returns NULL.
 383 */
 384#define list_first_entry_or_null(ptr, type, member) \
 385        (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)
 386
 387/**
 388 * list_next_entry - get the next element in list
 389 * @pos:        the type * to cursor
 390 * @member:     the name of the list_head within the struct.
 391 */
 392#define list_next_entry(pos, member) \
 393        list_entry((pos)->member.next, typeof(*(pos)), member)
 394
 395/**
 396 * list_prev_entry - get the prev element in list
 397 * @pos:        the type * to cursor
 398 * @member:     the name of the list_head within the struct.
 399 */
 400#define list_prev_entry(pos, member) \
 401        list_entry((pos)->member.prev, typeof(*(pos)), member)
 402
 403/**
 404 * list_for_each        -       iterate over a list
 405 * @pos:        the &struct list_head to use as a loop cursor.
 406 * @head:       the head for your list.
 407 */
 408#define list_for_each(pos, head) \
 409        for (pos = (head)->next; pos != (head); pos = pos->next)
 410
 411/**
 412 * list_for_each_prev   -       iterate over a list backwards
 413 * @pos:        the &struct list_head to use as a loop cursor.
 414 * @head:       the head for your list.
 415 */
 416#define list_for_each_prev(pos, head) \
 417        for (pos = (head)->prev; pos != (head); pos = pos->prev)
 418
 419/**
 420 * list_for_each_safe - iterate over a list safe against removal of list entry
 421 * @pos:        the &struct list_head to use as a loop cursor.
 422 * @n:          another &struct list_head to use as temporary storage
 423 * @head:       the head for your list.
 424 */
 425#define list_for_each_safe(pos, n, head) \
 426        for (pos = (head)->next, n = pos->next; pos != (head); \
 427                pos = n, n = pos->next)
 428
 429/**
 430 * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
 431 * @pos:        the &struct list_head to use as a loop cursor.
 432 * @n:          another &struct list_head to use as temporary storage
 433 * @head:       the head for your list.
 434 */
 435#define list_for_each_prev_safe(pos, n, head) \
 436        for (pos = (head)->prev, n = pos->prev; \
 437             pos != (head); \
 438             pos = n, n = pos->prev)
 439
 440/**
 441 * list_for_each_entry  -       iterate over list of given type
 442 * @pos:        the type * to use as a loop cursor.
 443 * @head:       the head for your list.
 444 * @member:     the name of the list_head within the struct.
 445 */
 446#define list_for_each_entry(pos, head, member)                          \
 447        for (pos = list_first_entry(head, typeof(*pos), member);        \
 448             &pos->member != (head);                                    \
 449             pos = list_next_entry(pos, member))
 450
 451/**
 452 * list_for_each_entry_reverse - iterate backwards over list of given type.
 453 * @pos:        the type * to use as a loop cursor.
 454 * @head:       the head for your list.
 455 * @member:     the name of the list_head within the struct.
 456 */
 457#define list_for_each_entry_reverse(pos, head, member)                  \
 458        for (pos = list_last_entry(head, typeof(*pos), member);         \
 459             &pos->member != (head);                                    \
 460             pos = list_prev_entry(pos, member))
 461
 462/**
 463 * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
 464 * @pos:        the type * to use as a start point
 465 * @head:       the head of the list
 466 * @member:     the name of the list_head within the struct.
 467 *
 468 * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
 469 */
 470#define list_prepare_entry(pos, head, member) \
 471        ((pos) ? : list_entry(head, typeof(*pos), member))
 472
 473/**
 474 * list_for_each_entry_continue - continue iteration over list of given type
 475 * @pos:        the type * to use as a loop cursor.
 476 * @head:       the head for your list.
 477 * @member:     the name of the list_head within the struct.
 478 *
 479 * Continue to iterate over list of given type, continuing after
 480 * the current position.
 481 */
 482#define list_for_each_entry_continue(pos, head, member)                 \
 483        for (pos = list_next_entry(pos, member);                        \
 484             &pos->member != (head);                                    \
 485             pos = list_next_entry(pos, member))
 486
 487/**
 488 * list_for_each_entry_continue_reverse - iterate backwards from the given point
 489 * @pos:        the type * to use as a loop cursor.
 490 * @head:       the head for your list.
 491 * @member:     the name of the list_head within the struct.
 492 *
 493 * Start to iterate over list of given type backwards, continuing after
 494 * the current position.
 495 */
 496#define list_for_each_entry_continue_reverse(pos, head, member)         \
 497        for (pos = list_prev_entry(pos, member);                        \
 498             &pos->member != (head);                                    \
 499             pos = list_prev_entry(pos, member))
 500
 501/**
 502 * list_for_each_entry_from - iterate over list of given type from the current point
 503 * @pos:        the type * to use as a loop cursor.
 504 * @head:       the head for your list.
 505 * @member:     the name of the list_head within the struct.
 506 *
 507 * Iterate over list of given type, continuing from current position.
 508 */
 509#define list_for_each_entry_from(pos, head, member)                     \
 510        for (; &pos->member != (head);                                  \
 511             pos = list_next_entry(pos, member))
 512
 513/**
 514 * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
 515 * @pos:        the type * to use as a loop cursor.
 516 * @n:          another type * to use as temporary storage
 517 * @head:       the head for your list.
 518 * @member:     the name of the list_head within the struct.
 519 */
 520#define list_for_each_entry_safe(pos, n, head, member)                  \
 521        for (pos = list_first_entry(head, typeof(*pos), member),        \
 522                n = list_next_entry(pos, member);                       \
 523             &pos->member != (head);                                    \
 524             pos = n, n = list_next_entry(n, member))
 525
 526/**
 527 * list_for_each_entry_safe_continue - continue list iteration safe against removal
 528 * @pos:        the type * to use as a loop cursor.
 529 * @n:          another type * to use as temporary storage
 530 * @head:       the head for your list.
 531 * @member:     the name of the list_head within the struct.
 532 *
 533 * Iterate over list of given type, continuing after current point,
 534 * safe against removal of list entry.
 535 */
 536#define list_for_each_entry_safe_continue(pos, n, head, member)                 \
 537        for (pos = list_next_entry(pos, member),                                \
 538                n = list_next_entry(pos, member);                               \
 539             &pos->member != (head);                                            \
 540             pos = n, n = list_next_entry(n, member))
 541
 542/**
 543 * list_for_each_entry_safe_from - iterate over list from current point safe against removal
 544 * @pos:        the type * to use as a loop cursor.
 545 * @n:          another type * to use as temporary storage
 546 * @head:       the head for your list.
 547 * @member:     the name of the list_head within the struct.
 548 *
 549 * Iterate over list of given type from current point, safe against
 550 * removal of list entry.
 551 */
 552#define list_for_each_entry_safe_from(pos, n, head, member)                     \
 553        for (n = list_next_entry(pos, member);                                  \
 554             &pos->member != (head);                                            \
 555             pos = n, n = list_next_entry(n, member))
 556
 557/**
 558 * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal
 559 * @pos:        the type * to use as a loop cursor.
 560 * @n:          another type * to use as temporary storage
 561 * @head:       the head for your list.
 562 * @member:     the name of the list_head within the struct.
 563 *
 564 * Iterate backwards over list of given type, safe against removal
 565 * of list entry.
 566 */
 567#define list_for_each_entry_safe_reverse(pos, n, head, member)          \
 568        for (pos = list_last_entry(head, typeof(*pos), member),         \
 569                n = list_prev_entry(pos, member);                       \
 570             &pos->member != (head);                                    \
 571             pos = n, n = list_prev_entry(n, member))
 572
 573/**
 574 * list_safe_reset_next - reset a stale list_for_each_entry_safe loop
 575 * @pos:        the loop cursor used in the list_for_each_entry_safe loop
 576 * @n:          temporary storage used in list_for_each_entry_safe
 577 * @member:     the name of the list_head within the struct.
 578 *
 579 * list_safe_reset_next is not safe to use in general if the list may be
 580 * modified concurrently (eg. the lock is dropped in the loop body). An
 581 * exception to this is if the cursor element (pos) is pinned in the list,
 582 * and list_safe_reset_next is called after re-taking the lock and before
 583 * completing the current iteration of the loop body.
 584 */
 585#define list_safe_reset_next(pos, n, member)                            \
 586        n = list_next_entry(pos, member)
 587
 588/*
 589 * Double linked lists with a single pointer list head.
 590 * Mostly useful for hash tables where the two pointer list head is
 591 * too wasteful.
 592 * You lose the ability to access the tail in O(1).
 593 */
 594
 595#define HLIST_HEAD_INIT { .first = NULL }
 596#define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
 597#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
 598static inline void INIT_HLIST_NODE(struct hlist_node *h)
 599{
 600        h->next = NULL;
 601        h->pprev = NULL;
 602}
 603
 604static inline int hlist_unhashed(const struct hlist_node *h)
 605{
 606        return !h->pprev;
 607}
 608
 609static inline int hlist_empty(const struct hlist_head *h)
 610{
 611        return !h->first;
 612}
 613
 614static inline void __hlist_del(struct hlist_node *n)
 615{
 616        struct hlist_node *next = n->next;
 617        struct hlist_node **pprev = n->pprev;
 618
 619        WRITE_ONCE(*pprev, next);
 620        if (next)
 621                next->pprev = pprev;
 622}
 623
 624static inline void hlist_del(struct hlist_node *n)
 625{
 626        __hlist_del(n);
 627        n->next = LIST_POISON1;
 628        n->pprev = LIST_POISON2;
 629}
 630
 631static inline void hlist_del_init(struct hlist_node *n)
 632{
 633        if (!hlist_unhashed(n)) {
 634                __hlist_del(n);
 635                INIT_HLIST_NODE(n);
 636        }
 637}
 638
 639static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
 640{
 641        struct hlist_node *first = h->first;
 642        n->next = first;
 643        if (first)
 644                first->pprev = &n->next;
 645        h->first = n;
 646        n->pprev = &h->first;
 647}
 648
 649/* next must be != NULL */
 650static inline void hlist_add_before(struct hlist_node *n,
 651                                        struct hlist_node *next)
 652{
 653        n->pprev = next->pprev;
 654        n->next = next;
 655        next->pprev = &n->next;
 656        *(n->pprev) = n;
 657}
 658
 659static inline void hlist_add_behind(struct hlist_node *n,
 660                                    struct hlist_node *prev)
 661{
 662        n->next = prev->next;
 663        prev->next = n;
 664        n->pprev = &prev->next;
 665
 666        if (n->next)
 667                n->next->pprev  = &n->next;
 668}
 669
 670/* after that we'll appear to be on some hlist and hlist_del will work */
 671static inline void hlist_add_fake(struct hlist_node *n)
 672{
 673        n->pprev = &n->next;
 674}
 675
 676static inline bool hlist_fake(struct hlist_node *h)
 677{
 678        return h->pprev == &h->next;
 679}
 680
 681/*
 682 * Move a list from one list head to another. Fixup the pprev
 683 * reference of the first entry if it exists.
 684 */
 685static inline void hlist_move_list(struct hlist_head *old,
 686                                   struct hlist_head *new)
 687{
 688        new->first = old->first;
 689        if (new->first)
 690                new->first->pprev = &new->first;
 691        old->first = NULL;
 692}
 693
 694#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
 695
 696#define hlist_for_each(pos, head) \
 697        for (pos = (head)->first; pos ; pos = pos->next)
 698
 699#define hlist_for_each_safe(pos, n, head) \
 700        for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
 701             pos = n)
 702
 703#define hlist_entry_safe(ptr, type, member) \
 704        ({ typeof(ptr) ____ptr = (ptr); \
 705           ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
 706        })
 707
 708/**
 709 * hlist_for_each_entry - iterate over list of given type
 710 * @pos:        the type * to use as a loop cursor.
 711 * @head:       the head for your list.
 712 * @member:     the name of the hlist_node within the struct.
 713 */
 714#define hlist_for_each_entry(pos, head, member)                         \
 715        for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
 716             pos;                                                       \
 717             pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
 718
 719/**
 720 * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
 721 * @pos:        the type * to use as a loop cursor.
 722 * @member:     the name of the hlist_node within the struct.
 723 */
 724#define hlist_for_each_entry_continue(pos, member)                      \
 725        for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
 726             pos;                                                       \
 727             pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
 728
 729/**
 730 * hlist_for_each_entry_from - iterate over a hlist continuing from current point
 731 * @pos:        the type * to use as a loop cursor.
 732 * @member:     the name of the hlist_node within the struct.
 733 */
 734#define hlist_for_each_entry_from(pos, member)                          \
 735        for (; pos;                                                     \
 736             pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
 737
 738/**
 739 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
 740 * @pos:        the type * to use as a loop cursor.
 741 * @n:          another &struct hlist_node to use as temporary storage
 742 * @head:       the head for your list.
 743 * @member:     the name of the hlist_node within the struct.
 744 */
 745#define hlist_for_each_entry_safe(pos, n, head, member)                 \
 746        for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
 747             pos && ({ n = pos->member.next; 1; });                     \
 748             pos = hlist_entry_safe(n, typeof(*pos), member))
 749
 750/**
 751 * list_del_range - deletes range of entries from list.
 752 * @begin: first element in the range to delete from the list.
 753 * @end: last element in the range to delete from the list.
 754 * Note: list_empty on the range of entries does not return true after this,
 755 * the entries is in an undefined state.
 756 */
 757static inline void list_del_range(struct list_head *begin,
 758                                  struct list_head *end)
 759{
 760        begin->prev->next = end->next;
 761        end->next->prev = begin->prev;
 762}
 763
 764/**
 765 * list_for_each_from   -       iterate over a list from one of its nodes
 766 * @pos:  the &struct list_head to use as a loop cursor, from where to start
 767 * @head: the head for your list.
 768 */
 769#define list_for_each_from(pos, head) \
 770        for (; pos != (head); pos = pos->next)
 771
 772#endif /* __TOOLS_LINUX_LIST_H */
 773