[dpdk-dev,5/9] net/virtio: fix mbuf port for simple Rx function

Message ID 20170831134015.1383-6-olivier.matz@6wind.com (mailing list archive)
State Superseded, archived
Delegated to: Yuanhan Liu
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Olivier Matz Aug. 31, 2017, 1:40 p.m. UTC
  The mbuf->port was was not properly set for the first received
mbufs. Fix this by setting it in virtqueue_enqueue_recv_refill_simple(),
which is used to enqueue the first mbuf in the ring.

The function virtio_rxq_rearm_vec(), which is used to rearm the ring
with new mbufs, is correct and does not need to be updated.

Fixes: cab0461234e7 ("virtio: fill Rx avail ring with blank mbufs")
Cc: stable@dpdk.org

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
 drivers/net/virtio/virtio_rxtx_simple.c | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Olivier Matz Aug. 31, 2017, 1:48 p.m. UTC | #1
Validation:

Platform description
--------------------

guest (dpdk)
+----------------+
|                |
|                |
|    port0       |
+----------------+
       |
       | virtio
       |
+----------------+
|     tap0       |
|                |
|                |
+----------------+
host (linux, vhost-net)

Host configuration
------------------

Start qemu with:

- a ne2k management interface to avoi any conflict with dpdk
- a virtio net device, connected to a tap interface through vhost-net
- mergeable buffers disabled

  /usr/bin/qemu-system-x86_64 -k fr -daemonize --enable-kvm -m 2G -cpu host \
    -smp 3 -serial telnet::40564,server,nowait -serial null \
    -qmp tcp::44340,server,nowait -monitor telnet::49229,server,nowait \
    -device ne2k_pci,mac=de:ad:de:01:02:03,netdev=user.0,addr=03 \
    -netdev user,id=user.0,hostfwd=tcp::34965-:22 \
    -netdev type=tap,id=vhostnet0,script=no,vhost=on,queues=8 \
    -device virtio-net-pci,mrg_rxbuf=off,netdev=vhostnet0,mq=on,vectors=17 \
    -hda "${VM_PATH}/ubuntu-16.04-template.qcow2" \
    -snapshot -vga none -display none

Guest configuration
-------------------

Apply a simple patch to display m->port in test-pmd/rxonly.c.

  --- a/app/test-pmd/rxonly.c
  +++ b/app/test-pmd/rxonly.c
  @@ -139,9 +139,9 @@ pkt_burst_receive(struct fwd_stream *fs)
  
                  print_ether_addr("  src=", &eth_hdr->s_addr);
                  print_ether_addr(" - dst=", &eth_hdr->d_addr);
  -               printf(" - type=0x%04x - length=%u - nb_segs=%d",
  +               printf(" - type=0x%04x - length=%u - nb_segs=%d - port=%d",
                         eth_type, (unsigned) mb->pkt_len,
  -                      (int)mb->nb_segs);
  +                      (int)mb->nb_segs, mb->port);
                  if (ol_flags & PKT_RX_RSS_HASH) {
                          printf(" - RSS hash=0x%x", (unsigned) mb->hash.rss);
                          printf(" - RSS queue=0x%x",(unsigned) fs->rx_queue);

Compile dpdk:

  cd dpdk.org
  make config T=x86_64-native-linuxapp-gcc
  sed -i 's,CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_INIT=n,CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_INIT=y,' build/.config
  sed -i 's,CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DRIVER=n,CONFIG_RTE_LIBRTE_VIRTIO_DEBUG_DRIVER=y,' build/.config
  make -j4

Prepare environment:

  mkdir -p /mnt/huge
  mount -t hugetlbfs nodev /mnt/huge
  echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
  modprobe uio_pci_generic
  python usertools/dpdk-devbind.py -b uio_pci_generic 0000:00:02.0

  ./build/app/testpmd -l 0,1 --log-level 7 -- --total-num-mbufs=16384 \
    -i --port-topology=chained --disable-hw-vlan-filter \
    --disable-hw-vlan-strip --txqflags=0xf01

  ...
  PMD: virtio_update_rxtx_handler(): Using simple rx/tx path
  ...

Configure testpmd:

  set fwd rxonly
  set verbose 1
  start

The first 128 received packets have **a wrong m->port**):

  src=00:00:00:00:00:00 - dst=FF:FF:FF:FF:FF:FF - type=0x0800 - length=42 - nb_segs=1 - port=255 - sw ptype: L2_ETHER L3_IPV4  - l2_len=14 - l3_len=20 - Receive queue=0x0
  ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN

After 128 packets, it's ok:

  src=00:00:00:00:00:00 - dst=FF:FF:FF:FF:FF:FF - type=0x0800 - length=42 - nb_segs=1 - port=0 - sw ptype: L2_ETHER L3_IPV4  - l2_len=14 - l3_len=20 - Receive queue=0x0
  ol_flags: PKT_RX_L4_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN

This is not reproduced with --txqflags=0 (standard Rx path), or with
the fix applied.
  

Patch

diff --git a/drivers/net/virtio/virtio_rxtx_simple.c b/drivers/net/virtio/virtio_rxtx_simple.c
index 542cf805d..54ababae9 100644
--- a/drivers/net/virtio/virtio_rxtx_simple.c
+++ b/drivers/net/virtio/virtio_rxtx_simple.c
@@ -65,6 +65,8 @@  virtqueue_enqueue_recv_refill_simple(struct virtqueue *vq,
 	struct vring_desc *start_dp;
 	uint16_t desc_idx;
 
+	cookie->port = vq->rxq.port_id;
+
 	desc_idx = vq->vq_avail_idx & (vq->vq_nentries - 1);
 	dxp = &vq->vq_descx[desc_idx];
 	dxp->cookie = (void *)cookie;