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