[dpdk-dev] [PATCH 5/9] net/virtio: fix mbuf port for simple Rx function
Olivier MATZ
olivier.matz at 6wind.com
Thu Aug 31 15:48:36 CEST 2017
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=", ð_hdr->s_addr);
print_ether_addr(" - dst=", ð_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.
More information about the dev
mailing list