xref: /dpdk/doc/guides/nics/netvsc.rst (revision b583b9a1bb49e86aa0937d55415713282000c536)
1beff6d8eSStephen Hemminger..  SPDX-License-Identifier: BSD-3-Clause
2beff6d8eSStephen Hemminger    Copyright(c) Microsoft Corporation.
3beff6d8eSStephen Hemminger
4beff6d8eSStephen HemmingerNetvsc poll mode driver
5beff6d8eSStephen Hemminger=======================
6beff6d8eSStephen Hemminger
7beff6d8eSStephen HemmingerThe Netvsc Poll Mode driver (PMD) provides support for the paravirtualized
8beff6d8eSStephen Hemmingernetwork device for Microsoft Hyper-V. It can be used with
94b048f35SStephen HemmingerWindow Server 2008/2012/2016, Windows 10.
10beff6d8eSStephen HemmingerThe device offers multi-queue support (if kernel and host support it),
11beff6d8eSStephen Hemmingerchecksum and segmentation offloads.
12beff6d8eSStephen Hemminger
13beff6d8eSStephen Hemminger
14beff6d8eSStephen HemmingerFeatures and Limitations of Hyper-V PMD
15beff6d8eSStephen Hemminger---------------------------------------
16beff6d8eSStephen Hemminger
17f8dbaebbSSean MorrisseyIn this release, the hyper PMD provides the basic functionality of packet reception and transmission.
18beff6d8eSStephen Hemminger
19beff6d8eSStephen Hemminger*   It supports merge-able buffers per packet when receiving packets and scattered buffer per packet
20beff6d8eSStephen Hemminger    when transmitting packets. The packet size supported is from 64 to 65536.
21beff6d8eSStephen Hemminger
22beff6d8eSStephen Hemminger*   The PMD supports multicast packets and promiscuous mode subject to restrictions on the host.
23beff6d8eSStephen Hemminger    In order to this to work, the guest network configuration on Hyper-V must be configured to allow MAC address
244b048f35SStephen Hemminger    spoofing.
25beff6d8eSStephen Hemminger
26beff6d8eSStephen Hemminger*   The device has only a single MAC address.
27beff6d8eSStephen Hemminger    Hyper-V driver does not support MAC or VLAN filtering because the Hyper-V host does not support it.
28beff6d8eSStephen Hemminger
29beff6d8eSStephen Hemminger*   VLAN tags are always stripped and presented in mbuf tci field.
30beff6d8eSStephen Hemminger
31f6ddcf80SStephen Hemminger*   The Hyper-V driver does not use or support interrupts. Link state change
32f6ddcf80SStephen Hemminger    callback is done via change events in the packet ring.
33beff6d8eSStephen Hemminger
34beff6d8eSStephen Hemminger*   The maximum number of queues is limited by the host (currently 64).
35beff6d8eSStephen Hemminger    When used with 4.16 kernel only a single queue is available.
36beff6d8eSStephen Hemminger
37dc7680e8SStephen Hemminger*   This driver supports SR-IOV network acceleration.
38dc7680e8SStephen Hemminger    If SR-IOV is enabled then the driver will transparently manage the interface,
39dc7680e8SStephen Hemminger    and send and receive packets using the VF path.
40dc7680e8SStephen Hemminger    The VDEV_NETVSC and FAILSAFE drivers are *not* used when using netvsc PMD.
41beff6d8eSStephen Hemminger
42beff6d8eSStephen HemmingerInstallation
43beff6d8eSStephen Hemminger------------
44beff6d8eSStephen Hemminger
45beff6d8eSStephen HemmingerThe Netvsc PMD is a standalone driver, similar to virtio and vmxnet3.
46beff6d8eSStephen HemmingerUsing Netvsc PMD requires that the associated VMBUS device be bound to the userspace
47beff6d8eSStephen HemmingerI/O device driver for Hyper-V (uio_hv_generic). By default, all netvsc devices
48beff6d8eSStephen Hemmingerwill be bound to the Linux kernel driver; in order to use netvsc PMD the
49beff6d8eSStephen Hemmingerdevice must first be overridden.
50beff6d8eSStephen Hemminger
51beff6d8eSStephen HemmingerThe first step is to identify the network device to override.
52beff6d8eSStephen HemmingerVMBUS uses Universal Unique Identifiers
53beff6d8eSStephen Hemminger(`UUID`_) to identify devices on the bus similar to how PCI uses Domain:Bus:Function.
54beff6d8eSStephen HemmingerThe UUID associated with a Linux kernel network device can be determined
55beff6d8eSStephen Hemmingerby looking at the sysfs information. To find the UUID for eth1 and
56beff6d8eSStephen Hemmingerstore it in a shell variable:
57beff6d8eSStephen Hemminger
58beff6d8eSStephen Hemminger    .. code-block:: console
59beff6d8eSStephen Hemminger
60beff6d8eSStephen Hemminger	DEV_UUID=$(basename $(readlink /sys/class/net/eth1/device))
61beff6d8eSStephen Hemminger
62beff6d8eSStephen Hemminger
63beff6d8eSStephen Hemminger.. _`UUID`: https://en.wikipedia.org/wiki/Universally_unique_identifier
64beff6d8eSStephen Hemminger
65b7fe612aSThomas MonjalonThere are several possible ways to assign the UIO device driver for a device.
66beff6d8eSStephen HemmingerThe easiest way (but only on 4.18 or later)
67beff6d8eSStephen Hemmingeris to use the `driverctl Device Driver control utility`_ to override
68beff6d8eSStephen Hemmingerthe normal kernel device.
69beff6d8eSStephen Hemminger
70beff6d8eSStephen Hemminger    .. code-block:: console
71beff6d8eSStephen Hemminger
72beff6d8eSStephen Hemminger	driverctl -b vmbus set-override $DEV_UUID uio_hv_generic
73beff6d8eSStephen Hemminger
74beff6d8eSStephen Hemminger.. _`driverctl Device Driver control utility`: https://gitlab.com/driverctl/driverctl
75beff6d8eSStephen Hemminger
76beff6d8eSStephen HemmingerAny settings done with driverctl are by default persistent and will be reapplied
77beff6d8eSStephen Hemmingeron reboot.
78beff6d8eSStephen Hemminger
79beff6d8eSStephen HemmingerOn older kernels, the same effect can be had by manual sysfs bind and unbind
80beff6d8eSStephen Hemmingeroperations:
81beff6d8eSStephen Hemminger
82beff6d8eSStephen Hemminger    .. code-block:: console
83beff6d8eSStephen Hemminger
84beff6d8eSStephen Hemminger	NET_UUID="f8615163-df3e-46c5-913f-f2d2f965ed0e"
85beff6d8eSStephen Hemminger	modprobe uio_hv_generic
86beff6d8eSStephen Hemminger	echo $NET_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/new_id
87beff6d8eSStephen Hemminger	echo $DEV_UUID > /sys/bus/vmbus/drivers/hv_netvsc/unbind
88beff6d8eSStephen Hemminger	echo $DEV_UUID > /sys/bus/vmbus/drivers/uio_hv_generic/bind
89beff6d8eSStephen Hemminger
90beff6d8eSStephen Hemminger.. Note::
91beff6d8eSStephen Hemminger
92d629b7b5SJohn McNamara   The dpdk-devbind.py script can not be used since it only handles PCI devices.
93beff6d8eSStephen Hemminger
94beff6d8eSStephen Hemminger
95beff6d8eSStephen HemmingerPrerequisites
96beff6d8eSStephen Hemminger-------------
97beff6d8eSStephen Hemminger
98beff6d8eSStephen HemmingerThe following prerequisites apply:
99beff6d8eSStephen Hemminger
100beff6d8eSStephen Hemminger*   Linux kernel support for UIO on vmbus is done with the uio_hv_generic driver.
101beff6d8eSStephen Hemminger    Full support of multiple queues requires the 4.17 kernel. It is possible
102beff6d8eSStephen Hemminger    to use the netvsc PMD with 4.16 kernel but it is limited to a single queue.
103a25d39a3SStephen Hemminger
104a25d39a3SStephen Hemminger
105*b583b9a1SFerruh YigitRuntime Configuration
106*b583b9a1SFerruh Yigit---------------------
107a25d39a3SStephen Hemminger
108a25d39a3SStephen HemmingerThe user can specify below argument in devargs.
109a25d39a3SStephen Hemminger
110a25d39a3SStephen Hemminger#.  ``latency``:
111a25d39a3SStephen Hemminger
112a25d39a3SStephen Hemminger    A netvsc device uses a mailbox page to indicate to the host that there
113a25d39a3SStephen Hemminger    is something in the transmit queue. The host scans this page at a
114a25d39a3SStephen Hemminger    periodic interval. This parameter allows adjusting the value that
115a25d39a3SStephen Hemminger    is used by the host. Smaller values improve transmit latency, and larger
116a25d39a3SStephen Hemminger    values save CPU cycles. This parameter is in microseconds.
117a25d39a3SStephen Hemminger    If the value is too large or too small it will be
118a25d39a3SStephen Hemminger    ignored by the host. (Default: 50)
11974a5a666SStephen Hemminger
12074a5a666SStephen Hemminger#.  ``rx_copybreak``:
12174a5a666SStephen Hemminger
12274a5a666SStephen Hemminger    The rx_copybreak sets the threshold where the driver uses an external
12374a5a666SStephen Hemminger    mbuf to avoid having to copy data. Setting 0 for copybreak will cause
12474a5a666SStephen Hemminger    driver to always create an external mbuf. Setting a value greater than
12574a5a666SStephen Hemminger    the MTU would prevent it from ever making an external mbuf and always
12674a5a666SStephen Hemminger    copy. The default value is 256 (bytes).
12774a5a666SStephen Hemminger
12874a5a666SStephen Hemminger#.  ``tx_copybreak``:
12974a5a666SStephen Hemminger
13074a5a666SStephen Hemminger    The tx_copybreak sets the threshold where the driver aggregates
13174a5a666SStephen Hemminger    multiple small packets into one request. If tx_copybreak is 0 then
13274a5a666SStephen Hemminger    each packet goes as a VMBus request (no copying). If tx_copybreak is
13374a5a666SStephen Hemminger    set larger than the MTU, then all packets smaller than the chunk size
13474a5a666SStephen Hemminger    of the VMBus send buffer will be copied; larger packets always have to
13574a5a666SStephen Hemminger    go as a single direct request. The default value is 512 (bytes).
136096b31fcSLong Li
137096b31fcSLong Li#.  ``rx_extmbuf_enable``:
138096b31fcSLong Li    The rx_extmbuf_enable is used to control if netvsc should use external
139096b31fcSLong Li    mbuf for receiving packets. The default value is 0. (netvsc doesn't use
140096b31fcSLong Li    external mbuf, it always allocates mbuf and copy received data to mbuf)
141096b31fcSLong Li    A non-zero value tells netvsc to attach external buffers to mbuf on
142096b31fcSLong Li    receiving packets, thus avoid copying memory. Use of external buffers
143096b31fcSLong Li    requires the application is able to read data from external mbuf.
144