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