doc: programmers guide
[dpdk.git] / doc / guides / prog_guide / poll_mode_drv.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 .. _Poll_Mode_Driver:
32
33 Poll Mode Driver
34 ================
35
36 The Intel® DPDK includes 1 Gigabit, 10 Gigabit and 40 Gigabit and para virtualized virtio Poll Mode Drivers.
37
38 A Poll Mode Driver (PMD) consists of APIs, provided through the BSD driver running in user space,
39 to configure the devices and their respective queues.
40 In addition, a PMD accesses the RX and TX descriptors directly without any interrupts
41 (with the exception of Link Status Change interrupts) to quickly receive,
42 process and deliver packets in the user's application.
43 This section describes the requirements of the PMDs,
44 their global design principles and proposes a high-level architecture and a generic external API for the Ethernet PMDs.
45
46 Requirements and Assumptions
47 ----------------------------
48
49 The Intel® DPDK environment for packet processing applications allows for two models, run-to-completion and pipe-line:
50
51 *   In the *run-to-completion*  model, a specific port's RX descriptor ring is polled for packets through an API.
52     Packets are then processed on the same core and placed on a port's TX descriptor ring through an API for transmission.
53
54 *   In the *pipe-line*  model, one core polls one or more port's RX descriptor ring through an API.
55     Packets are received and passed to another core via a ring.
56     The other core continues to process the packet which then may be placed on a port's TX descriptor ring through an API for transmission.
57
58 In a synchronous run-to-completion model,
59 each logical core assigned to the Intel® DPDK executes a packet processing loop that includes the following steps:
60
61 *   Retrieve input packets through the PMD receive API
62
63 *   Process each received packet one at a time, up to its forwarding
64
65 *   Send pending output packets through the PMD transmit API
66
67 Conversely, in an asynchronous pipe-line model, some logical cores may be dedicated to the retrieval of received packets and
68 other logical cores to the processing of previously received packets.
69 Received packets are exchanged between logical cores through rings.
70 The loop for packet retrieval includes the following steps:
71
72 *   Retrieve input packets through the PMD receive API
73
74 *   Provide received packets to processing lcores through packet queues
75
76 The loop for packet processing includes the following steps:
77
78 *   Retrieve the received packet from the packet queue
79
80 *   Process the received packet, up to its retransmission if forwarded
81
82 To avoid any unnecessary interrupt processing overhead, the execution environment must not use any asynchronous notification mechanisms.
83 Whenever needed and appropriate, asynchronous communication should be introduced as much as possible through the use of rings.
84
85 Avoiding lock contention is a key issue in a multi-core environment.
86 To address this issue, PMDs are designed to work with per-core private resources as much as possible.
87 For example, a PMD maintains a separate transmit queue per-core, per-port.
88 In the same way, every receive queue of a port is assigned to and polled by a single logical core (lcore).
89
90 To comply with Non-Uniform Memory Access (NUMA), memory management is designed to assign to each logical core
91 a private buffer pool in local memory to minimize remote memory access.
92 The configuration of packet buffer pools should take into account the underlying physical memory architecture in terms of DIMMS,
93 channels and ranks.
94 The application must ensure that appropriate parameters are given at memory pool creation time.
95 See :ref:`Mempool Library <Mempool_Library>`.
96
97 Design Principles
98 -----------------
99
100 The API and architecture of the Ethernet* PMDs are designed with the following guidelines in mind.
101
102 PMDs must help global policy-oriented decisions to be enforced at the upper application level.
103 Conversely, NIC PMD functions should not impede the benefits expected by upper-level global policies,
104 or worse prevent such policies from being applied.
105
106 For instance, both the receive and transmit functions of a PMD have a maximum number of packets/descriptors to poll.
107 This allows a run-to-completion processing stack to statically fix or
108 to dynamically adapt its overall behavior through different global loop policies, such as:
109
110 *   Receive, process immediately and transmit packets one at a time in a piecemeal fashion.
111
112 *   Receive as many packets as possible, then process all received packets, transmitting them immediately.
113
114 *   Receive a given maximum number of packets, process the received packets, accumulate them and finally send all accumulated packets to transmit.
115
116 To achieve optimal performance, overall software design choices and pure software optimization techniques must be considered and
117 balanced against available low-level hardware-based optimization features (CPU cache properties, bus speed, NIC PCI bandwidth, and so on).
118 The case of packet transmission is an example of this software/ hardware tradeoff issue when optimizing burst-oriented network packet processing engines.
119 In the initial case, the PMD could export only an rte_eth_tx_one function to transmit one packet at a time on a given queue.
120 On top of that, one can easily build an rte_eth_tx_burst function that loops invoking the rte_eth_tx_one function to transmit several packets at a time.
121 However, an rte_eth_tx_burst function is effectively implemented by the PMD to minimize the driver-level transmit cost per packet through the following optimizations:
122
123 *   Share among multiple packets the un-amortized cost of invoking the rte_eth_tx_one function.
124
125 *   Enable the rte_eth_tx_burst function to take advantage of burst-oriented hardware features (prefetch data in cache, use of NIC head/tail registers)
126     to minimize the number of CPU cycles per packet, for example by avoiding unnecessary read memory accesses to ring transmit descriptors,
127     or by systematically using arrays of pointers that exactly fit cache line boundaries and sizes.
128
129 *   Apply burst-oriented software optimization techniques to remove operations that would otherwise be unavoidable, such as ring index wrap back management.
130
131 Burst-oriented functions are also introduced via the API for services that are intensively used by the PMD.
132 This applies in particular to buffer allocators used to populate NIC rings, which provide functions to allocate/free several buffers at a time.
133 For example, an mbuf_multiple_alloc function returning an array of pointers to rte_mbuf buffers which speeds up the receive poll function of the PMD when
134 replenishing multiple descriptors of the receive ring.
135
136 Logical Cores, Memory and NIC Queues Relationships
137 --------------------------------------------------
138
139 The Intel® DPDK supports NUMA allowing for better performance when a processor's logical cores and interfaces utilize its local memory.
140 Therefore, mbuf allocation associated with local PCIe* interfaces should be allocated from memory pools created in the local memory.
141 The buffers should, if possible, remain on the local processor to obtain the best performance results and RX and TX buffer descriptors
142 should be populated with mbufs allocated from a mempool allocated from local memory.
143
144 The run-to-completion model also performs better if packet or data manipulation is in local memory instead of a remote processors memory.
145 This is also true for the pipe-line model provided all logical cores used are located on the same processor.
146
147 Multiple logical cores should never share receive or transmit queues for interfaces since this would require global locks and hinder performance.
148
149 Device Identification and Configuration
150 ---------------------------------------
151
152 Device Identification
153 ~~~~~~~~~~~~~~~~~~~~~
154
155 Each NIC port is uniquely designated by its (bus/bridge, device, function) PCI
156 identifiers assigned by the PCI probing/enumeration function executed at Intel® DPDK initialization.
157 Based on their PCI identifier, NIC ports are assigned two other identifiers:
158
159 *   A port index used to designate the NIC port in all functions exported by the PMD API.
160
161 *   A port name used to designate the port in console messages, for administration or debugging purposes.
162     For ease of use, the port name includes the port index.
163
164 Device Configuration
165 ~~~~~~~~~~~~~~~~~~~~
166
167 The configuration of each NIC port includes the following operations:
168
169 *   Allocate PCI resources
170
171 *   Reset the hardware (issue a Global Reset) to a well-known default state
172
173 *   Set up the PHY and the link
174
175 *   Initialize statistics counters
176
177 The PMD API must also export functions to start/stop the all-multicast feature of a port and functions to set/unset the port in promiscuous mode.
178
179 Some hardware offload features must be individually configured at port initialization through specific configuration parameters.
180 This is the case for the Receive Side Scaling (RSS) and Data Center Bridging (DCB) features for example.
181
182 On-the-Fly Configuration
183 ~~~~~~~~~~~~~~~~~~~~~~~~
184
185 All device features that can be started or stopped "on the fly" (that is, without stopping the device) do not require the PMD API to export dedicated functions for this purpose.
186
187 All that is required is the mapping address of the device PCI registers to implement the configuration of these features in specific functions outside of the drivers.
188
189 For this purpose,
190 the PMD API exports a function that provides all the information associated with a device that can be used to set up a given device feature outside of the driver.
191 This includes the PCI vendor identifier, the PCI device identifier, the mapping address of the PCI device registers, and the name of the driver.
192
193 The main advantage of this approach is that it gives complete freedom on the choice of the API used to configure, to start, and to stop such features.
194
195 As an example, refer to the configuration of the IEEE1588 feature for the Intel® 82576 Gigabit Ethernet Controller and
196 the Intel® 82599 10 Gigabit Ethernet Controller controllers in the testpmd application.
197
198 Other features such as the L3/L4 5-Tuple packet filtering feature of a port can be configured in the same way.
199 Ethernet* flow control (pause frame) can be configured on the individual port.
200 Refer to the testpmd source code for details.
201 Also, L4 (UDP/TCP/ SCTP) checksum offload by the NIC can be enabled for an individual packet as long as the packet mbuf is set up correctly.
202 Refer to the testpmd source code (specifically the csumonly.c file) for details.
203
204 That being said, the support of some offload features implies the addition of dedicated status bit(s) and value field(s) into the rte_mbuf
205 data structure, along with their appropriate handling by the receive/transmit functions exported by each PMD.
206
207 For instance, this is the case for the IEEE1588 packet timestamp mechanism, the VLAN tagging and the IP checksum computation, as described in
208 the Section 7.6 "Meta Information".
209
210 Configuration of Transmit and Receive Queues
211 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212
213 Each transmit queue is independently configured with the following information:
214
215 *   The number of descriptors of the transmit ring
216
217 *   The socket identifier used to identify the appropriate DMA memory zone from which to allocate the transmit ring in NUMA architectures
218
219 *   The values of the Prefetch, Host and Write-Back threshold registers of the transmit queue
220
221 *   The *minimum* transmit packets to free threshold (tx_free_thresh).
222     When the number of descriptors used to transmit packets exceeds this threshold, the network adaptor should be checked to see if it has written back descriptors.
223     A value of 0 can be passed during the TX queue configuration to indicate the default value should be used.
224     The default value for tx_free_thresh is 32.
225     This ensures that the PMD does not search for completed descriptors until at least 32 have been processed by the NIC for this queue.
226
227 *   The *minimum*  RS bit threshold. The minimum number of transmit descriptors to use before setting the Report Status (RS) bit in the transmit descriptor.
228     Note that this parameter may only be valid for Intel 10 GbE network adapters.
229     The RS bit is set on the last descriptor used to transmit a packet if the number of descriptors used since the last RS bit setting,
230     up to the first descriptor used to transmit the packet, exceeds the transmit RS bit threshold (tx_rs_thresh).
231     In short, this parameter controls which transmit descriptors are written back to host memory by the network adapter.
232     A value of 0 can be passed during the TX queue configuration to indicate that the default value should be used.
233     The default value for tx_rs_thresh is 32.
234     This ensures that at least 32 descriptors are used before the network adapter writes back the most recently used descriptor.
235     This saves upstream PCIe* bandwidth resulting from TX descriptor write-backs.
236     It is important to note that the TX Write-back threshold (TX wthresh) should be set to 0 when tx_rs_thresh is greater than 1.
237     Refer to the Intel® 82599 10 Gigabit Ethernet Controller Datasheet for more details.
238
239 The following constraints must be satisfied for tx_free_thresh and tx_rs_thresh:
240
241 *   tx_rs_thresh must be greater than 0.
242
243 *   tx_rs_thresh must be less than the size of the ring minus 2.
244
245 *   tx_rs_thresh must be less than or equal to tx_free_thresh.
246
247 *   tx_free_thresh must be greater than 0.
248
249 *   tx_free_thresh must be less than the size of the ring minus 3.
250
251 *   For optimal performance, TX wthresh should be set to 0 when tx_rs_thresh is greater than 1.
252
253 One descriptor in the TX ring is used as a sentinel to avoid a hardware race condition, hence the maximum threshold constraints.
254
255 .. note::
256
257     When configuring for DCB operation, at port initialization, both the number of transmit queues and the number of receive queues must be set to 128.
258
259 Poll Mode Driver API
260 --------------------
261
262 Generalities
263 ~~~~~~~~~~~~
264
265 By default, all functions exported by a PMD are lock-free functions that are assumed
266 not to be invoked in parallel on different logical cores to work on the same target object.
267 For instance, a PMD receive function cannot be invoked in parallel on two logical cores to poll the same RX queue of the same port.
268 Of course, this function can be invoked in parallel by different logical cores on different RX queues.
269 It is the responsibility of the upper-level application to enforce this rule.
270
271 If needed, parallel accesses by multiple logical cores to shared queues can be explicitly protected by dedicated inline lock-aware functions
272 built on top of their corresponding lock-free functions of the PMD API.
273
274 Generic Packet Representation
275 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
276
277 A packet is represented by an rte_mbuf structure, which is a generic metadata structure containing all necessary housekeeping information.
278 This includes fields and status bits corresponding to offload hardware features, such as checksum computation of IP headers or VLAN tags.
279
280 The rte_mbuf data structure includes specific fields to represent, in a generic way, the offload features provided by network controllers.
281 For an input packet, most fields of the rte_mbuf structure are filled in by the PMD receive function with the information contained in the receive descriptor.
282 Conversely, for output packets, most fields of rte_mbuf structures are used by the PMD transmit function to initialize transmit descriptors.
283
284 The mbuf structure is fully described in the :ref:`Mbuf Library <Mbuf_Library>` chapter.
285
286 Ethernet Device API
287 ~~~~~~~~~~~~~~~~~~~
288
289 The Ethernet device API exported by the Ethernet PMDs is described in the *Intel® DPDK API Reference*.
290
291 Vector PMD for IXGBE
292 --------------------
293
294 Vector PMD uses Intel® SIMD instructions to optimize packet I/O.
295 It improves load/store bandwidth efficiency of L1 data cache by using a wider SSE/AVX register 1 (1).
296 The wider register gives space to hold multiple packet buffers so as to save instruction number when processing bulk of packets.
297
298 There is no change to PMD API. The RX/TX handler are the only two entries for vPMD packet I/O.
299 They are transparently registered at runtime RX/TX execution if all condition checks pass.
300
301 1.  To date, only an SSE version of IX GBE vPMD is available.
302     To ensure that vPMD is in the binary code, ensure that the option CONFIG_RTE_IXGBE_INC_VECTOR=y is in the configure file.
303
304 Some constraints apply as pre-conditions for specific optimizations on bulk packet transfers.
305 The following sections explain RX and TX constraints in the vPMD.
306
307 RX Constraints
308 ~~~~~~~~~~~~~~
309
310 Prerequisites and Pre-conditions
311 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
312
313 The following prerequisites apply:
314
315 *   To enable vPMD to work for RX, bulk allocation for Rx must be allowed.
316
317 *   The RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC=y configuration MACRO must be set before compiling the code.
318
319 Ensure that the following pre-conditions are satisfied:
320
321 *   rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST
322
323 *   rxq->rx_free_thresh < rxq->nb_rx_desc
324
325 *   (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
326
327 *   rxq->nb_rx_desc  < (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST)
328
329 These conditions are checked in the code.
330
331 Scattered packets are not supported in this mode.
332 If an incoming packet is greater than the maximum acceptable length of one "mbuf" data size (by default, the size is 2 KB),
333 vPMD for RX would be disabled.
334
335 By default, IXGBE_MAX_RING_DESC is set to 4096 and RTE_PMD_IXGBE_RX_MAX_BURST is set to 32.
336
337 Feature not Supported by RX Vector PMD
338 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
339
340 Some features are not supported when trying to increase the throughput in vPMD.
341 They are:
342
343 *   IEEE1588
344
345 *   FDIR
346
347 *   Header split
348
349 *   RX checksum off load
350
351 Other features are supported using optional MACRO configuration. They include:
352
353 *   HW VLAN strip
354
355 *   HW extend dual VLAN
356
357 *   Enabled by RX_OLFLAGS (RTE_IXGBE_RX_OLFLAGS_DISABLE=n)
358
359
360 To guarantee the constraint, configuration flags in dev_conf.rxmode will be checked:
361
362 *   hw_vlan_strip
363
364 *   hw_vlan_extend
365
366 *   hw_ip_checksum
367
368 *   header_split
369
370 *   dev_conf
371
372 fdir_conf->mode will also be checked.
373
374 RX Burst Size
375 ^^^^^^^^^^^^^
376
377 As vPMD is focused on high throughput, it assumes that the RX burst size is equal to or greater than 32 per burst.
378 It returns zero if using nb_pkt < 32 as the expected packet number in the receive handler.
379
380 TX Constraint
381 ~~~~~~~~~~~~~
382
383 Prerequisite
384 ^^^^^^^^^^^^
385
386 The only prerequisite is related to tx_rs_thresh.
387 The tx_rs_thresh value must be greater than or equal to RTE_PMD_IXGBE_TX_MAX_BURST,
388 but less or equal to RTE_IXGBE_TX_MAX_FREE_BUF_SZ.
389 Consequently, by default the tx_rs_thresh value is in the range 32 to 64.
390
391 Feature not Supported by RX Vector PMD
392 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
393
394 TX vPMD only works when txq_flags is set to IXGBE_SIMPLE_FLAGS.
395
396 This means that it does not support TX multi-segment, VLAN offload and TX csum offload.
397 The following MACROs are used for these three features:
398
399 *   ETH_TXQ_FLAGS_NOMULTSEGS
400
401 *   ETH_TXQ_FLAGS_NOVLANOFFL
402
403 *   ETH_TXQ_FLAGS_NOXSUMSCTP
404
405 *   ETH_TXQ_FLAGS_NOXSUMUDP
406
407 *   ETH_TXQ_FLAGS_NOXSUMTCP
408
409
410 Sample Application Notes
411 ~~~~~~~~~~~~~~~~~~~~~~~~
412
413 testpmd
414 ^^^^^^^
415
416 By default, using CONFIG_RTE_IXGBE_RX_OLFLAGS_DISABLE=n:
417
418 .. code-block:: console
419
420     ./x86_64-native-linuxapp-gcc/app/testpmd -c 300 -n 4 -- -i --burst=32 --rxfreet=32 --mbcache=250 --txpt=32 --rxht=8 --rxwt=0 --txfreet=32 --txrst=32 --txqflags=0xf01
421
422 When CONFIG_RTE_IXGBE_RX_OLFLAGS_DISABLE=y, better performance can be achieved:
423
424 .. code-block:: console
425
426     ./x86_64-native-linuxapp-gcc/app/testpmd -c 300 -n 4 -- -i --burst=32 --rxfreet=32 --mbcache=250 --txpt=32 --rxht=8 --rxwt=0 --txfreet=32 --txrst=32 --txqflags=0xf01 --disable-hw-vlan
427
428 If scatter gather lists are not required, set CONFIG_RTE_MBUF_SCATTER_GATHER=n for better throughput.
429
430 l3fwd
431 ^^^^^
432
433 When running l3fwd with vPMD, there is one thing to note.
434 In the configuration, ensure that port_conf.rxmode.hw_ip_checksum=0.
435 Otherwise, by default, RX vPMD is disabled.
436
437 load_balancer
438 ^^^^^^^^^^^^^
439
440 As in the case of l3fwd, set configure port_conf.rxmode.hw_ip_checksum=0 to enable vPMD.
441 In addition, for improved performance, use -bsz "(32,32),(64,64),(32,32)" in load_balancer to avoid using the default burst size of 144.