66f90b143783dcc2ca8ad50cca5e002f3cd5d965
[dpdk.git] / doc / guides / nics / intel_vf.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 Intel Virtual Function Driver
32 =============================
33
34 Supported Intel® Ethernet Controllers (see the *DPDK Release Notes* for details)
35 support the following modes of operation in a virtualized environment:
36
37 *   **SR-IOV mode**: Involves direct assignment of part of the port resources to different guest operating systems
38     using the PCI-SIG Single Root I/O Virtualization (SR IOV) standard,
39     also known as "native mode" or "pass-through" mode.
40     In this chapter, this mode is referred to as IOV mode.
41
42 *   **VMDq mode**: Involves central management of the networking resources by an IO Virtual Machine (IOVM) or
43     a Virtual Machine Monitor (VMM), also known as software switch acceleration mode.
44     In this chapter, this mode is referred to as the Next Generation VMDq mode.
45
46 SR-IOV Mode Utilization in a DPDK Environment
47 ---------------------------------------------
48
49 The DPDK uses the SR-IOV feature for hardware-based I/O sharing in IOV mode.
50 Therefore, it is possible to partition SR-IOV capability on Ethernet controller NIC resources logically and
51 expose them to a virtual machine as a separate PCI function called a "Virtual Function".
52 Refer to :numref:`figure_single_port_nic`.
53
54 Therefore, a NIC is logically distributed among multiple virtual machines (as shown in :numref:`figure_single_port_nic`),
55 while still having global data in common to share with the Physical Function and other Virtual Functions.
56 The DPDK fm10kvf, i40evf, igbvf or ixgbevf as a Poll Mode Driver (PMD) serves for the Intel® 82576 Gigabit Ethernet Controller,
57 Intel® Ethernet Controller I350 family, Intel® 82599 10 Gigabit Ethernet Controller NIC,
58 Intel® Fortville 10/40 Gigabit Ethernet Controller NIC's virtual PCI function, or PCIe host-interface of the Intel Ethernet Switch
59 FM10000 Series.
60 Meanwhile the DPDK Poll Mode Driver (PMD) also supports "Physical Function" of such NIC's on the host.
61
62 The DPDK PF/VF Poll Mode Driver (PMD) supports the Layer 2 switch on Intel® 82576 Gigabit Ethernet Controller,
63 Intel® Ethernet Controller I350 family, Intel® 82599 10 Gigabit Ethernet Controller,
64 and Intel® Fortville 10/40 Gigabit Ethernet Controller NICs so that guest can choose it for inter virtual machine traffic in SR-IOV mode.
65
66 For more detail on SR-IOV, please refer to the following documents:
67
68 *   `SR-IOV provides hardware based I/O sharing <http://www.intel.com/network/connectivity/solutions/vmdc.htm>`_
69
70 *   `PCI-SIG-Single Root I/O Virtualization Support on IA
71     <http://www.intel.com/content/www/us/en/pci-express/pci-sig-single-root-io-virtualization-support-in-virtualization-technology-for-connectivity-paper.html>`_
72
73 *   `Scalable I/O Virtualized Servers <http://www.intel.com/content/www/us/en/virtualization/server-virtualization/scalable-i-o-virtualized-servers-paper.html>`_
74
75 .. _figure_single_port_nic:
76
77 .. figure:: img/single_port_nic.*
78
79    Virtualization for a Single Port NIC in SR-IOV Mode
80
81
82 Physical and Virtual Function Infrastructure
83 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84
85 The following describes the Physical Function and Virtual Functions infrastructure for the supported Ethernet Controller NICs.
86
87 Virtual Functions operate under the respective Physical Function on the same NIC Port and therefore have no access
88 to the global NIC resources that are shared between other functions for the same NIC port.
89
90 A Virtual Function has basic access to the queue resources and control structures of the queues assigned to it.
91 For global resource access, a Virtual Function has to send a request to the Physical Function for that port,
92 and the Physical Function operates on the global resources on behalf of the Virtual Function.
93 For this out-of-band communication, an SR-IOV enabled NIC provides a memory buffer for each Virtual Function,
94 which is called a "Mailbox".
95
96 Intel® Ethernet Adaptive Virtual Function
97 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
98 Adaptive Virtual Function (AVF) is a SR-IOV Virtual Function with the same device id (8086:1889) on different Intel Ethernet Controller.
99 AVF Driver is VF driver which supports for all future Intel devices without requiring a VM update. And since this happens to be an adaptive VF driver,
100 every new drop of the VF driver would add more and more advanced features that can be turned on in the VM if the underlying HW device supports those
101 advanced features based on a device agnostic way without ever compromising on the base functionality. AVF provides generic hardware interface and
102 interface between AVF driver and a compliant PF driver is specified.
103
104 Intel products starting Ethernet Controller 710 Series to support Adaptive Virtual Function.
105
106 The way to generate Virtual Function is like normal, and the resource of VF assignment depends on the NIC Infrastructure.
107
108 For more detail on SR-IOV, please refer to the following documents:
109
110 *   `Intel® AVF HAS <https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/ethernet-adaptive-virtual-function-hardware-spec.pdf>`_
111
112 The PCIE host-interface of Intel Ethernet Switch FM10000 Series VF infrastructure
113 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
114
115 In a virtualized environment, the programmer can enable a maximum of *64 Virtual Functions (VF)*
116 globally per PCIE host-interface of the Intel Ethernet Switch FM10000 Series device.
117 Each VF can have a maximum of 16 queue pairs.
118 The Physical Function in host could be only configured by the Linux* fm10k driver
119 (in the case of the Linux Kernel-based Virtual Machine [KVM]), DPDK PMD PF driver doesn't support it yet.
120
121 For example,
122
123 *   Using Linux* fm10k driver:
124
125     .. code-block:: console
126
127         rmmod fm10k (To remove the fm10k module)
128         insmod fm0k.ko max_vfs=2,2 (To enable two Virtual Functions per port)
129
130 Virtual Function enumeration is performed in the following sequence by the Linux* pci driver for a dual-port NIC.
131 When you enable the four Virtual Functions with the above command, the four enabled functions have a Function#
132 represented by (Bus#, Device#, Function#) in sequence starting from 0 to 3.
133 However:
134
135 *   Virtual Functions 0 and 2 belong to Physical Function 0
136
137 *   Virtual Functions 1 and 3 belong to Physical Function 1
138
139 .. note::
140
141     The above is an important consideration to take into account when targeting specific packets to a selected port.
142
143 Intel® X710/XL710 Gigabit Ethernet Controller VF Infrastructure
144 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
145
146 In a virtualized environment, the programmer can enable a maximum of *128 Virtual Functions (VF)*
147 globally per Intel® X710/XL710 Gigabit Ethernet Controller NIC device.
148 The number of queue pairs of each VF can be configured by ``CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF`` in ``config`` file.
149 The Physical Function in host could be either configured by the Linux* i40e driver
150 (in the case of the Linux Kernel-based Virtual Machine [KVM]) or by DPDK PMD PF driver.
151 When using both DPDK PMD PF/VF drivers, the whole NIC will be taken over by DPDK based application.
152
153 For example,
154
155 *   Using Linux* i40e  driver:
156
157     .. code-block:: console
158
159         rmmod i40e (To remove the i40e module)
160         insmod i40e.ko max_vfs=2,2 (To enable two Virtual Functions per port)
161
162 *   Using the DPDK PMD PF i40e driver:
163
164     Kernel Params: iommu=pt, intel_iommu=on
165
166     .. code-block:: console
167
168         modprobe uio
169         insmod igb_uio
170         ./dpdk-devbind.py -b igb_uio bb:ss.f
171         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific PCI device)
172
173     Launch the DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
174
175 Virtual Function enumeration is performed in the following sequence by the Linux* pci driver for a dual-port NIC.
176 When you enable the four Virtual Functions with the above command, the four enabled functions have a Function#
177 represented by (Bus#, Device#, Function#) in sequence starting from 0 to 3.
178 However:
179
180 *   Virtual Functions 0 and 2 belong to Physical Function 0
181
182 *   Virtual Functions 1 and 3 belong to Physical Function 1
183
184 .. note::
185
186     The above is an important consideration to take into account when targeting specific packets to a selected port.
187
188     For Intel® X710/XL710 Gigabit Ethernet Controller, queues are in pairs. One queue pair means one receive queue and
189     one transmit queue. The default number of queue pairs per VF is 4, and can be 16 in maximum.
190
191 Intel® 82599 10 Gigabit Ethernet Controller VF Infrastructure
192 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
193
194 The programmer can enable a maximum of *63 Virtual Functions* and there must be *one Physical Function* per Intel® 82599
195 10 Gigabit Ethernet Controller NIC port.
196 The reason for this is that the device allows for a maximum of 128 queues per port and a virtual/physical function has to
197 have at least one queue pair (RX/TX).
198 The current implementation of the DPDK ixgbevf driver supports a single queue pair (RX/TX) per Virtual Function.
199 The Physical Function in host could be either configured by the Linux* ixgbe driver
200 (in the case of the Linux Kernel-based Virtual Machine [KVM]) or by DPDK PMD PF driver.
201 When using both DPDK PMD PF/VF drivers, the whole NIC will be taken over by DPDK based application.
202
203 For example,
204
205 *   Using Linux* ixgbe driver:
206
207     .. code-block:: console
208
209         rmmod ixgbe (To remove the ixgbe module)
210         insmod ixgbe max_vfs=2,2 (To enable two Virtual Functions per port)
211
212 *   Using the DPDK PMD PF ixgbe driver:
213
214     Kernel Params: iommu=pt, intel_iommu=on
215
216     .. code-block:: console
217
218         modprobe uio
219         insmod igb_uio
220         ./dpdk-devbind.py -b igb_uio bb:ss.f
221         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific PCI device)
222
223     Launch the DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
224
225 *   Using the DPDK PMD PF ixgbe driver to enable VF RSS:
226
227     Same steps as above to install the modules of uio, igb_uio, specify max_vfs for PCI device, and
228     launch the DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
229
230     The available queue number (at most 4) per VF depends on the total number of pool, which is
231     determined by the max number of VF at PF initialization stage and the number of queue specified
232     in config:
233
234     *   If the max number of VFs (max_vfs) is set in the range of 1 to 32:
235
236         If the number of Rx queues is specified as 4 (``--rxq=4`` in testpmd), then there are totally 32
237         pools (ETH_32_POOLS), and each VF could have 4 Rx queues;
238
239         If the number of Rx queues is specified as 2 (``--rxq=2`` in testpmd), then there are totally 32
240         pools (ETH_32_POOLS), and each VF could have 2 Rx queues;
241
242     *   If the max number of VFs (max_vfs) is in the range of 33 to 64:
243
244         If the number of Rx queues in specified as 4 (``--rxq=4`` in testpmd), then error message is expected
245         as ``rxq`` is not correct at this case;
246
247         If the number of rxq is 2 (``--rxq=2`` in testpmd), then there is totally 64 pools (ETH_64_POOLS),
248         and each VF have 2 Rx queues;
249
250     On host, to enable VF RSS functionality, rx mq mode should be set as ETH_MQ_RX_VMDQ_RSS
251     or ETH_MQ_RX_RSS mode, and SRIOV mode should be activated (max_vfs >= 1).
252     It also needs config VF RSS information like hash function, RSS key, RSS key length.
253
254 .. note::
255
256     The limitation for VF RSS on Intel® 82599 10 Gigabit Ethernet Controller is:
257     The hash and key are shared among PF and all VF, the RETA table with 128 entries is also shared
258     among PF and all VF; So it could not to provide a method to query the hash and reta content per
259     VF on guest, while, if possible, please query them on host for the shared RETA information.
260
261 Virtual Function enumeration is performed in the following sequence by the Linux* pci driver for a dual-port NIC.
262 When you enable the four Virtual Functions with the above command, the four enabled functions have a Function#
263 represented by (Bus#, Device#, Function#) in sequence starting from 0 to 3.
264 However:
265
266 *   Virtual Functions 0 and 2 belong to Physical Function 0
267
268 *   Virtual Functions 1 and 3 belong to Physical Function 1
269
270 .. note::
271
272     The above is an important consideration to take into account when targeting specific packets to a selected port.
273
274 Intel® 82576 Gigabit Ethernet Controller and Intel® Ethernet Controller I350 Family VF Infrastructure
275 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
276
277 In a virtualized environment, an Intel® 82576 Gigabit Ethernet Controller serves up to eight virtual machines (VMs).
278 The controller has 16 TX and 16 RX queues.
279 They are generally referred to (or thought of) as queue pairs (one TX and one RX queue).
280 This gives the controller 16 queue pairs.
281
282 A pool is a group of queue pairs for assignment to the same VF, used for transmit and receive operations.
283 The controller has eight pools, with each pool containing two queue pairs, that is, two TX and two RX queues assigned to each VF.
284
285 In a virtualized environment, an Intel® Ethernet Controller I350 family device serves up to eight virtual machines (VMs) per port.
286 The eight queues can be accessed by eight different VMs if configured correctly (the i350 has 4x1GbE ports each with 8T X and 8 RX queues),
287 that means, one Transmit and one Receive queue assigned to each VF.
288
289 For example,
290
291 *   Using Linux* igb driver:
292
293     .. code-block:: console
294
295         rmmod igb (To remove the igb module)
296         insmod igb max_vfs=2,2 (To enable two Virtual Functions per port)
297
298 *   Using DPDK PMD PF igb driver:
299
300     Kernel Params: iommu=pt, intel_iommu=on modprobe uio
301
302     .. code-block:: console
303
304         insmod igb_uio
305         ./dpdk-devbind.py -b igb_uio bb:ss.f
306         echo 2 > /sys/bus/pci/devices/0000\:bb\:ss.f/max_vfs (To enable two VFs on a specific pci device)
307
308     Launch DPDK testpmd/example or your own host daemon application using the DPDK PMD library.
309
310 Virtual Function enumeration is performed in the following sequence by the Linux* pci driver for a four-port NIC.
311 When you enable the four Virtual Functions with the above command, the four enabled functions have a Function#
312 represented by (Bus#, Device#, Function#) in sequence, starting from 0 to 7.
313 However:
314
315 *   Virtual Functions 0 and 4 belong to Physical Function 0
316
317 *   Virtual Functions 1 and 5 belong to Physical Function 1
318
319 *   Virtual Functions 2 and 6 belong to Physical Function 2
320
321 *   Virtual Functions 3 and 7 belong to Physical Function 3
322
323 .. note::
324
325     The above is an important consideration to take into account when targeting specific packets to a selected port.
326
327 Validated Hypervisors
328 ~~~~~~~~~~~~~~~~~~~~~
329
330 The validated hypervisor is:
331
332 *   KVM (Kernel Virtual Machine) with  Qemu, version 0.14.0
333
334 However, the hypervisor is bypassed to configure the Virtual Function devices using the Mailbox interface,
335 the solution is hypervisor-agnostic.
336 Xen* and VMware* (when SR- IOV is supported) will also be able to support the DPDK with Virtual Function driver support.
337
338 Expected Guest Operating System in Virtual Machine
339 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
340
341 The expected guest operating systems in a virtualized environment are:
342
343 *   Fedora* 14 (64-bit)
344
345 *   Ubuntu* 10.04 (64-bit)
346
347 For supported kernel versions, refer to the *DPDK Release Notes*.
348
349 Setting Up a KVM Virtual Machine Monitor
350 ----------------------------------------
351
352 The following describes a target environment:
353
354 *   Host Operating System: Fedora 14
355
356 *   Hypervisor: KVM (Kernel Virtual Machine) with Qemu  version 0.14.0
357
358 *   Guest Operating System: Fedora 14
359
360 *   Linux Kernel Version: Refer to the  *DPDK Getting Started Guide*
361
362 *   Target Applications:  l2fwd, l3fwd-vf
363
364 The setup procedure is as follows:
365
366 #.  Before booting the Host OS, open **BIOS setup** and enable **Intel® VT features**.
367
368 #.  While booting the Host OS kernel, pass the intel_iommu=on kernel command line argument using GRUB.
369     When using DPDK PF driver on host, pass the iommu=pt kernel command line argument in GRUB.
370
371 #.  Download qemu-kvm-0.14.0 from
372     `http://sourceforge.net/projects/kvm/files/qemu-kvm/ <http://sourceforge.net/projects/kvm/files/qemu-kvm/>`_
373     and install it in the Host OS using the following steps:
374
375     When using a recent kernel (2.6.25+) with kvm modules included:
376
377     .. code-block:: console
378
379         tar xzf qemu-kvm-release.tar.gz
380         cd qemu-kvm-release
381         ./configure --prefix=/usr/local/kvm
382         make
383         sudo make install
384         sudo /sbin/modprobe kvm-intel
385
386     When using an older kernel, or a kernel from a distribution without the kvm modules,
387     you must download (from the same link), compile and install the modules yourself:
388
389     .. code-block:: console
390
391         tar xjf kvm-kmod-release.tar.bz2
392         cd kvm-kmod-release
393         ./configure
394         make
395         sudo make install
396         sudo /sbin/modprobe kvm-intel
397
398     qemu-kvm installs in the /usr/local/bin directory.
399
400     For more details about KVM configuration and usage, please refer to:
401
402     `http://www.linux-kvm.org/page/HOWTO1 <http://www.linux-kvm.org/page/HOWTO1>`_.
403
404 #.  Create a Virtual Machine and install Fedora 14 on the Virtual Machine.
405     This is referred to as the Guest Operating System (Guest OS).
406
407 #.  Download and install the latest ixgbe driver from:
408
409     `http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;DwnldID=14687 <http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;DwnldID=14687>`_
410
411 #.  In the Host OS
412
413     When using Linux kernel ixgbe driver, unload the Linux ixgbe driver and reload it with the max_vfs=2,2 argument:
414
415     .. code-block:: console
416
417         rmmod ixgbe
418         modprobe ixgbe max_vfs=2,2
419
420     When using DPDK PMD PF driver, insert DPDK kernel module igb_uio and set the number of VF by sysfs max_vfs:
421
422     .. code-block:: console
423
424         modprobe uio
425         insmod igb_uio
426         ./dpdk-devbind.py -b igb_uio 02:00.0 02:00.1 0e:00.0 0e:00.1
427         echo 2 > /sys/bus/pci/devices/0000\:02\:00.0/max_vfs
428         echo 2 > /sys/bus/pci/devices/0000\:02\:00.1/max_vfs
429         echo 2 > /sys/bus/pci/devices/0000\:0e\:00.0/max_vfs
430         echo 2 > /sys/bus/pci/devices/0000\:0e\:00.1/max_vfs
431
432     .. note::
433
434         You need to explicitly specify number of vfs for each port, for example,
435         in the command above, it creates two vfs for the first two ixgbe ports.
436
437     Let say we have a machine with four physical ixgbe ports:
438
439
440         0000:02:00.0
441
442         0000:02:00.1
443
444         0000:0e:00.0
445
446         0000:0e:00.1
447
448     The command above creates two vfs for device 0000:02:00.0:
449
450     .. code-block:: console
451
452         ls -alrt /sys/bus/pci/devices/0000\:02\:00.0/virt*
453         lrwxrwxrwx. 1 root root 0 Apr 13 05:40 /sys/bus/pci/devices/0000:02:00.0/virtfn1 -> ../0000:02:10.2
454         lrwxrwxrwx. 1 root root 0 Apr 13 05:40 /sys/bus/pci/devices/0000:02:00.0/virtfn0 -> ../0000:02:10.0
455
456     It also creates two vfs for device 0000:02:00.1:
457
458     .. code-block:: console
459
460         ls -alrt /sys/bus/pci/devices/0000\:02\:00.1/virt*
461         lrwxrwxrwx. 1 root root 0 Apr 13 05:51 /sys/bus/pci/devices/0000:02:00.1/virtfn1 -> ../0000:02:10.3
462         lrwxrwxrwx. 1 root root 0 Apr 13 05:51 /sys/bus/pci/devices/0000:02:00.1/virtfn0 -> ../0000:02:10.1
463
464 #.  List the PCI devices connected and notice that the Host OS shows two Physical Functions (traditional ports)
465     and four Virtual Functions (two for each port).
466     This is the result of the previous step.
467
468 #.  Insert the pci_stub module to hold the PCI devices that are freed from the default driver using the following command
469     (see http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM Section 4 for more information):
470
471     .. code-block:: console
472
473         sudo /sbin/modprobe pci-stub
474
475     Unbind the default driver from the PCI devices representing the Virtual Functions.
476     A script to perform this action is as follows:
477
478     .. code-block:: console
479
480         echo "8086 10ed" > /sys/bus/pci/drivers/pci-stub/new_id
481         echo 0000:08:10.0 > /sys/bus/pci/devices/0000:08:10.0/driver/unbind
482         echo 0000:08:10.0 > /sys/bus/pci/drivers/pci-stub/bind
483
484     where, 0000:08:10.0 belongs to the Virtual Function visible in the Host OS.
485
486 #.  Now, start the Virtual Machine by running the following command:
487
488     .. code-block:: console
489
490         /usr/local/kvm/bin/qemu-system-x86_64 -m 4096 -smp 4 -boot c -hda lucid.qcow2 -device pci-assign,host=08:10.0
491
492     where:
493
494         — -m = memory to assign
495
496         — -smp = number of smp cores
497
498         — -boot = boot option
499
500         — -hda = virtual disk image
501
502         — -device = device to attach
503
504     .. note::
505
506         — The pci-assign,host=08:10.0 value indicates that you want to attach a PCI device
507         to a Virtual Machine and the respective (Bus:Device.Function)
508         numbers should be passed for the Virtual Function to be attached.
509
510         — qemu-kvm-0.14.0 allows a maximum of four PCI devices assigned to a VM,
511         but this is qemu-kvm version dependent since qemu-kvm-0.14.1 allows a maximum of five PCI devices.
512
513         — qemu-system-x86_64 also has a -cpu command line option that is used to select the cpu_model
514         to emulate in a Virtual Machine. Therefore, it can be used as:
515
516         .. code-block:: console
517
518             /usr/local/kvm/bin/qemu-system-x86_64 -cpu ?
519
520             (to list all available cpu_models)
521
522             /usr/local/kvm/bin/qemu-system-x86_64 -m 4096 -cpu host -smp 4 -boot c -hda lucid.qcow2 -device pci-assign,host=08:10.0
523
524             (to use the same cpu_model equivalent to the host cpu)
525
526         For more information, please refer to: `http://wiki.qemu.org/Features/CPUModels <http://wiki.qemu.org/Features/CPUModels>`_.
527
528 #.  Install and run DPDK host app to take  over the Physical Function. Eg.
529
530     .. code-block:: console
531
532         make install T=x86_64-native-linuxapp-gcc
533         ./x86_64-native-linuxapp-gcc/app/testpmd -l 0-3 -n 4 -- -i
534
535 #.  Finally, access the Guest OS using vncviewer with the localhost:5900 port and check the lspci command output in the Guest OS.
536     The virtual functions will be listed as available for use.
537
538 #.  Configure and install the DPDK with an x86_64-native-linuxapp-gcc configuration on the Guest OS as normal,
539     that is, there is no change to the normal installation procedure.
540
541     .. code-block:: console
542
543         make config T=x86_64-native-linuxapp-gcc O=x86_64-native-linuxapp-gcc
544         cd x86_64-native-linuxapp-gcc
545         make
546
547 .. note::
548
549     If you are unable to compile the DPDK and you are getting "error: CPU you selected does not support x86-64 instruction set",
550     power off the Guest OS and start the virtual machine with the correct -cpu option in the qemu- system-x86_64 command as shown in step 9.
551     You must select the best x86_64 cpu_model to emulate or you can select host option if available.
552
553 .. note::
554
555     Run the DPDK l2fwd sample application in the Guest OS with Hugepages enabled.
556     For the expected benchmark performance, you must pin the cores from the Guest OS to the Host OS (taskset can be used to do this) and
557     you must also look at the PCI Bus layout on the board to ensure you are not running the traffic over the QPI Interface.
558
559 .. note::
560
561     *   The Virtual Machine Manager (the Fedora package name is virt-manager) is a utility for virtual machine management
562         that can also be used to create, start, stop and delete virtual machines.
563         If this option is used, step 2 and 6 in the instructions provided will be different.
564
565     *   virsh, a command line utility for virtual machine management,
566         can also be used to bind and unbind devices to a virtual machine in Ubuntu.
567         If this option is used, step 6 in the instructions provided will be different.
568
569     *   The Virtual Machine Monitor (see :numref:`figure_perf_benchmark`) is equivalent to a Host OS with KVM installed as described in the instructions.
570
571 .. _figure_perf_benchmark:
572
573 .. figure:: img/perf_benchmark.*
574
575    Performance Benchmark Setup
576
577
578 DPDK SR-IOV PMD PF/VF Driver Usage Model
579 ----------------------------------------
580
581 Fast Host-based Packet Processing
582 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
583
584 Software Defined Network (SDN) trends are demanding fast host-based packet handling.
585 In a virtualization environment,
586 the DPDK VF PMD driver performs the same throughput result as a non-VT native environment.
587
588 With such host instance fast packet processing, lots of services such as filtering, QoS,
589 DPI can be offloaded on the host fast path.
590
591 :numref:`figure_fast_pkt_proc` shows the scenario where some VMs directly communicate externally via a VFs,
592 while others connect to a virtual switch and share the same uplink bandwidth.
593
594 .. _figure_fast_pkt_proc:
595
596 .. figure:: img/fast_pkt_proc.*
597
598    Fast Host-based Packet Processing
599
600
601 SR-IOV (PF/VF) Approach for Inter-VM Communication
602 --------------------------------------------------
603
604 Inter-VM data communication is one of the traffic bottle necks in virtualization platforms.
605 SR-IOV device assignment helps a VM to attach the real device, taking advantage of the bridge in the NIC.
606 So VF-to-VF traffic within the same physical port (VM0<->VM1) have hardware acceleration.
607 However, when VF crosses physical ports (VM0<->VM2), there is no such hardware bridge.
608 In this case, the DPDK PMD PF driver provides host forwarding between such VMs.
609
610 :numref:`figure_inter_vm_comms` shows an example.
611 In this case an update of the MAC address lookup tables in both the NIC and host DPDK application is required.
612
613 In the NIC, writing the destination of a MAC address belongs to another cross device VM to the PF specific pool.
614 So when a packet comes in, its destination MAC address will match and forward to the host DPDK PMD application.
615
616 In the host DPDK application, the behavior is similar to L2 forwarding,
617 that is, the packet is forwarded to the correct PF pool.
618 The SR-IOV NIC switch forwards the packet to a specific VM according to the MAC destination address
619 which belongs to the destination VF on the VM.
620
621 .. _figure_inter_vm_comms:
622
623 .. figure:: img/inter_vm_comms.*
624
625    Inter-VM Communication