xref: /linux/Documentation/core-api/list.rst (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
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