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

docs: document linked lists

Add example-driven documentation for the kernel's generic linked list
data structure. This includes discussion of situations where linked
lists are likely inappropriate, and references to further reading.

Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Link: https://lore.kernel.org/r/20250714-linked-list-docs-v3-1-56c461580866@collabora.com
Signed-off-by: Jonathan Corbet <corbet@lwn.net>

authored by

Nicolas Frattaroli and committed by
Jonathan Corbet
dcaf9d31 39e39af7

+777 -6
+1
Documentation/core-api/index.rst
··· 54 54 union_find 55 55 min_heap 56 56 parser 57 + list 57 58 58 59 Low level entry and exit 59 60 ========================
-6
Documentation/core-api/kernel-api.rst
··· 3 3 ==================== 4 4 5 5 6 - List Management Functions 7 - ========================= 8 - 9 - .. kernel-doc:: include/linux/list.h 10 - :internal: 11 - 12 6 Basic C Library Functions 13 7 ========================= 14 8
+776
Documentation/core-api/list.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0+ 2 + 3 + ===================== 4 + Linked Lists in Linux 5 + ===================== 6 + 7 + :Author: Nicolas Frattaroli <nicolas.frattaroli@collabora.com> 8 + 9 + .. contents:: 10 + 11 + Introduction 12 + ============ 13 + 14 + Linked lists are one of the most basic data structures used in many programs. 15 + The Linux kernel implements several different flavours of linked lists. The 16 + purpose of this document is not to explain linked lists in general, but to show 17 + new kernel developers how to use the Linux kernel implementations of linked 18 + lists. 19 + 20 + Please note that while linked lists certainly are ubiquitous, they are rarely 21 + the best data structure to use in cases where a simple array doesn't already 22 + suffice. In particular, due to their poor data locality, linked lists are a bad 23 + choice in situations where performance may be of consideration. Familiarizing 24 + oneself with other in-kernel generic data structures, especially for concurrent 25 + accesses, is highly encouraged. 26 + 27 + Linux implementation of doubly linked lists 28 + =========================================== 29 + 30 + Linux's linked list implementations can be used by including the header file 31 + ``<linux/list.h>``. 32 + 33 + The doubly-linked list will likely be the most familiar to many readers. It's a 34 + list that can efficiently be traversed forwards and backwards. 35 + 36 + The Linux kernel's doubly-linked list is circular in nature. This means that to 37 + get from the head node to the tail, we can just travel one edge backwards. 38 + Similarly, to get from the tail node to the head, we can simply travel forwards 39 + "beyond" the tail and arrive back at the head. 40 + 41 + Declaring a node 42 + ---------------- 43 + 44 + A node in a doubly-linked list is declared by adding a struct list_head 45 + member to the data structure you wish to be contained in the list: 46 + 47 + .. code-block:: c 48 + 49 + struct clown { 50 + unsigned long long shoe_size; 51 + const char *name; 52 + struct list_head node; /* the aforementioned member */ 53 + }; 54 + 55 + This may be an unfamiliar approach to some, as the classical explanation of a 56 + linked list is a list node data structure with pointers to the previous and next 57 + list node, as well the payload data. Linux chooses this approach because it 58 + allows for generic list modification code regardless of what data structure is 59 + contained within the list. Since the struct list_head member is not a pointer 60 + but part of the data structure proper, the container_of() pattern can be used by 61 + the list implementation to access the payload data regardless of its type, while 62 + staying oblivious to what said type actually is. 63 + 64 + Declaring and initializing a list 65 + --------------------------------- 66 + 67 + A doubly-linked list can then be declared as just another struct list_head, 68 + and initialized with the LIST_HEAD_INIT() macro during initial assignment, or 69 + with the INIT_LIST_HEAD() function later: 70 + 71 + .. code-block:: c 72 + 73 + struct clown_car { 74 + int tyre_pressure[4]; 75 + struct list_head clowns; /* Looks like a node! */ 76 + }; 77 + 78 + /* ... Somewhere later in our driver ... */ 79 + 80 + static int circus_init(struct circus_priv *circus) 81 + { 82 + struct clown_car other_car = { 83 + .tyre_pressure = {10, 12, 11, 9}, 84 + .clowns = LIST_HEAD_INIT(other_car.clowns) 85 + }; 86 + 87 + INIT_LIST_HEAD(&circus->car.clowns); 88 + 89 + return 0; 90 + } 91 + 92 + A further point of confusion to some may be that the list itself doesn't really 93 + have its own type. The concept of the entire linked list and a 94 + struct list_head member that points to other entries in the list are one and 95 + the same. 96 + 97 + Adding nodes to the list 98 + ------------------------ 99 + 100 + Adding a node to the linked list is done through the list_add() macro. 101 + 102 + We'll return to our clown car example to illustrate how nodes get added to the 103 + list: 104 + 105 + .. code-block:: c 106 + 107 + static int circus_fill_car(struct circus_priv *circus) 108 + { 109 + struct clown_car *car = &circus->car; 110 + struct clown *grock; 111 + struct clown *dimitri; 112 + 113 + /* State 1 */ 114 + 115 + grock = kzalloc(sizeof(*grock), GFP_KERNEL); 116 + if (!grock) 117 + return -ENOMEM; 118 + grock->name = "Grock"; 119 + grock->shoe_size = 1000; 120 + 121 + /* Note that we're adding the "node" member */ 122 + list_add(&grock->node, &car->clowns); 123 + 124 + /* State 2 */ 125 + 126 + dimitri = kzalloc(sizeof(*dimitri), GFP_KERNEL); 127 + if (!dimitri) 128 + return -ENOMEM; 129 + dimitri->name = "Dimitri"; 130 + dimitri->shoe_size = 50; 131 + 132 + list_add(&dimitri->node, &car->clowns); 133 + 134 + /* State 3 */ 135 + 136 + return 0; 137 + } 138 + 139 + In State 1, our list of clowns is still empty:: 140 + 141 + .------. 142 + v | 143 + .--------. | 144 + | clowns |--' 145 + '--------' 146 + 147 + This diagram shows the singular "clowns" node pointing at itself. In this 148 + diagram, and all following diagrams, only the forward edges are shown, to aid in 149 + clarity. 150 + 151 + In State 2, we've added Grock after the list head:: 152 + 153 + .--------------------. 154 + v | 155 + .--------. .-------. | 156 + | clowns |---->| Grock |--' 157 + '--------' '-------' 158 + 159 + This diagram shows the "clowns" node pointing at a new node labeled "Grock". 160 + The Grock node is pointing back at the "clowns" node. 161 + 162 + In State 3, we've added Dimitri after the list head, resulting in the following:: 163 + 164 + .------------------------------------. 165 + v | 166 + .--------. .---------. .-------. | 167 + | clowns |---->| Dimitri |---->| Grock |--' 168 + '--------' '---------' '-------' 169 + 170 + This diagram shows the "clowns" node pointing at a new node labeled "Dimitri", 171 + which then points at the node labeled "Grock". The "Grock" node still points 172 + back at the "clowns" node. 173 + 174 + If we wanted to have Dimitri inserted at the end of the list instead, we'd use 175 + list_add_tail(). Our code would then look like this: 176 + 177 + .. code-block:: c 178 + 179 + static int circus_fill_car(struct circus_priv *circus) 180 + { 181 + /* ... */ 182 + 183 + list_add_tail(&dimitri->node, &car->clowns); 184 + 185 + /* State 3b */ 186 + 187 + return 0; 188 + } 189 + 190 + This results in the following list:: 191 + 192 + .------------------------------------. 193 + v | 194 + .--------. .-------. .---------. | 195 + | clowns |---->| Grock |---->| Dimitri |--' 196 + '--------' '-------' '---------' 197 + 198 + This diagram shows the "clowns" node pointing at the node labeled "Grock", 199 + which points at the new node labeled "Dimitri". The node labeled "Dimitri" 200 + points back at the "clowns" node. 201 + 202 + Traversing the list 203 + ------------------- 204 + 205 + To iterate the list, we can loop through all nodes within the list with 206 + list_for_each(). 207 + 208 + In our clown example, this results in the following somewhat awkward code: 209 + 210 + .. code-block:: c 211 + 212 + static unsigned long long circus_get_max_shoe_size(struct circus_priv *circus) 213 + { 214 + unsigned long long res = 0; 215 + struct clown *e; 216 + struct list_head *cur; 217 + 218 + list_for_each(cur, &circus->car.clowns) { 219 + e = list_entry(cur, struct clown, node); 220 + if (e->shoe_size > res) 221 + res = e->shoe_size; 222 + } 223 + 224 + return res; 225 + } 226 + 227 + The list_entry() macro internally uses the aforementioned container_of() to 228 + retrieve the data structure instance that ``node`` is a member of. 229 + 230 + Note how the additional list_entry() call is a little awkward here. It's only 231 + there because we're iterating through the ``node`` members, but we really want 232 + to iterate through the payload, i.e. the ``struct clown`` that contains each 233 + node's struct list_head. For this reason, there is a second macro: 234 + list_for_each_entry() 235 + 236 + Using it would change our code to something like this: 237 + 238 + .. code-block:: c 239 + 240 + static unsigned long long circus_get_max_shoe_size(struct circus_priv *circus) 241 + { 242 + unsigned long long res = 0; 243 + struct clown *e; 244 + 245 + list_for_each_entry(e, &circus->car.clowns, node) { 246 + if (e->shoe_size > res) 247 + res = e->shoe_size; 248 + } 249 + 250 + return res; 251 + } 252 + 253 + This eliminates the need for the list_entry() step, and our loop cursor is now 254 + of the type of our payload. The macro is given the member name that corresponds 255 + to the list's struct list_head within the clown data structure so that it can 256 + still walk the list. 257 + 258 + Removing nodes from the list 259 + ---------------------------- 260 + 261 + The list_del() function can be used to remove entries from the list. It not only 262 + removes the given entry from the list, but poisons the entry's ``prev`` and 263 + ``next`` pointers, so that unintended use of the entry after removal does not 264 + go unnoticed. 265 + 266 + We can extend our previous example to remove one of the entries: 267 + 268 + .. code-block:: c 269 + 270 + static int circus_fill_car(struct circus_priv *circus) 271 + { 272 + /* ... */ 273 + 274 + list_add(&dimitri->node, &car->clowns); 275 + 276 + /* State 3 */ 277 + 278 + list_del(&dimitri->node); 279 + 280 + /* State 4 */ 281 + 282 + return 0; 283 + } 284 + 285 + The result of this would be this:: 286 + 287 + .--------------------. 288 + v | 289 + .--------. .-------. | .---------. 290 + | clowns |---->| Grock |--' | Dimitri | 291 + '--------' '-------' '---------' 292 + 293 + This diagram shows the "clowns" node pointing at the node labeled "Grock", 294 + which points back at the "clowns" node. Off to the side is a lone node labeled 295 + "Dimitri", which has no arrows pointing anywhere. 296 + 297 + Note how the Dimitri node does not point to itself; its pointers are 298 + intentionally set to a "poison" value that the list code refuses to traverse. 299 + 300 + If we wanted to reinitialize the removed node instead to make it point at itself 301 + again like an empty list head, we can use list_del_init() instead: 302 + 303 + .. code-block:: c 304 + 305 + static int circus_fill_car(struct circus_priv *circus) 306 + { 307 + /* ... */ 308 + 309 + list_add(&dimitri->node, &car->clowns); 310 + 311 + /* State 3 */ 312 + 313 + list_del_init(&dimitri->node); 314 + 315 + /* State 4b */ 316 + 317 + return 0; 318 + } 319 + 320 + This results in the deleted node pointing to itself again:: 321 + 322 + .--------------------. .-------. 323 + v | v | 324 + .--------. .-------. | .---------. | 325 + | clowns |---->| Grock |--' | Dimitri |--' 326 + '--------' '-------' '---------' 327 + 328 + This diagram shows the "clowns" node pointing at the node labeled "Grock", 329 + which points back at the "clowns" node. Off to the side is a lone node labeled 330 + "Dimitri", which points to itself. 331 + 332 + Traversing whilst removing nodes 333 + -------------------------------- 334 + 335 + Deleting entries while we're traversing the list will cause problems if we use 336 + list_for_each() and list_for_each_entry(), as deleting the current entry would 337 + modify the ``next`` pointer of it, which means the traversal can't properly 338 + advance to the next list entry. 339 + 340 + There is a solution to this however: list_for_each_safe() and 341 + list_for_each_entry_safe(). These take an additional parameter of a pointer to 342 + a struct list_head to use as temporary storage for the next entry during 343 + iteration, solving the issue. 344 + 345 + An example of how to use it: 346 + 347 + .. code-block:: c 348 + 349 + static void circus_eject_insufficient_clowns(struct circus_priv *circus) 350 + { 351 + struct clown *e; 352 + struct clown *n; /* temporary storage for safe iteration */ 353 + 354 + list_for_each_entry_safe(e, n, &circus->car.clowns, node) { 355 + if (e->shoe_size < 500) 356 + list_del(&e->node); 357 + } 358 + } 359 + 360 + Proper memory management (i.e. freeing the deleted node while making sure 361 + nothing still references it) in this case is left as an exercise to the reader. 362 + 363 + Cutting a list 364 + -------------- 365 + 366 + There are two helper functions to cut lists with. Both take elements from the 367 + list ``head``, and replace the contents of the list ``list``. 368 + 369 + The first such function is list_cut_position(). It removes all list entries from 370 + ``head`` up to and including ``entry``, placing them in ``list`` instead. 371 + 372 + In this example, it's assumed we start with the following list:: 373 + 374 + .----------------------------------------------------------------. 375 + v | 376 + .--------. .-------. .---------. .-----. .---------. | 377 + | clowns |---->| Grock |---->| Dimitri |---->| Pic |---->| Alfredo |--' 378 + '--------' '-------' '---------' '-----' '---------' 379 + 380 + With the following code, every clown up to and including "Pic" is moved from 381 + the "clowns" list head to a separate struct list_head initialized at local 382 + stack variable ``retirement``: 383 + 384 + .. code-block:: c 385 + 386 + static void circus_retire_clowns(struct circus_priv *circus) 387 + { 388 + struct list_head retirement = LIST_HEAD_INIT(retirement); 389 + struct clown *grock, *dimitri, *pic, *alfredo; 390 + struct clown_car *car = &circus->car; 391 + 392 + /* ... clown initialization, list adding ... */ 393 + 394 + list_cut_position(&retirement, &car->clowns, &pic->node); 395 + 396 + /* State 1 */ 397 + } 398 + 399 + The resulting ``car->clowns`` list would be this:: 400 + 401 + .----------------------. 402 + v | 403 + .--------. .---------. | 404 + | clowns |---->| Alfredo |--' 405 + '--------' '---------' 406 + 407 + Meanwhile, the ``retirement`` list is transformed to the following:: 408 + 409 + .--------------------------------------------------. 410 + v | 411 + .------------. .-------. .---------. .-----. | 412 + | retirement |---->| Grock |---->| Dimitri |---->| Pic |--' 413 + '------------' '-------' '---------' '-----' 414 + 415 + The second function, list_cut_before(), is much the same, except it cuts before 416 + the ``entry`` node, i.e. it removes all list entries from ``head`` up to but 417 + excluding ``entry``, placing them in ``list`` instead. This example assumes the 418 + same initial starting list as the previous example: 419 + 420 + .. code-block:: c 421 + 422 + static void circus_retire_clowns(struct circus_priv *circus) 423 + { 424 + struct list_head retirement = LIST_HEAD_INIT(retirement); 425 + struct clown *grock, *dimitri, *pic, *alfredo; 426 + struct clown_car *car = &circus->car; 427 + 428 + /* ... clown initialization, list adding ... */ 429 + 430 + list_cut_before(&retirement, &car->clowns, &pic->node); 431 + 432 + /* State 1b */ 433 + } 434 + 435 + The resulting ``car->clowns`` list would be this:: 436 + 437 + .----------------------------------. 438 + v | 439 + .--------. .-----. .---------. | 440 + | clowns |---->| Pic |---->| Alfredo |--' 441 + '--------' '-----' '---------' 442 + 443 + Meanwhile, the ``retirement`` list is transformed to the following:: 444 + 445 + .--------------------------------------. 446 + v | 447 + .------------. .-------. .---------. | 448 + | retirement |---->| Grock |---->| Dimitri |--' 449 + '------------' '-------' '---------' 450 + 451 + It should be noted that both functions will destroy links to any existing nodes 452 + in the destination ``struct list_head *list``. 453 + 454 + Moving entries and partial lists 455 + -------------------------------- 456 + 457 + The list_move() and list_move_tail() functions can be used to move an entry 458 + from one list to another, to either the start or end respectively. 459 + 460 + In the following example, we'll assume we start with two lists ("clowns" and 461 + "sidewalk" in the following initial state "State 0":: 462 + 463 + .----------------------------------------------------------------. 464 + v | 465 + .--------. .-------. .---------. .-----. .---------. | 466 + | clowns |---->| Grock |---->| Dimitri |---->| Pic |---->| Alfredo |--' 467 + '--------' '-------' '---------' '-----' '---------' 468 + 469 + .-------------------. 470 + v | 471 + .----------. .-----. | 472 + | sidewalk |---->| Pio |--' 473 + '----------' '-----' 474 + 475 + We apply the following example code to the two lists: 476 + 477 + .. code-block:: c 478 + 479 + static void circus_clowns_exit_car(struct circus_priv *circus) 480 + { 481 + struct list_head sidewalk = LIST_HEAD_INIT(sidewalk); 482 + struct clown *grock, *dimitri, *pic, *alfredo, *pio; 483 + struct clown_car *car = &circus->car; 484 + 485 + /* ... clown initialization, list adding ... */ 486 + 487 + /* State 0 */ 488 + 489 + list_move(&pic->node, &sidewalk); 490 + 491 + /* State 1 */ 492 + 493 + list_move_tail(&dimitri->node, &sidewalk); 494 + 495 + /* State 2 */ 496 + } 497 + 498 + In State 1, we arrive at the following situation:: 499 + 500 + .-----------------------------------------------------. 501 + | | 502 + v | 503 + .--------. .-------. .---------. .---------. | 504 + | clowns |---->| Grock |---->| Dimitri |---->| Alfredo |--' 505 + '--------' '-------' '---------' '---------' 506 + 507 + .-------------------------------. 508 + v | 509 + .----------. .-----. .-----. | 510 + | sidewalk |---->| Pic |---->| Pio |--' 511 + '----------' '-----' '-----' 512 + 513 + In State 2, after we've moved Dimitri to the tail of sidewalk, the situation 514 + changes as follows:: 515 + 516 + .-------------------------------------. 517 + | | 518 + v | 519 + .--------. .-------. .---------. | 520 + | clowns |---->| Grock |---->| Alfredo |--' 521 + '--------' '-------' '---------' 522 + 523 + .-----------------------------------------------. 524 + v | 525 + .----------. .-----. .-----. .---------. | 526 + | sidewalk |---->| Pic |---->| Pio |---->| Dimitri |--' 527 + '----------' '-----' '-----' '---------' 528 + 529 + As long as the source and destination list head are part of the same list, we 530 + can also efficiently bulk move a segment of the list to the tail end of the 531 + list. We continue the previous example by adding a list_bulk_move_tail() after 532 + State 2, moving Pic and Pio to the tail end of the sidewalk list. 533 + 534 + .. code-block:: c 535 + 536 + static void circus_clowns_exit_car(struct circus_priv *circus) 537 + { 538 + struct list_head sidewalk = LIST_HEAD_INIT(sidewalk); 539 + struct clown *grock, *dimitri, *pic, *alfredo, *pio; 540 + struct clown_car *car = &circus->car; 541 + 542 + /* ... clown initialization, list adding ... */ 543 + 544 + /* State 0 */ 545 + 546 + list_move(&pic->node, &sidewalk); 547 + 548 + /* State 1 */ 549 + 550 + list_move_tail(&dimitri->node, &sidewalk); 551 + 552 + /* State 2 */ 553 + 554 + list_bulk_move_tail(&sidewalk, &pic->node, &pio->node); 555 + 556 + /* State 3 */ 557 + } 558 + 559 + For the sake of brevity, only the altered "sidewalk" list at State 3 is depicted 560 + in the following diagram:: 561 + 562 + .-----------------------------------------------. 563 + v | 564 + .----------. .---------. .-----. .-----. | 565 + | sidewalk |---->| Dimitri |---->| Pic |---->| Pio |--' 566 + '----------' '---------' '-----' '-----' 567 + 568 + Do note that list_bulk_move_tail() does not do any checking as to whether all 569 + three supplied ``struct list_head *`` parameters really do belong to the same 570 + list. If you use it outside the constraints the documentation gives, then the 571 + result is a matter between you and the implementation. 572 + 573 + Rotating entries 574 + ---------------- 575 + 576 + A common write operation on lists, especially when using them as queues, is 577 + to rotate it. A list rotation means entries at the front are sent to the back. 578 + 579 + For rotation, Linux provides us with two functions: list_rotate_left() and 580 + list_rotate_to_front(). The former can be pictured like a bicycle chain, taking 581 + the entry after the supplied ``struct list_head *`` and moving it to the tail, 582 + which in essence means the entire list, due to its circular nature, rotates by 583 + one position. 584 + 585 + The latter, list_rotate_to_front(), takes the same concept one step further: 586 + instead of advancing the list by one entry, it advances it *until* the specified 587 + entry is the new front. 588 + 589 + In the following example, our starting state, State 0, is the following:: 590 + 591 + .-----------------------------------------------------------------. 592 + v | 593 + .--------. .-------. .---------. .-----. .---------. .-----. | 594 + | clowns |-->| Grock |-->| Dimitri |-->| Pic |-->| Alfredo |-->| Pio |-' 595 + '--------' '-------' '---------' '-----' '---------' '-----' 596 + 597 + The example code being used to demonstrate list rotations is the following: 598 + 599 + .. code-block:: c 600 + 601 + static void circus_clowns_rotate(struct circus_priv *circus) 602 + { 603 + struct clown *grock, *dimitri, *pic, *alfredo, *pio; 604 + struct clown_car *car = &circus->car; 605 + 606 + /* ... clown initialization, list adding ... */ 607 + 608 + /* State 0 */ 609 + 610 + list_rotate_left(&car->clowns); 611 + 612 + /* State 1 */ 613 + 614 + list_rotate_to_front(&alfredo->node, &car->clowns); 615 + 616 + /* State 2 */ 617 + 618 + } 619 + 620 + In State 1, we arrive at the following situation:: 621 + 622 + .-----------------------------------------------------------------. 623 + v | 624 + .--------. .---------. .-----. .---------. .-----. .-------. | 625 + | clowns |-->| Dimitri |-->| Pic |-->| Alfredo |-->| Pio |-->| Grock |-' 626 + '--------' '---------' '-----' '---------' '-----' '-------' 627 + 628 + Next, after the list_rotate_to_front() call, we arrive in the following 629 + State 2:: 630 + 631 + .-----------------------------------------------------------------. 632 + v | 633 + .--------. .---------. .-----. .-------. .---------. .-----. | 634 + | clowns |-->| Alfredo |-->| Pio |-->| Grock |-->| Dimitri |-->| Pic |-' 635 + '--------' '---------' '-----' '-------' '---------' '-----' 636 + 637 + As is hopefully evident from the diagrams, the entries in front of "Alfredo" 638 + were cycled to the tail end of the list. 639 + 640 + Swapping entries 641 + ---------------- 642 + 643 + Another common operation is that two entries need to be swapped with each other. 644 + 645 + For this, Linux provides us with list_swap(). 646 + 647 + In the following example, we have a list with three entries, and swap two of 648 + them. This is our starting state in "State 0":: 649 + 650 + .-----------------------------------------. 651 + v | 652 + .--------. .-------. .---------. .-----. | 653 + | clowns |-->| Grock |-->| Dimitri |-->| Pic |-' 654 + '--------' '-------' '---------' '-----' 655 + 656 + .. code-block:: c 657 + 658 + static void circus_clowns_swap(struct circus_priv *circus) 659 + { 660 + struct clown *grock, *dimitri, *pic; 661 + struct clown_car *car = &circus->car; 662 + 663 + /* ... clown initialization, list adding ... */ 664 + 665 + /* State 0 */ 666 + 667 + list_swap(&dimitri->node, &pic->node); 668 + 669 + /* State 1 */ 670 + } 671 + 672 + The resulting list at State 1 is the following:: 673 + 674 + .-----------------------------------------. 675 + v | 676 + .--------. .-------. .-----. .---------. | 677 + | clowns |-->| Grock |-->| Pic |-->| Dimitri |-' 678 + '--------' '-------' '-----' '---------' 679 + 680 + As is evident by comparing the diagrams, the "Pic" and "Dimitri" nodes have 681 + traded places. 682 + 683 + Splicing two lists together 684 + --------------------------- 685 + 686 + Say we have two lists, in the following example one represented by a list head 687 + we call "knie" and one we call "stey". In a hypothetical circus acquisition, 688 + the two list of clowns should be spliced together. The following is our 689 + situation in "State 0":: 690 + 691 + .-----------------------------------------. 692 + | | 693 + v | 694 + .------. .-------. .---------. .-----. | 695 + | knie |-->| Grock |-->| Dimitri |-->| Pic |--' 696 + '------' '-------' '---------' '-----' 697 + 698 + .-----------------------------. 699 + v | 700 + .------. .---------. .-----. | 701 + | stey |-->| Alfredo |-->| Pio |--' 702 + '------' '---------' '-----' 703 + 704 + The function to splice these two lists together is list_splice(). Our example 705 + code is as follows: 706 + 707 + .. code-block:: c 708 + 709 + static void circus_clowns_splice(void) 710 + { 711 + struct clown *grock, *dimitri, *pic, *alfredo, *pio; 712 + struct list_head knie = LIST_HEAD_INIT(knie); 713 + struct list_head stey = LIST_HEAD_INIT(stey); 714 + 715 + /* ... Clown allocation and initialization here ... */ 716 + 717 + list_add_tail(&grock->node, &knie); 718 + list_add_tail(&dimitri->node, &knie); 719 + list_add_tail(&pic->node, &knie); 720 + list_add_tail(&alfredo->node, &stey); 721 + list_add_tail(&pio->node, &stey); 722 + 723 + /* State 0 */ 724 + 725 + list_splice(&stey, &dimitri->node); 726 + 727 + /* State 1 */ 728 + } 729 + 730 + The list_splice() call here adds all the entries in ``stey`` to the list 731 + ``dimitri``'s ``node`` list_head is in, after the ``node`` of ``dimitri``. A 732 + somewhat surprising diagram of the resulting "State 1" follows:: 733 + 734 + .-----------------------------------------------------------------. 735 + | | 736 + v | 737 + .------. .-------. .---------. .---------. .-----. .-----. | 738 + | knie |-->| Grock |-->| Dimitri |-->| Alfredo |-->| Pio |-->| Pic |--' 739 + '------' '-------' '---------' '---------' '-----' '-----' 740 + ^ 741 + .-------------------------------' 742 + | 743 + .------. | 744 + | stey |--' 745 + '------' 746 + 747 + Traversing the ``stey`` list no longer results in correct behavior. A call of 748 + list_for_each() on ``stey`` results in an infinite loop, as it never returns 749 + back to the ``stey`` list head. 750 + 751 + This is because list_splice() did not reinitialize the list_head it took 752 + entries from, leaving its pointer pointing into what is now a different list. 753 + 754 + If we want to avoid this situation, list_splice_init() can be used. It does the 755 + same thing as list_splice(), except reinitalizes the donor list_head after the 756 + transplant. 757 + 758 + Concurrency considerations 759 + -------------------------- 760 + 761 + Concurrent access and modification of a list needs to be protected with a lock 762 + in most cases. Alternatively and preferably, one may use the RCU primitives for 763 + lists in read-mostly use-cases, where read accesses to the list are common but 764 + modifications to the list less so. See Documentation/RCU/listRCU.rst for more 765 + details. 766 + 767 + Further reading 768 + --------------- 769 + 770 + * `How does the kernel implements Linked Lists? - KernelNewbies <https://kernelnewbies.org/FAQ/LinkedLists>`_ 771 + 772 + Full List API 773 + ============= 774 + 775 + .. kernel-doc:: include/linux/list.h 776 + :internal: