Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 58839fdbd441dc079800f2575013f2c438159d5a 793 lines 23 kB view raw
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_first -- tests whether @list is the first entry in list @head 174 * @list: the entry to test 175 * @head: the head of the list 176 */ 177static inline int list_is_first(const struct list_head *list, const struct list_head *head) 178{ 179 return list->prev == head; 180} 181 182/** 183 * list_is_last - tests whether @list is the last entry in list @head 184 * @list: the entry to test 185 * @head: the head of the list 186 */ 187static inline int list_is_last(const struct list_head *list, 188 const struct list_head *head) 189{ 190 return list->next == head; 191} 192 193/** 194 * list_empty - tests whether a list is empty 195 * @head: the list to test. 196 */ 197static inline int list_empty(const struct list_head *head) 198{ 199 return head->next == head; 200} 201 202/** 203 * list_empty_careful - tests whether a list is empty and not being modified 204 * @head: the list to test 205 * 206 * Description: 207 * tests whether a list is empty _and_ checks that no other CPU might be 208 * in the process of modifying either member (next or prev) 209 * 210 * NOTE: using list_empty_careful() without synchronization 211 * can only be safe if the only activity that can happen 212 * to the list entry is list_del_init(). Eg. it cannot be used 213 * if another CPU could re-list_add() it. 214 */ 215static inline int list_empty_careful(const struct list_head *head) 216{ 217 struct list_head *next = head->next; 218 return (next == head) && (next == head->prev); 219} 220 221/** 222 * list_rotate_left - rotate the list to the left 223 * @head: the head of the list 224 */ 225static inline void list_rotate_left(struct list_head *head) 226{ 227 struct list_head *first; 228 229 if (!list_empty(head)) { 230 first = head->next; 231 list_move_tail(first, head); 232 } 233} 234 235/** 236 * list_is_singular - tests whether a list has just one entry. 237 * @head: the list to test. 238 */ 239static inline int list_is_singular(const struct list_head *head) 240{ 241 return !list_empty(head) && (head->next == head->prev); 242} 243 244static inline void __list_cut_position(struct list_head *list, 245 struct list_head *head, struct list_head *entry) 246{ 247 struct list_head *new_first = entry->next; 248 list->next = head->next; 249 list->next->prev = list; 250 list->prev = entry; 251 entry->next = list; 252 head->next = new_first; 253 new_first->prev = head; 254} 255 256/** 257 * list_cut_position - cut a list into two 258 * @list: a new list to add all removed entries 259 * @head: a list with entries 260 * @entry: an entry within head, could be the head itself 261 * and if so we won't cut the list 262 * 263 * This helper moves the initial part of @head, up to and 264 * including @entry, from @head to @list. You should 265 * pass on @entry an element you know is on @head. @list 266 * should be an empty list or a list you do not care about 267 * losing its data. 268 * 269 */ 270static inline void list_cut_position(struct list_head *list, 271 struct list_head *head, struct list_head *entry) 272{ 273 if (list_empty(head)) 274 return; 275 if (list_is_singular(head) && 276 (head->next != entry && head != entry)) 277 return; 278 if (entry == head) 279 INIT_LIST_HEAD(list); 280 else 281 __list_cut_position(list, head, entry); 282} 283 284static inline void __list_splice(const struct list_head *list, 285 struct list_head *prev, 286 struct list_head *next) 287{ 288 struct list_head *first = list->next; 289 struct list_head *last = list->prev; 290 291 first->prev = prev; 292 prev->next = first; 293 294 last->next = next; 295 next->prev = last; 296} 297 298/** 299 * list_splice - join two lists, this is designed for stacks 300 * @list: the new list to add. 301 * @head: the place to add it in the first list. 302 */ 303static inline void list_splice(const struct list_head *list, 304 struct list_head *head) 305{ 306 if (!list_empty(list)) 307 __list_splice(list, head, head->next); 308} 309 310/** 311 * list_splice_tail - join two lists, each list being a queue 312 * @list: the new list to add. 313 * @head: the place to add it in the first list. 314 */ 315static inline void list_splice_tail(struct list_head *list, 316 struct list_head *head) 317{ 318 if (!list_empty(list)) 319 __list_splice(list, head->prev, head); 320} 321 322/** 323 * list_splice_init - join two lists and reinitialise the emptied list. 324 * @list: the new list to add. 325 * @head: the place to add it in the first list. 326 * 327 * The list at @list is reinitialised 328 */ 329static inline void list_splice_init(struct list_head *list, 330 struct list_head *head) 331{ 332 if (!list_empty(list)) { 333 __list_splice(list, head, head->next); 334 INIT_LIST_HEAD(list); 335 } 336} 337 338/** 339 * list_splice_tail_init - join two lists and reinitialise the emptied list 340 * @list: the new list to add. 341 * @head: the place to add it in the first list. 342 * 343 * Each of the lists is a queue. 344 * The list at @list is reinitialised 345 */ 346static inline void list_splice_tail_init(struct list_head *list, 347 struct list_head *head) 348{ 349 if (!list_empty(list)) { 350 __list_splice(list, head->prev, head); 351 INIT_LIST_HEAD(list); 352 } 353} 354 355/** 356 * list_entry - get the struct for this entry 357 * @ptr: the &struct list_head pointer. 358 * @type: the type of the struct this is embedded in. 359 * @member: the name of the list_head within the struct. 360 */ 361#define list_entry(ptr, type, member) \ 362 container_of(ptr, type, member) 363 364/** 365 * list_first_entry - get the first element from a list 366 * @ptr: the list head to take the element from. 367 * @type: the type of the struct this is embedded in. 368 * @member: the name of the list_head within the struct. 369 * 370 * Note, that list is expected to be not empty. 371 */ 372#define list_first_entry(ptr, type, member) \ 373 list_entry((ptr)->next, type, member) 374 375/** 376 * list_last_entry - get the last element from a list 377 * @ptr: the list head to take the element from. 378 * @type: the type of the struct this is embedded in. 379 * @member: the name of the list_head within the struct. 380 * 381 * Note, that list is expected to be not empty. 382 */ 383#define list_last_entry(ptr, type, member) \ 384 list_entry((ptr)->prev, type, member) 385 386/** 387 * list_first_entry_or_null - get the first element from a list 388 * @ptr: the list head to take the element from. 389 * @type: the type of the struct this is embedded in. 390 * @member: the name of the list_head within the struct. 391 * 392 * Note that if the list is empty, it returns NULL. 393 */ 394#define list_first_entry_or_null(ptr, type, member) \ 395 (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) 396 397/** 398 * list_last_entry_or_null - get the last element from a list 399 * @ptr: the list head to take the element from. 400 * @type: the type of the struct this is embedded in. 401 * @member: the name of the list_head within the struct. 402 * 403 * Note that if the list is empty, it returns NULL. 404 */ 405#define list_last_entry_or_null(ptr, type, member) \ 406 (!list_empty(ptr) ? list_last_entry(ptr, type, member) : NULL) 407 408/** 409 * list_next_entry - get the next element in list 410 * @pos: the type * to cursor 411 * @member: the name of the list_head within the struct. 412 */ 413#define list_next_entry(pos, member) \ 414 list_entry((pos)->member.next, typeof(*(pos)), member) 415 416/** 417 * list_prev_entry - get the prev element in list 418 * @pos: the type * to cursor 419 * @member: the name of the list_head within the struct. 420 */ 421#define list_prev_entry(pos, member) \ 422 list_entry((pos)->member.prev, typeof(*(pos)), member) 423 424/** 425 * list_for_each - iterate over a list 426 * @pos: the &struct list_head to use as a loop cursor. 427 * @head: the head for your list. 428 */ 429#define list_for_each(pos, head) \ 430 for (pos = (head)->next; pos != (head); pos = pos->next) 431 432/** 433 * list_for_each_prev - iterate over a list backwards 434 * @pos: the &struct list_head to use as a loop cursor. 435 * @head: the head for your list. 436 */ 437#define list_for_each_prev(pos, head) \ 438 for (pos = (head)->prev; pos != (head); pos = pos->prev) 439 440/** 441 * list_for_each_safe - iterate over a list safe against removal of list entry 442 * @pos: the &struct list_head to use as a loop cursor. 443 * @n: another &struct list_head to use as temporary storage 444 * @head: the head for your list. 445 */ 446#define list_for_each_safe(pos, n, head) \ 447 for (pos = (head)->next, n = pos->next; pos != (head); \ 448 pos = n, n = pos->next) 449 450/** 451 * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry 452 * @pos: the &struct list_head to use as a loop cursor. 453 * @n: another &struct list_head to use as temporary storage 454 * @head: the head for your list. 455 */ 456#define list_for_each_prev_safe(pos, n, head) \ 457 for (pos = (head)->prev, n = pos->prev; \ 458 pos != (head); \ 459 pos = n, n = pos->prev) 460 461/** 462 * list_for_each_entry - iterate over list of given type 463 * @pos: the type * to use as a loop cursor. 464 * @head: the head for your list. 465 * @member: the name of the list_head within the struct. 466 */ 467#define list_for_each_entry(pos, head, member) \ 468 for (pos = list_first_entry(head, typeof(*pos), member); \ 469 &pos->member != (head); \ 470 pos = list_next_entry(pos, member)) 471 472/** 473 * list_for_each_entry_reverse - iterate backwards over list of given type. 474 * @pos: the type * to use as a loop cursor. 475 * @head: the head for your list. 476 * @member: the name of the list_head within the struct. 477 */ 478#define list_for_each_entry_reverse(pos, head, member) \ 479 for (pos = list_last_entry(head, typeof(*pos), member); \ 480 &pos->member != (head); \ 481 pos = list_prev_entry(pos, member)) 482 483/** 484 * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() 485 * @pos: the type * to use as a start point 486 * @head: the head of the list 487 * @member: the name of the list_head within the struct. 488 * 489 * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). 490 */ 491#define list_prepare_entry(pos, head, member) \ 492 ((pos) ? : list_entry(head, typeof(*pos), member)) 493 494/** 495 * list_for_each_entry_continue - continue iteration over list of given type 496 * @pos: the type * to use as a loop cursor. 497 * @head: the head for your list. 498 * @member: the name of the list_head within the struct. 499 * 500 * Continue to iterate over list of given type, continuing after 501 * the current position. 502 */ 503#define list_for_each_entry_continue(pos, head, member) \ 504 for (pos = list_next_entry(pos, member); \ 505 &pos->member != (head); \ 506 pos = list_next_entry(pos, member)) 507 508/** 509 * list_for_each_entry_continue_reverse - iterate backwards from the given point 510 * @pos: the type * to use as a loop cursor. 511 * @head: the head for your list. 512 * @member: the name of the list_head within the struct. 513 * 514 * Start to iterate over list of given type backwards, continuing after 515 * the current position. 516 */ 517#define list_for_each_entry_continue_reverse(pos, head, member) \ 518 for (pos = list_prev_entry(pos, member); \ 519 &pos->member != (head); \ 520 pos = list_prev_entry(pos, member)) 521 522/** 523 * list_for_each_entry_from - iterate over list of given type from the current point 524 * @pos: the type * to use as a loop cursor. 525 * @head: the head for your list. 526 * @member: the name of the list_head within the struct. 527 * 528 * Iterate over list of given type, continuing from current position. 529 */ 530#define list_for_each_entry_from(pos, head, member) \ 531 for (; &pos->member != (head); \ 532 pos = list_next_entry(pos, member)) 533 534/** 535 * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry 536 * @pos: the type * to use as a loop cursor. 537 * @n: another type * to use as temporary storage 538 * @head: the head for your list. 539 * @member: the name of the list_head within the struct. 540 */ 541#define list_for_each_entry_safe(pos, n, head, member) \ 542 for (pos = list_first_entry(head, typeof(*pos), member), \ 543 n = list_next_entry(pos, member); \ 544 &pos->member != (head); \ 545 pos = n, n = list_next_entry(n, member)) 546 547/** 548 * list_for_each_entry_safe_continue - continue list iteration safe against removal 549 * @pos: the type * to use as a loop cursor. 550 * @n: another type * to use as temporary storage 551 * @head: the head for your list. 552 * @member: the name of the list_head within the struct. 553 * 554 * Iterate over list of given type, continuing after current point, 555 * safe against removal of list entry. 556 */ 557#define list_for_each_entry_safe_continue(pos, n, head, member) \ 558 for (pos = list_next_entry(pos, member), \ 559 n = list_next_entry(pos, member); \ 560 &pos->member != (head); \ 561 pos = n, n = list_next_entry(n, member)) 562 563/** 564 * list_for_each_entry_safe_from - iterate over list from current point safe against removal 565 * @pos: the type * to use as a loop cursor. 566 * @n: another type * to use as temporary storage 567 * @head: the head for your list. 568 * @member: the name of the list_head within the struct. 569 * 570 * Iterate over list of given type from current point, safe against 571 * removal of list entry. 572 */ 573#define list_for_each_entry_safe_from(pos, n, head, member) \ 574 for (n = list_next_entry(pos, member); \ 575 &pos->member != (head); \ 576 pos = n, n = list_next_entry(n, member)) 577 578/** 579 * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal 580 * @pos: the type * to use as a loop cursor. 581 * @n: another type * to use as temporary storage 582 * @head: the head for your list. 583 * @member: the name of the list_head within the struct. 584 * 585 * Iterate backwards over list of given type, safe against removal 586 * of list entry. 587 */ 588#define list_for_each_entry_safe_reverse(pos, n, head, member) \ 589 for (pos = list_last_entry(head, typeof(*pos), member), \ 590 n = list_prev_entry(pos, member); \ 591 &pos->member != (head); \ 592 pos = n, n = list_prev_entry(n, member)) 593 594/** 595 * list_safe_reset_next - reset a stale list_for_each_entry_safe loop 596 * @pos: the loop cursor used in the list_for_each_entry_safe loop 597 * @n: temporary storage used in list_for_each_entry_safe 598 * @member: the name of the list_head within the struct. 599 * 600 * list_safe_reset_next is not safe to use in general if the list may be 601 * modified concurrently (eg. the lock is dropped in the loop body). An 602 * exception to this is if the cursor element (pos) is pinned in the list, 603 * and list_safe_reset_next is called after re-taking the lock and before 604 * completing the current iteration of the loop body. 605 */ 606#define list_safe_reset_next(pos, n, member) \ 607 n = list_next_entry(pos, member) 608 609/* 610 * Double linked lists with a single pointer list head. 611 * Mostly useful for hash tables where the two pointer list head is 612 * too wasteful. 613 * You lose the ability to access the tail in O(1). 614 */ 615 616#define HLIST_HEAD_INIT { .first = NULL } 617#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } 618#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) 619static inline void INIT_HLIST_NODE(struct hlist_node *h) 620{ 621 h->next = NULL; 622 h->pprev = NULL; 623} 624 625static inline int hlist_unhashed(const struct hlist_node *h) 626{ 627 return !h->pprev; 628} 629 630static inline int hlist_empty(const struct hlist_head *h) 631{ 632 return !h->first; 633} 634 635static inline void __hlist_del(struct hlist_node *n) 636{ 637 struct hlist_node *next = n->next; 638 struct hlist_node **pprev = n->pprev; 639 640 WRITE_ONCE(*pprev, next); 641 if (next) 642 next->pprev = pprev; 643} 644 645static inline void hlist_del(struct hlist_node *n) 646{ 647 __hlist_del(n); 648 n->next = LIST_POISON1; 649 n->pprev = LIST_POISON2; 650} 651 652static inline void hlist_del_init(struct hlist_node *n) 653{ 654 if (!hlist_unhashed(n)) { 655 __hlist_del(n); 656 INIT_HLIST_NODE(n); 657 } 658} 659 660static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) 661{ 662 struct hlist_node *first = h->first; 663 n->next = first; 664 if (first) 665 first->pprev = &n->next; 666 h->first = n; 667 n->pprev = &h->first; 668} 669 670/* next must be != NULL */ 671static inline void hlist_add_before(struct hlist_node *n, 672 struct hlist_node *next) 673{ 674 n->pprev = next->pprev; 675 n->next = next; 676 next->pprev = &n->next; 677 *(n->pprev) = n; 678} 679 680static inline void hlist_add_behind(struct hlist_node *n, 681 struct hlist_node *prev) 682{ 683 n->next = prev->next; 684 prev->next = n; 685 n->pprev = &prev->next; 686 687 if (n->next) 688 n->next->pprev = &n->next; 689} 690 691/* after that we'll appear to be on some hlist and hlist_del will work */ 692static inline void hlist_add_fake(struct hlist_node *n) 693{ 694 n->pprev = &n->next; 695} 696 697static inline bool hlist_fake(struct hlist_node *h) 698{ 699 return h->pprev == &h->next; 700} 701 702/* 703 * Move a list from one list head to another. Fixup the pprev 704 * reference of the first entry if it exists. 705 */ 706static inline void hlist_move_list(struct hlist_head *old, 707 struct hlist_head *new) 708{ 709 new->first = old->first; 710 if (new->first) 711 new->first->pprev = &new->first; 712 old->first = NULL; 713} 714 715#define hlist_entry(ptr, type, member) container_of(ptr,type,member) 716 717#define hlist_for_each(pos, head) \ 718 for (pos = (head)->first; pos ; pos = pos->next) 719 720#define hlist_for_each_safe(pos, n, head) \ 721 for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ 722 pos = n) 723 724#define hlist_entry_safe(ptr, type, member) \ 725 ({ typeof(ptr) ____ptr = (ptr); \ 726 ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ 727 }) 728 729/** 730 * hlist_for_each_entry - iterate over list of given type 731 * @pos: the type * to use as a loop cursor. 732 * @head: the head for your list. 733 * @member: the name of the hlist_node within the struct. 734 */ 735#define hlist_for_each_entry(pos, head, member) \ 736 for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ 737 pos; \ 738 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 739 740/** 741 * hlist_for_each_entry_continue - iterate over a hlist continuing after current point 742 * @pos: the type * to use as a loop cursor. 743 * @member: the name of the hlist_node within the struct. 744 */ 745#define hlist_for_each_entry_continue(pos, member) \ 746 for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ 747 pos; \ 748 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 749 750/** 751 * hlist_for_each_entry_from - iterate over a hlist continuing from current point 752 * @pos: the type * to use as a loop cursor. 753 * @member: the name of the hlist_node within the struct. 754 */ 755#define hlist_for_each_entry_from(pos, member) \ 756 for (; pos; \ 757 pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) 758 759/** 760 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry 761 * @pos: the type * to use as a loop cursor. 762 * @n: another &struct hlist_node to use as temporary storage 763 * @head: the head for your list. 764 * @member: the name of the hlist_node within the struct. 765 */ 766#define hlist_for_each_entry_safe(pos, n, head, member) \ 767 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ 768 pos && ({ n = pos->member.next; 1; }); \ 769 pos = hlist_entry_safe(n, typeof(*pos), member)) 770 771/** 772 * list_del_range - deletes range of entries from list. 773 * @begin: first element in the range to delete from the list. 774 * @end: last element in the range to delete from the list. 775 * Note: list_empty on the range of entries does not return true after this, 776 * the entries is in an undefined state. 777 */ 778static inline void list_del_range(struct list_head *begin, 779 struct list_head *end) 780{ 781 begin->prev->next = end->next; 782 end->next->prev = begin->prev; 783} 784 785/** 786 * list_for_each_from - iterate over a list from one of its nodes 787 * @pos: the &struct list_head to use as a loop cursor, from where to start 788 * @head: the head for your list. 789 */ 790#define list_for_each_from(pos, head) \ 791 for (; pos != (head); pos = pos->next) 792 793#endif /* __TOOLS_LINUX_LIST_H */