ring: remove debug setting
[dpdk.git] / doc / guides / prog_guide / ring_lib.rst
1 ..  BSD LICENSE
2     Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
3     All rights reserved.
4
5     Redistribution and use in source and binary forms, with or without
6     modification, are permitted provided that the following conditions
7     are met:
8
9     * Redistributions of source code must retain the above copyright
10     notice, this list of conditions and the following disclaimer.
11     * Redistributions in binary form must reproduce the above copyright
12     notice, this list of conditions and the following disclaimer in
13     the documentation and/or other materials provided with the
14     distribution.
15     * Neither the name of Intel Corporation nor the names of its
16     contributors may be used to endorse or promote products derived
17     from this software without specific prior written permission.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 .. _Ring_Library:
32
33 Ring Library
34 ============
35
36 The ring allows the management of queues.
37 Instead of having a linked list of infinite size, the rte_ring has the following properties:
38
39 *   FIFO
40
41 *   Maximum size is fixed, the pointers are stored in a table
42
43 *   Lockless implementation
44
45 *   Multi-consumer or single-consumer dequeue
46
47 *   Multi-producer or single-producer enqueue
48
49 *   Bulk dequeue - Dequeues the specified count of objects if successful; otherwise fails
50
51 *   Bulk enqueue - Enqueues the specified count of objects if successful; otherwise fails
52
53 *   Burst dequeue - Dequeue the maximum available objects if the specified count cannot be fulfilled
54
55 *   Burst enqueue - Enqueue the maximum available objects if the specified count cannot be fulfilled
56
57 The advantages of this data structure over a linked list queue are as follows:
58
59 *   Faster; only requires a single Compare-And-Swap instruction of sizeof(void \*) instead of several double-Compare-And-Swap instructions.
60
61 *   Simpler than a full lockless queue.
62
63 *   Adapted to bulk enqueue/dequeue operations.
64     As pointers are stored in a table, a dequeue of several objects will not produce as many cache misses as in a linked queue.
65     Also, a bulk dequeue of many objects does not cost more than a dequeue of a simple object.
66
67 The disadvantages:
68
69 *   Size is fixed
70
71 *   Having many rings costs more in terms of memory than a linked list queue. An empty ring contains at least N pointers.
72
73 A simplified representation of a Ring is shown in with consumer and producer head and tail pointers to objects stored in the data structure.
74
75 .. _figure_ring1:
76
77 .. figure:: img/ring1.*
78
79    Ring Structure
80
81
82 References for Ring Implementation in FreeBSD*
83 ----------------------------------------------
84
85 The following code was added in FreeBSD 8.0, and is used in some network device drivers (at least in Intel drivers):
86
87     * `bufring.h in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/sys/buf_ring.h?revision=199625&amp;view=markup>`_
88
89     * `bufring.c in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/kern/subr_bufring.c?revision=199625&amp;view=markup>`_
90
91 Lockless Ring Buffer in Linux*
92 ------------------------------
93
94 The following is a link describing the `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_.
95
96 Additional Features
97 -------------------
98
99 Name
100 ~~~~
101
102 A ring is identified by a unique name.
103 It is not possible to create two rings with the same name (rte_ring_create() returns NULL if this is attempted).
104
105 Water Marking
106 ~~~~~~~~~~~~~
107
108 The ring can have a high water mark (threshold).
109 Once an enqueue operation reaches the high water mark, the producer is notified, if the water mark is configured.
110
111 This mechanism can be used, for example, to exert a back pressure on I/O to inform the LAN to PAUSE.
112
113 Use Cases
114 ---------
115
116 Use cases for the Ring library include:
117
118     *  Communication between applications in the DPDK
119
120     *  Used by memory pool allocator
121
122 Anatomy of a Ring Buffer
123 ------------------------
124
125 This section explains how a ring buffer operates.
126 The ring structure is composed of two head and tail couples; one is used by producers and one is used by the consumers.
127 The figures of the following sections refer to them as prod_head, prod_tail, cons_head and cons_tail.
128
129 Each figure represents a simplified state of the ring, which is a circular buffer.
130 The content of the function local variables is represented on the top of the figure,
131 and the content of ring structure is represented on the bottom of the figure.
132
133 Single Producer Enqueue
134 ~~~~~~~~~~~~~~~~~~~~~~~
135
136 This section explains what occurs when a producer adds an object to the ring.
137 In this example, only the producer head and tail (prod_head and prod_tail) are modified,
138 and there is only one producer.
139
140 The initial state is to have a prod_head and prod_tail pointing at the same location.
141
142 Enqueue First Step
143 ^^^^^^^^^^^^^^^^^^
144
145 First, *ring->prod_head* and ring->cons_tail are copied in local variables.
146 The prod_next local variable points to the next element of the table, or several elements after in case of bulk enqueue.
147
148 If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error.
149
150
151 .. _figure_ring-enqueue1:
152
153 .. figure:: img/ring-enqueue1.*
154
155    Enqueue first step
156
157
158 Enqueue Second Step
159 ^^^^^^^^^^^^^^^^^^^
160
161 The second step is to modify *ring->prod_head* in ring structure to point to the same location as prod_next.
162
163 A pointer to the added object is copied in the ring (obj4).
164
165
166 .. _figure_ring-enqueue2:
167
168 .. figure:: img/ring-enqueue2.*
169
170    Enqueue second step
171
172
173 Enqueue Last Step
174 ^^^^^^^^^^^^^^^^^
175
176 Once the object is added in the ring, ring->prod_tail in the ring structure is modified to point to the same location as *ring->prod_head*.
177 The enqueue operation is finished.
178
179
180 .. _figure_ring-enqueue3:
181
182 .. figure:: img/ring-enqueue3.*
183
184    Enqueue last step
185
186
187 Single Consumer Dequeue
188 ~~~~~~~~~~~~~~~~~~~~~~~
189
190 This section explains what occurs when a consumer dequeues an object from the ring.
191 In this example, only the consumer head and tail (cons_head and cons_tail) are modified and there is only one consumer.
192
193 The initial state is to have a cons_head and cons_tail pointing at the same location.
194
195 Dequeue First Step
196 ^^^^^^^^^^^^^^^^^^
197
198 First, ring->cons_head and ring->prod_tail are copied in local variables.
199 The cons_next local variable points to the next element of the table, or several elements after in the case of bulk dequeue.
200
201 If there are not enough objects in the ring (this is detected by checking prod_tail), it returns an error.
202
203
204 .. _figure_ring-dequeue1:
205
206 .. figure:: img/ring-dequeue1.*
207
208    Dequeue last step
209
210
211 Dequeue Second Step
212 ^^^^^^^^^^^^^^^^^^^
213
214 The second step is to modify ring->cons_head in the ring structure to point to the same location as cons_next.
215
216 The pointer to the dequeued object (obj1) is copied in the pointer given by the user.
217
218
219 .. _figure_ring-dequeue2:
220
221 .. figure:: img/ring-dequeue2.*
222
223    Dequeue second step
224
225
226 Dequeue Last Step
227 ^^^^^^^^^^^^^^^^^
228
229 Finally, ring->cons_tail in the ring structure is modified to point to the same location as ring->cons_head.
230 The dequeue operation is finished.
231
232
233 .. _figure_ring-dequeue3:
234
235 .. figure:: img/ring-dequeue3.*
236
237    Dequeue last step
238
239
240 Multiple Producers Enqueue
241 ~~~~~~~~~~~~~~~~~~~~~~~~~~
242
243 This section explains what occurs when two producers concurrently add an object to the ring.
244 In this example, only the producer head and tail (prod_head and prod_tail) are modified.
245
246 The initial state is to have a prod_head and prod_tail pointing at the same location.
247
248 Multiple Producers Enqueue First Step
249 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
250
251 On both cores, *ring->prod_head* and ring->cons_tail are copied in local variables.
252 The prod_next local variable points to the next element of the table,
253 or several elements after in the case of bulk enqueue.
254
255 If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error.
256
257
258 .. _figure_ring-mp-enqueue1:
259
260 .. figure:: img/ring-mp-enqueue1.*
261
262    Multiple producer enqueue first step
263
264
265 Multiple Producers Enqueue Second Step
266 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
267
268 The second step is to modify ring->prod_head in the ring structure to point to the same location as prod_next.
269 This operation is done using a Compare And Swap (CAS) instruction, which does the following operations atomically:
270
271 *   If ring->prod_head is different to local variable prod_head,
272     the CAS operation fails, and the code restarts at first step.
273
274 *   Otherwise, ring->prod_head is set to local prod_next,
275     the CAS operation is successful, and processing continues.
276
277 In the figure, the operation succeeded on core 1, and step one restarted on core 2.
278
279
280 .. _figure_ring-mp-enqueue2:
281
282 .. figure:: img/ring-mp-enqueue2.*
283
284    Multiple producer enqueue second step
285
286
287 Multiple Producers Enqueue Third Step
288 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
289
290 The CAS operation is retried on core 2 with success.
291
292 The core 1 updates one element of the ring(obj4), and the core 2 updates another one (obj5).
293
294
295 .. _figure_ring-mp-enqueue3:
296
297 .. figure:: img/ring-mp-enqueue3.*
298
299    Multiple producer enqueue third step
300
301
302 Multiple Producers Enqueue Fourth Step
303 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
304
305 Each core now wants to update ring->prod_tail.
306 A core can only update it if ring->prod_tail is equal to the prod_head local variable.
307 This is only true on core 1. The operation is finished on core 1.
308
309
310 .. _figure_ring-mp-enqueue4:
311
312 .. figure:: img/ring-mp-enqueue4.*
313
314    Multiple producer enqueue fourth step
315
316
317 Multiple Producers Enqueue Last Step
318 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
319
320 Once ring->prod_tail is updated by core 1, core 2 is allowed to update it too.
321 The operation is also finished on core 2.
322
323
324 .. _figure_ring-mp-enqueue5:
325
326 .. figure:: img/ring-mp-enqueue5.*
327
328    Multiple producer enqueue last step
329
330
331 Modulo 32-bit Indexes
332 ~~~~~~~~~~~~~~~~~~~~~
333
334 In the preceding figures, the prod_head, prod_tail, cons_head and cons_tail indexes are represented by arrows.
335 In the actual implementation, these values are not between 0 and size(ring)-1 as would be assumed.
336 The indexes are between 0 and 2^32 -1, and we mask their value when we access the pointer table (the ring itself).
337 32-bit modulo also implies that operations on indexes (such as, add/subtract) will automatically do 2^32 modulo
338 if the result overflows the 32-bit number range.
339
340 The following are two examples that help to explain how indexes are used in a ring.
341
342 .. note::
343
344     To simplify the explanation, operations with modulo 16-bit are used instead of modulo 32-bit.
345     In addition, the four indexes are defined as unsigned 16-bit integers,
346     as opposed to unsigned 32-bit integers in the more realistic case.
347
348
349 .. _figure_ring-modulo1:
350
351 .. figure:: img/ring-modulo1.*
352
353    Modulo 32-bit indexes - Example 1
354
355
356 This ring contains 11000 entries.
357
358
359 .. _figure_ring-modulo2:
360
361 .. figure:: img/ring-modulo2.*
362
363       Modulo 32-bit indexes - Example 2
364
365
366 This ring contains 12536 entries.
367
368 .. note::
369
370     For ease of understanding, we use modulo 65536 operations in the above examples.
371     In real execution cases, this is redundant for low efficiency, but is done automatically when the result overflows.
372
373 The code always maintains a distance between producer and consumer between 0 and size(ring)-1.
374 Thanks to this property, we can do subtractions between 2 index values in a modulo-32bit base:
375 that's why the overflow of the indexes is not a problem.
376
377 At any time, entries and free_entries are between 0 and size(ring)-1,
378 even if only the first term of subtraction has overflowed:
379
380 .. code-block:: c
381
382     uint32_t entries = (prod_tail - cons_head);
383     uint32_t free_entries = (mask + cons_tail -prod_head);
384
385 References
386 ----------
387
388     *   `bufring.h in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/sys/buf_ring.h?revision=199625&amp;view=markup>`_ (version 8)
389
390     *   `bufring.c in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/kern/subr_bufring.c?revision=199625&amp;view=markup>`_ (version 8)
391
392     *   `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_