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