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 33Ring Library 34============ 35 36The ring allows the management of queues. 37Instead 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 57The 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 67The 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 73A 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 82References for Ring Implementation in FreeBSD* 83---------------------------------------------- 84 85The 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&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&view=markup>`_ 90 91Lockless Ring Buffer in Linux* 92------------------------------ 93 94The following is a link describing the `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_. 95 96Additional Features 97------------------- 98 99Name 100~~~~ 101 102A ring is identified by a unique name. 103It is not possible to create two rings with the same name (rte_ring_create() returns NULL if this is attempted). 104 105Use Cases 106--------- 107 108Use cases for the Ring library include: 109 110 * Communication between applications in the DPDK 111 112 * Used by memory pool allocator 113 114Anatomy of a Ring Buffer 115------------------------ 116 117This section explains how a ring buffer operates. 118The ring structure is composed of two head and tail couples; one is used by producers and one is used by the consumers. 119The figures of the following sections refer to them as prod_head, prod_tail, cons_head and cons_tail. 120 121Each figure represents a simplified state of the ring, which is a circular buffer. 122The content of the function local variables is represented on the top of the figure, 123and the content of ring structure is represented on the bottom of the figure. 124 125Single Producer Enqueue 126~~~~~~~~~~~~~~~~~~~~~~~ 127 128This section explains what occurs when a producer adds an object to the ring. 129In this example, only the producer head and tail (prod_head and prod_tail) are modified, 130and there is only one producer. 131 132The initial state is to have a prod_head and prod_tail pointing at the same location. 133 134Enqueue First Step 135^^^^^^^^^^^^^^^^^^ 136 137First, *ring->prod_head* and ring->cons_tail are copied in local variables. 138The prod_next local variable points to the next element of the table, or several elements after in case of bulk enqueue. 139 140If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error. 141 142 143.. _figure_ring-enqueue1: 144 145.. figure:: img/ring-enqueue1.* 146 147 Enqueue first step 148 149 150Enqueue Second Step 151^^^^^^^^^^^^^^^^^^^ 152 153The second step is to modify *ring->prod_head* in ring structure to point to the same location as prod_next. 154 155A pointer to the added object is copied in the ring (obj4). 156 157 158.. _figure_ring-enqueue2: 159 160.. figure:: img/ring-enqueue2.* 161 162 Enqueue second step 163 164 165Enqueue Last Step 166^^^^^^^^^^^^^^^^^ 167 168Once 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*. 169The enqueue operation is finished. 170 171 172.. _figure_ring-enqueue3: 173 174.. figure:: img/ring-enqueue3.* 175 176 Enqueue last step 177 178 179Single Consumer Dequeue 180~~~~~~~~~~~~~~~~~~~~~~~ 181 182This section explains what occurs when a consumer dequeues an object from the ring. 183In this example, only the consumer head and tail (cons_head and cons_tail) are modified and there is only one consumer. 184 185The initial state is to have a cons_head and cons_tail pointing at the same location. 186 187Dequeue First Step 188^^^^^^^^^^^^^^^^^^ 189 190First, ring->cons_head and ring->prod_tail are copied in local variables. 191The cons_next local variable points to the next element of the table, or several elements after in the case of bulk dequeue. 192 193If there are not enough objects in the ring (this is detected by checking prod_tail), it returns an error. 194 195 196.. _figure_ring-dequeue1: 197 198.. figure:: img/ring-dequeue1.* 199 200 Dequeue last step 201 202 203Dequeue Second Step 204^^^^^^^^^^^^^^^^^^^ 205 206The second step is to modify ring->cons_head in the ring structure to point to the same location as cons_next. 207 208The pointer to the dequeued object (obj1) is copied in the pointer given by the user. 209 210 211.. _figure_ring-dequeue2: 212 213.. figure:: img/ring-dequeue2.* 214 215 Dequeue second step 216 217 218Dequeue Last Step 219^^^^^^^^^^^^^^^^^ 220 221Finally, ring->cons_tail in the ring structure is modified to point to the same location as ring->cons_head. 222The dequeue operation is finished. 223 224 225.. _figure_ring-dequeue3: 226 227.. figure:: img/ring-dequeue3.* 228 229 Dequeue last step 230 231 232Multiple Producers Enqueue 233~~~~~~~~~~~~~~~~~~~~~~~~~~ 234 235This section explains what occurs when two producers concurrently add an object to the ring. 236In this example, only the producer head and tail (prod_head and prod_tail) are modified. 237 238The initial state is to have a prod_head and prod_tail pointing at the same location. 239 240Multiple Producers Enqueue First Step 241^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 242 243On both cores, *ring->prod_head* and ring->cons_tail are copied in local variables. 244The prod_next local variable points to the next element of the table, 245or several elements after in the case of bulk enqueue. 246 247If there is not enough room in the ring (this is detected by checking cons_tail), it returns an error. 248 249 250.. _figure_ring-mp-enqueue1: 251 252.. figure:: img/ring-mp-enqueue1.* 253 254 Multiple producer enqueue first step 255 256 257Multiple Producers Enqueue Second Step 258^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 259 260The second step is to modify ring->prod_head in the ring structure to point to the same location as prod_next. 261This operation is done using a Compare And Swap (CAS) instruction, which does the following operations atomically: 262 263* If ring->prod_head is different to local variable prod_head, 264 the CAS operation fails, and the code restarts at first step. 265 266* Otherwise, ring->prod_head is set to local prod_next, 267 the CAS operation is successful, and processing continues. 268 269In the figure, the operation succeeded on core 1, and step one restarted on core 2. 270 271 272.. _figure_ring-mp-enqueue2: 273 274.. figure:: img/ring-mp-enqueue2.* 275 276 Multiple producer enqueue second step 277 278 279Multiple Producers Enqueue Third Step 280^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 281 282The CAS operation is retried on core 2 with success. 283 284The core 1 updates one element of the ring(obj4), and the core 2 updates another one (obj5). 285 286 287.. _figure_ring-mp-enqueue3: 288 289.. figure:: img/ring-mp-enqueue3.* 290 291 Multiple producer enqueue third step 292 293 294Multiple Producers Enqueue Fourth Step 295^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 296 297Each core now wants to update ring->prod_tail. 298A core can only update it if ring->prod_tail is equal to the prod_head local variable. 299This is only true on core 1. The operation is finished on core 1. 300 301 302.. _figure_ring-mp-enqueue4: 303 304.. figure:: img/ring-mp-enqueue4.* 305 306 Multiple producer enqueue fourth step 307 308 309Multiple Producers Enqueue Last Step 310^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 311 312Once ring->prod_tail is updated by core 1, core 2 is allowed to update it too. 313The operation is also finished on core 2. 314 315 316.. _figure_ring-mp-enqueue5: 317 318.. figure:: img/ring-mp-enqueue5.* 319 320 Multiple producer enqueue last step 321 322 323Modulo 32-bit Indexes 324~~~~~~~~~~~~~~~~~~~~~ 325 326In the preceding figures, the prod_head, prod_tail, cons_head and cons_tail indexes are represented by arrows. 327In the actual implementation, these values are not between 0 and size(ring)-1 as would be assumed. 328The indexes are between 0 and 2^32 -1, and we mask their value when we access the pointer table (the ring itself). 32932-bit modulo also implies that operations on indexes (such as, add/subtract) will automatically do 2^32 modulo 330if the result overflows the 32-bit number range. 331 332The following are two examples that help to explain how indexes are used in a ring. 333 334.. note:: 335 336 To simplify the explanation, operations with modulo 16-bit are used instead of modulo 32-bit. 337 In addition, the four indexes are defined as unsigned 16-bit integers, 338 as opposed to unsigned 32-bit integers in the more realistic case. 339 340 341.. _figure_ring-modulo1: 342 343.. figure:: img/ring-modulo1.* 344 345 Modulo 32-bit indexes - Example 1 346 347 348This ring contains 11000 entries. 349 350 351.. _figure_ring-modulo2: 352 353.. figure:: img/ring-modulo2.* 354 355 Modulo 32-bit indexes - Example 2 356 357 358This ring contains 12536 entries. 359 360.. note:: 361 362 For ease of understanding, we use modulo 65536 operations in the above examples. 363 In real execution cases, this is redundant for low efficiency, but is done automatically when the result overflows. 364 365The code always maintains a distance between producer and consumer between 0 and size(ring)-1. 366Thanks to this property, we can do subtractions between 2 index values in a modulo-32bit base: 367that's why the overflow of the indexes is not a problem. 368 369At any time, entries and free_entries are between 0 and size(ring)-1, 370even if only the first term of subtraction has overflowed: 371 372.. code-block:: c 373 374 uint32_t entries = (prod_tail - cons_head); 375 uint32_t free_entries = (mask + cons_tail -prod_head); 376 377References 378---------- 379 380 * `bufring.h in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/sys/buf_ring.h?revision=199625&view=markup>`_ (version 8) 381 382 * `bufring.c in FreeBSD <http://svn.freebsd.org/viewvc/base/release/8.0.0/sys/kern/subr_bufring.c?revision=199625&view=markup>`_ (version 8) 383 384 * `Linux Lockless Ring Buffer Design <http://lwn.net/Articles/340400/>`_ 385