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