From: Bruce Richardson <bruce.richardson@intel.com>
To: dev@dpdk.org
Cc: Maxime Coquelin <maxime.coquelin@redhat.com>,
Chenbo Xia <chenbo.xia@intel.com>,
Bruce Richardson <bruce.richardson@intel.com>,
stable@dpdk.org
Subject: [PATCH v3 1/4] doc/howto: rework section on virtio-user as exception path
Date: Fri, 10 Jun 2022 16:35:32 +0100 [thread overview]
Message-ID: <20220610153535.659076-2-bruce.richardson@intel.com> (raw)
In-Reply-To: <20220610153535.659076-1-bruce.richardson@intel.com>
This patch extensively reworks the howto guide on using virtio-user for
exception packets. Changes include:
* rename "exceptional path" to "exception path"
* remove references to uio and just reference vfio-pci
* simplify testpmd command-lines, giving a basic usage example first
before adding on detail about checksum or TSO parameters
* give a complete working example showing traffic flowing through the
whole system from a testpmd loopback using the created TAP netdev
* replace use of "ifconfig" with Linux standard "ip" command
* other general rewording.
CC: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
V3:
* fix error reported by Chenbo on review.
* add stable on CC, since this rework could be applicable for older
releases too, if desired for backport.
---
.../howto/virtio_user_as_exceptional_path.rst | 159 +++++++++++-------
1 file changed, 100 insertions(+), 59 deletions(-)
diff --git a/doc/guides/howto/virtio_user_as_exceptional_path.rst b/doc/guides/howto/virtio_user_as_exceptional_path.rst
index ec021af399..3d3d1b1219 100644
--- a/doc/guides/howto/virtio_user_as_exceptional_path.rst
+++ b/doc/guides/howto/virtio_user_as_exceptional_path.rst
@@ -3,116 +3,157 @@
.. _virtio_user_as_exceptional_path:
-Virtio_user as Exceptional Path
-===============================
+Virtio_user as Exception Path
+=============================
-The virtual device, virtio-user, was originally introduced with vhost-user
-backend, as a high performance solution for IPC (Inter-Process Communication)
+.. note::
+
+ This solution is only applicable to Linux systems.
+
+The virtual device, virtio-user, was originally introduced with the vhost-user
+backend as a high performance solution for IPC (Inter-Process Communication)
and user space container networking.
-Virtio_user with vhost-kernel backend is a solution for exceptional path,
-such as KNI which exchanges packets with kernel networking stack. This
-solution is very promising in:
+Beyond this originally intended use, virtio-user can be used in conjunction with the vhost-kernel
+backend as a solution for dealing with exception path packets which need to be injected into the
+Linux kernel for processing there.
+In this regard, virtio-user and vhost in kernel space are an alternative to DPDK KNI for
+transferring packets between a DPDK packet processing application and the kernel stack.
+
+This solution has a number of advantages over alternatives such as KNI:
* Maintenance
All kernel modules needed by this solution, vhost and vhost-net (kernel),
- are upstreamed and extensively used kernel module.
+ are upstreamed and extensively used.
* Features
- vhost-net is born to be a networking solution, which has lots of networking
- related features, like multi queue, tso, multi-seg mbuf, etc.
+ vhost-net is designed to be a networking solution, and, as such, has lots of networking
+ related features, such as multi queue support, TSO, multi-segment buffer support, etc.
* Performance
- similar to KNI, this solution would use one or more kthreads to
- send/receive packets to/from user space DPDK applications, which has little
- impact on user space polling thread (except that it might enter into kernel
- space to wake up those kthreads if necessary).
+ similar to KNI, this solution would uses one or more kthreads to
+ send/receive packets to/from user space DPDK applications, which minimises the impact
+ on the polling DPDK threads.
-The overview of an application using virtio-user as exceptional path is shown
+The overview of an application using virtio-user as exception path is shown
in :numref:`figure_virtio_user_as_exceptional_path`.
.. _figure_virtio_user_as_exceptional_path:
.. figure:: img/virtio_user_as_exceptional_path.*
- Overview of a DPDK app using virtio-user as exceptional path
+ Overview of a DPDK app using virtio-user as exception path
+
+Example Usage With Testpmd
+---------------------------
-Sample Usage
-------------
+.. note::
+
+ These instruction assume that the vhost/vhost-net kernel modules are available and have already
+ been loaded into the running kernel.
+ It also assumes that the DPDK virtio driver has not been disabled in the DPDK build.
-As a prerequisite, the vhost/vhost-net kernel CONFIG should be chosen before
-compiling the kernel and those kernel modules should be inserted.
+To run a simple test of virtio-user as exception path using testpmd:
-#. Compile DPDK and bind a physical NIC to igb_uio/uio_pci_generic/vfio-pci.
+#. Compile DPDK and bind a NIC to vfio-pci as documented in :ref:`linux_gsg_linux_drivers`.
- This physical NIC is for communicating with outside.
+ This physical NIC is for communicating with the outside world,
+ and serves as a packet source in this example.
-#. Run testpmd.
+#. Run testpmd to forward packets from NIC to kernel,
+ passing in a suitable list of logical cores to run on (``-l`` parameter),
+ and optionally the PCI address of the physical NIC to use (``-a`` parameter).
+ The virtio-user device for interfacing to the kernel is specified via a ``-vdev`` argument,
+ taking the parameters described below.
.. code-block:: console
- $(testpmd) -l 2-3 -n 4 \
- --vdev=virtio_user0,path=/dev/vhost-net,queue_size=1024 \
- -- -i --tx-offloads=0x0000002c --enable-lro \
- --txd=1024 --rxd=1024
+ /path/to/dpdk-testpmd -l <cores> -a <pci BDF> \
+ --vdev=virtio_user0,path=/dev/vhost-net,queues=1,queue_size=1024
- This command runs testpmd with two ports, one physical NIC to communicate
- with outside, and one virtio-user to communicate with kernel.
+ * ``path``
-* ``--enable-lro``
+ The path to the kernel vhost-net device.
- This is used to negotiate VIRTIO_NET_F_GUEST_TSO4 and
- VIRTIO_NET_F_GUEST_TSO6 feature so that large packets from kernel can be
- transmitted to DPDK application and further TSOed by physical NIC.
+ * ``queue_size``
-* ``queue_size``
+ 256 by default. To avoid shortage of descriptors, we can increase it to 1024.
- 256 by default. To avoid shortage of descriptors, we can increase it to 1024.
+ * ``queues``
-* ``queues``
+ Number of virt-queues. Each queue will be served by a kthread.
- Number of multi-queues. Each queue will be served by a kthread. For example:
+#. Once testpmd is running, a new network interface - called ``tap0`` by default -
+ will be present on the system.
+ This should be configured with an IP address and then enabled for use:
.. code-block:: console
- $(testpmd) -l 2-3 -n 4 \
- --vdev=virtio_user0,path=/dev/vhost-net,queues=2,queue_size=1024 \
- -- -i --tx-offloads=0x0000002c --enable-lro \
- --txq=2 --rxq=2 --txd=1024 --rxd=1024
+ ip addr add 192.168.1.1/24 dev tap0
+ ip link set dev tap0 up
-#. Enable Rx checksum offloads in testpmd:
+#. To observe packet forwarding through the kernel,
+ a second testpmd instance can be run on the system,
+ taking packets from the kernel using an ``af_packet`` socket on the ``tap0`` interface.
- .. code-block:: console
+ .. code-block:: console
- (testpmd) port stop 0
- (testpmd) port config 0 rx_offload tcp_cksum on
- (testpmd) port config 0 rx_offload udp_cksum on
- (testpmd) port start 0
+ /path/to/dpdk-testpmd -l <cores> --vdev=net_af_packet0,iface=tap0 --in-memory --no-pci
-#. Start testpmd:
+ When running this instance,
+ we can use ``--in-memory`` flag to avoid hugepage naming conflicts with the previous instance,
+ and we also use ``--no-pci`` flag to only use the ``af_packet`` interface for all traffic forwarding.
- .. code-block:: console
+#. Running traffic into the system through the NIC should see that traffic returned back again,
+ having been forwarded through both testpmd instances.
+ This can be confirmed by checking the testpmd statistics on testpmd exit.
- (testpmd) start
+For more advanced use of virtio-user with testpmd in this scenario,
+some other more advanced options may also be used.
+For example:
-#. Configure IP address and start tap:
+* ``--tx-offloads=0x02c``
+
+ This testpmd option enables TX offloads for UDP and TCP checksum on transmit,
+ as well as TCP TSO support.
+ The list of the offload flag values can be seen in header `rte_ethdev.h
+ <https://doc.dpdk.org/api/rte__ethdev_8h.html>`_.
+
+* ``--enable-lro``
+
+ This testpmd option is used to negotiate VIRTIO_NET_F_GUEST_TSO4 and
+ VIRTIO_NET_F_GUEST_TSO6 feature so that large packets from the kernel can be
+ transmitted to the DPDK application and further TSOed by physical NIC.
+ If unsupported by the physical NIC, errors may be reported by testpmd with this option.
+
+
+* Enabling Rx checksum offloads for physical port:
+
+ Within testpmd, you can enable and disable offloads on a per-port basis,
+ rather than enabling them for both ports.
+ For the physical NIC, it may be desirable to enable checksum offload on packet RX.
+ This may be done as below, if testpmd is run with ``-i`` flag for interactive mode.
.. code-block:: console
- ifconfig tap0 1.1.1.1/24 up
+ testpmd> port stop 0
+ testpmd> port config 0 rx_offload tcp_cksum on
+ testpmd> port config 0 rx_offload udp_cksum on
+ testpmd> port start 0
-.. note::
+* Multiple queue support
- The tap device will be named tap0, tap1, etc, by kernel.
+ Better performance may be achieved by using multiple queues,
+ so that multiple kernel threads are handling the traffic on the kernel side.
+ For example, to use 2 queues on both NIC and virtio ports,
+ while also enabling TX offloads and LRO support:
-Then, all traffic from physical NIC can be forwarded into kernel stack, and all
-traffic on the tap0 can be sent out from physical NIC.
+ .. code-block:: console
-Limitations
------------
+ /path/to/dpdk-testpmd --vdev=virtio_user0,path=/dev/vhost-net,queues=2,queue_size=1024 -- \
+ -i --tx-offloads=0x002c --enable-lro --txq=2 --rxq=2 --txd=1024 --rxd=1024
-This solution is only available on Linux systems.
--
2.34.1
next prev parent reply other threads:[~2022-06-10 15:35 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-27 16:26 [PATCH 1/2] doc/howto: rework section on virtio-user as exception path Bruce Richardson
2022-05-27 16:26 ` [PATCH 2/2] doc/howto: add code example to virtio-user exception path doc Bruce Richardson
2022-05-27 16:36 ` [PATCH v2 1/2] doc/howto: rework section on virtio-user as exception path Bruce Richardson
2022-05-27 16:36 ` [PATCH v2 2/2] doc/howto: add code example to virtio-user exception path doc Bruce Richardson
2022-05-27 18:03 ` Stephen Hemminger
2022-05-30 5:44 ` Xia, Chenbo
2022-06-10 14:33 ` Bruce Richardson
2022-05-30 5:33 ` [PATCH v2 1/2] doc/howto: rework section on virtio-user as exception path Xia, Chenbo
2022-06-10 14:36 ` Bruce Richardson
2022-06-10 15:35 ` [PATCH v3 0/4] Enhance docs on virtio-user as KNI replacement Bruce Richardson
2022-06-10 15:35 ` Bruce Richardson [this message]
2022-06-15 1:44 ` [PATCH v3 1/4] doc/howto: rework section on virtio-user as exception path Xia, Chenbo
2022-07-01 12:59 ` Maxime Coquelin
2022-07-11 13:10 ` Thomas Monjalon
2022-07-11 13:18 ` Bruce Richardson
2022-06-10 15:35 ` [PATCH v3 2/4] doc/howto: rename files to match new content name Bruce Richardson
2022-06-15 1:45 ` Xia, Chenbo
2022-07-07 15:38 ` Maxime Coquelin
2022-06-10 15:35 ` [PATCH v3 3/4] doc/howto: add code example to virtio-user exception path doc Bruce Richardson
2022-06-15 1:47 ` Xia, Chenbo
2022-07-07 15:50 ` Maxime Coquelin
2022-06-10 15:35 ` [PATCH v3 4/4] doc/prog_guide: add reference to virtio-user from KNI doc Bruce Richardson
2022-06-15 1:47 ` Xia, Chenbo
2022-07-07 15:52 ` Maxime Coquelin
2022-06-10 15:58 ` [PATCH v3 0/4] Enhance docs on virtio-user as KNI replacement Morten Brørup
2022-07-08 9:12 ` Maxime Coquelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220610153535.659076-2-bruce.richardson@intel.com \
--to=bruce.richardson@intel.com \
--cc=chenbo.xia@intel.com \
--cc=dev@dpdk.org \
--cc=maxime.coquelin@redhat.com \
--cc=stable@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.