On Tue, Jun 14, 2016 at 07:53:17PM -0400, Zhihong Wang wrote:
> This patch explains all the versions of current virtio pmd implementation,
> what's the difference, and how to choose the right version.
>
> --------------
> Changes in v2:
>
> 1. Changes on format and few descriptions.
Change log should go ...
>
>
> Signed-off-by: Zhihong Wang <zhihong.wang at intel.com>
> ---
here..
> doc/guides/nics/virtio.rst | 64
> +++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 58 insertions(+), 6 deletions(-)
>
> diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst
> index 06ca433..a4fef89 100644
> --- a/doc/guides/nics/virtio.rst
> +++ b/doc/guides/nics/virtio.rst
> @@ -73,7 +73,7 @@ In this release, the virtio PMD driver provides the basic
> functionality of packe
>
> * It supports multicast packets and promiscuous mode.
>
> -* The descriptor number for the RX/TX queue is hard-coded to be 256 by
> qemu.
> +* The descriptor number for the Rx/Tx queue is hard-coded to be 256 by
> qemu.
> If given a different descriptor number by the upper application,
> the virtio PMD generates a warning and fall back to the hard-coded value.
>
> @@ -163,8 +163,8 @@ Host2VM communication example
> which means received packets come from vEth0, and transmitted packets is
> sent to vEth0.
>
> #. In the guest, bind the virtio device to the uio_pci_generic kernel
> module and start the forwarding application.
> - When the virtio port in guest bursts rx, it is getting packets from the
> raw socket's receive queue.
> - When the virtio port bursts tx, it is sending packet to the tx_q.
> + When the virtio port in guest bursts Rx, it is getting packets from the
> raw socket's receive queue.
> + When the virtio port bursts Tx, it is sending packet to the tx_q.
>
> .. code-block:: console
>
> @@ -183,7 +183,7 @@ Host2VM communication example
>
> The packet reception and transmission flow path is:
>
> - IXIA packet generator->82599 PF->KNI rx queue->KNI raw socket
> queue->Guest VM virtio port 0 rx burst->Guest VM virtio port 0 tx burst-> KNI
> tx queue->82599 PF-> IXIA packet generator
> + IXIA packet generator->82599 PF->KNI Rx queue->KNI raw socket
> queue->Guest VM virtio port 0 Rx burst->Guest VM virtio port 0 Tx burst-> KNI
> Tx queue->82599 PF-> IXIA packet generator
>
> Virtio with qemu virtio Back End
> --------------------------------
> @@ -206,8 +206,60 @@ Virtio with qemu virtio Back End
>
> In this example, the packet reception flow path is:
>
> - IXIA packet generator->82599 PF->Linux Bridge->TAP0's socket queue->
> Guest VM virtio port 0 rx burst-> Guest VM 82599 VF port1 tx burst-> IXIA
> packet generator
> + IXIA packet generator->82599 PF->Linux Bridge->TAP0's socket queue->
> Guest VM virtio port 0 Rx burst-> Guest VM 82599 VF port1 Tx burst-> IXIA
> packet generator
>
> The packet transmission flow is:
>
> - IXIA packet generator-> Guest VM 82599 VF port1 rx burst-> Guest VM
> virtio port 0 tx burst-> tap -> Linux Bridge->82599 PF-> IXIA packet generator
> + IXIA packet generator-> Guest VM 82599 VF port1 Rx burst-> Guest VM
> virtio port 0 Tx burst-> tap -> Linux Bridge->82599 PF-> IXIA packet generator
> +
> +
> +Virtio PMD Versions
> +-------------------
Using "versions" here is a bit confusing to me, especially virtio PMD
supports spec version 0.95 and 1.0. Apparently, that's not what you
are talking about, virtio pmd Rx/Tx callbacks is.
So, something like "Virtio PMD Rx/Tx callbacks" is what I would suggest.
> +
> +Virtio driver has 3 versions of Rx functions and 2 versions of Tx functions.
And I will avoid using "versions".
> +
> +Rx functions:
> +
> +#. ``virtio_recv_pkts``:
> + Regular version without mergeable Rx buffer support.
> +
> +#. ``virtio_recv_mergeable_pkts``:
> + Regular version with mergeable Rx buffer support.
> +
> +#. ``virtio_recv_pkts_vec``:
> + Simple version without mergeable Rx buffer support, also fixes the
> available ring indexes and uses vector instructions to optimize performance.
Just like coding and writing commit log, don't write long lines over 80
chars here.
Also I will use "vector" instead of "simple" here, as "vector" is more
easier to understand.
> +
> +Tx functions:
> +
> +#. ``virtio_xmit_pkts``:
> + Regular version.
> +
> +#. ``virtio_xmit_pkts_simple``:
> + Simple version fixes the available ring indexes to optimize performance.
> +
> +
> +By default, the non-vector versions are used:
> +
> +* For Rx: If mergeable Rx buffers is disabled then ``virtio_recv_pkts`` is
> used; otherwise ``virtio_recv_mergeable_pkts``.
> +
> +* For Tx: ``virtio_xmit_pkts``.
> +
> +
> +Setting ``txq_flags`` to ``VIRTIO_SIMPLE_FLAGS`` (0xF01) enables the simple
> version of the virtio poll mode driver:
> +
> +* For Rx: ``virtio_recv_pkts_vec``.
> +
> +* For Tx: ``virtio_xmit_pkts_simple``.
> +
This paragraph says that vector Rx/Tx will be enabled when 0xf01 txq
flags is set.
> +
> +The simple version will only be enabled when:
> +
> +* Mergeable Rx buffers is disabled.
> +
> +* Single segment is specified.
> +
> +* No offload support is needed.
However, you are making another statement that vector Rx/Tx will be used
when ....
That's confusing.
I'd combine the two together, to something like below:
Vector Rx/Tx callbacks will be used when:
* ``txq_flags`` is set to 0xf01, which implies
* No multiple segments
* No offload support
* Mergeable Rx buffers is disabled.
--yliu
> +
> +Example of using the simple version of the virtio poll mode driver in
> ``testpmd``::
> +
> + testpmd -c 0x7 -n 4 -- -i --txqflags=0xF01 --rxq=1 --txq=1 --nb-cores=1
> --
> 2.5.0