diff options
Diffstat (limited to 'doc/guides/prog_guide/kernel_nic_interface.rst')
-rw-r--r-- | doc/guides/prog_guide/kernel_nic_interface.rst | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/doc/guides/prog_guide/kernel_nic_interface.rst b/doc/guides/prog_guide/kernel_nic_interface.rst index eb16e2e3..6f7fd287 100644 --- a/doc/guides/prog_guide/kernel_nic_interface.rst +++ b/doc/guides/prog_guide/kernel_nic_interface.rst @@ -168,114 +168,3 @@ The application handlers can be registered upon interface creation or explicitly This provides flexibility in multiprocess scenarios (where the KNI is created in the primary process but the callbacks are handled in the secondary one). The constraint is that a single process can register and handle the requests. - -KNI Working as a Kernel vHost Backend -------------------------------------- - -vHost is a kernel module usually working as the backend of virtio (a para- virtualization driver framework) -to accelerate the traffic from the guest to the host. -The DPDK Kernel NIC interface provides the ability to hookup vHost traffic into userspace DPDK application. -Together with the DPDK PMD virtio, it significantly improves the throughput between guest and host. -In the scenario where DPDK is running as fast path in the host, kni-vhost is an efficient path for the traffic. - -Overview -~~~~~~~~ - -vHost-net has three kinds of real backend implementations. They are: 1) tap, 2) macvtap and 3) RAW socket. -The main idea behind kni-vhost is making the KNI work as a RAW socket, attaching it as the backend instance of vHost-net. -It is using the existing interface with vHost-net, so it does not require any kernel hacking, -and is fully-compatible with the kernel vhost module. -As vHost is still taking responsibility for communicating with the front-end virtio, -it naturally supports both legacy virtio -net and the DPDK PMD virtio. -There is a little penalty that comes from the non-polling mode of vhost. -However, it scales throughput well when using KNI in multi-thread mode. - -.. _figure_vhost_net_arch2: - -.. figure:: img/vhost_net_arch.* - - vHost-net Architecture Overview - - -Packet Flow -~~~~~~~~~~~ - -There is only a minor difference from the original KNI traffic flows. -On transmit side, vhost kthread calls the RAW socket's ops sendmsg and it puts the packets into the KNI transmit FIFO. -On the receive side, the kni kthread gets packets from the KNI receive FIFO, puts them into the queue of the raw socket, -and wakes up the task in vhost kthread to begin receiving. -All the packet copying, irrespective of whether it is on the transmit or receive side, -happens in the context of vhost kthread. -Every vhost-net device is exposed to a front end virtio device in the guest. - -.. _figure_kni_traffic_flow: - -.. figure:: img/kni_traffic_flow.* - - KNI Traffic Flow - - -Sample Usage -~~~~~~~~~~~~ - -Before starting to use KNI as the backend of vhost, the CONFIG_RTE_KNI_VHOST configuration option must be turned on. -Otherwise, by default, KNI will not enable its backend support capability. - -Of course, as a prerequisite, the vhost/vhost-net kernel CONFIG should be chosen before compiling the kernel. - -#. Compile the DPDK and insert uio_pci_generic/igb_uio kernel modules as normal. - -#. Insert the KNI kernel module: - - .. code-block:: console - - insmod ./rte_kni.ko - - If using KNI in multi-thread mode, use the following command line: - - .. code-block:: console - - insmod ./rte_kni.ko kthread_mode=multiple - -#. Running the KNI sample application: - - .. code-block:: console - - examples/kni/build/app/kni -c -0xf0 -n 4 -- -p 0x3 -P --config="(0,4,6),(1,5,7)" - - This command runs the kni sample application with two physical ports. - Each port pins two forwarding cores (ingress/egress) in user space. - -#. Assign a raw socket to vhost-net during qemu-kvm startup. - The DPDK does not provide a script to do this since it is easy for the user to customize. - The following shows the key steps to launch qemu-kvm with kni-vhost: - - .. code-block:: bash - - #!/bin/bash - echo 1 > /sys/class/net/vEth0/sock_en - fd=`cat /sys/class/net/vEth0/sock_fd` - qemu-kvm \ - -name vm1 -cpu host -m 2048 -smp 1 -hda /opt/vm-fc16.img \ - -netdev tap,fd=$fd,id=hostnet1,vhost=on \ - -device virti-net-pci,netdev=hostnet1,id=net1,bus=pci.0,addr=0x4 - -It is simple to enable raw socket using sysfs sock_en and get raw socket fd using sock_fd under the KNI device node. - -Then, using the qemu-kvm command with the -netdev option to assign such raw socket fd as vhost's backend. - -.. note:: - - The key word tap must exist as qemu-kvm now only supports vhost with a tap backend, so here we cheat qemu-kvm by an existing fd. - -Compatibility Configure Option -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There is a CONFIG_RTE_KNI_VHOST_VNET_HDR_EN configuration option in DPDK configuration file. -By default, it set to n, which means do not turn on the virtio net header, -which is used to support additional features (such as, csum offload, vlan offload, generic-segmentation and so on), -since the kni-vhost does not yet support those features. - -Even if the option is turned on, kni-vhost will ignore the information that the header contains. -When working with legacy virtio on the guest, it is better to turn off unsupported offload features using ethtool -K. -Otherwise, there may be problems such as an incorrect L4 checksum error. |