qemu/hw/net
Thomas Huth 8836630f5d hw/net/spapr_llan: Delay flushing of the RX queue while adding new RX buffers
Currently, the spapr-vlan device is trying to flush the RX queue
after each RX buffer that has been added by the guest via the
H_ADD_LOGICAL_LAN_BUFFER hypercall. In case the receive buffer pool
was empty before, we only pass single packets to the guest this
way. This can cause very bad performance if a sender is trying
to stream fragmented UDP packets to the guest. For example when
using the UDP_STREAM test from netperf with UDP packets that are
much bigger than the MTU size, almost all UDP packets are dropped
in the guest since the chances are quite high that at least one of
the fragments got lost on the way.

When flushing the receive queue, it's much better if we'd have
a bunch of receive buffers available already, so that fragmented
packets can be passed to the guest in one go. To do this, the
spapr_vlan_receive() function should return 0 instead of -1 if there
are no more receive buffers available, so that receive_disabled = 1
gets temporarily set for the receive queue, and we have to delay
the queue flushing at the end of h_add_logical_lan_buffer() a little
bit by using a timer, so that the guest gets a chance to add multiple
RX buffers before we flush the queue again.

This improves the UDP_STREAM test with the spapr-vlan device a lot:
Running
 netserver -p 44444 -L <guestip> -f -D -4
in the guest, and
 netperf -p 44444 -L <hostip> -H <guestip> -t UDP_STREAM -l 60 -- -m 16384
in the host, I get the following values _without_ this patch:

Socket  Message  Elapsed      Messages
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec

229376   16384   60.00     1738970      0    3798.83
229376           60.00          23              0.05

That "0.05" means that almost all UDP packets got lost/discarded
at the receiving side.
With this patch applied, the value look much better:

Socket  Message  Elapsed      Messages
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec

229376   16384   60.00     1789104      0    3908.35
229376           60.00       22818             49.85

Signed-off-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2016-05-27 09:40:22 +10:00
..
fsl_etsec hw: explicitly include qemu/log.h 2016-05-19 16:42:29 +02:00
rocker rocker: allow user to specify rocker world by property 2016-03-08 15:34:18 +08:00
allwinner_emac.c hw: explicitly include qemu/log.h 2016-05-19 16:42:29 +02:00
cadence_gem.c cadence_gem: fix buffer overflow 2016-02-04 13:22:06 +08:00
dp8393x.c Replaced get_tick_per_sec() by NANOSECONDS_PER_SECOND 2016-03-22 22:20:17 +01:00
e1000_regs.h e1000: Trivial implementation of various MAC registers 2015-11-12 15:26:53 +08:00
e1000.c Revert "e1000: fix hang of win2k12 shutdown with flood ping" 2016-03-30 08:57:42 +08:00
eepro100.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
etraxfs_eth.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
imx_fec.c hw: explicitly include qemu/log.h 2016-05-19 16:42:29 +02:00
lan9118.c hw: explicitly include qemu/log.h 2016-05-19 16:42:29 +02:00
lance.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
Makefile.objs i.MX: Add FEC Ethernet Emulator 2015-09-07 10:39:30 +01:00
mcf_fec.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
milkymist-minimac2.c hw: explicitly include qemu-common.h and cpu.h 2016-03-22 22:20:17 +01:00
mipsnet.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
ne2000-isa.c include/qemu/osdep.h: Don't include qapi/error.h 2016-03-22 22:20:15 +01:00
ne2000.c net: ne2000: check ring buffer control registers 2016-03-08 15:34:09 +08:00
ne2000.h ne2000: Drop ne2000_can_receive 2015-09-02 14:51:07 +01:00
opencores_eth.c hw/net/opencores_eth: Allocating Large sized arrays to heap 2016-05-23 22:10:16 +03:00
pcnet-pci.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
pcnet.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
pcnet.h pcnet: Drop pcnet_can_receive 2015-07-27 14:12:18 +01:00
rtl8139.c rtl8139: using CP_TX_OWN for ownership transferring during tx 2016-04-06 09:52:07 +08:00
smc91c111.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
spapr_llan.c hw/net/spapr_llan: Delay flushing of the RX queue while adding new RX buffers 2016-05-27 09:40:22 +10:00
stellaris_enet.c net: stellaris_enet: check packet length against receive buffer 2016-04-11 14:22:33 +01:00
vhost_net.c vhost-user interrupt management fixes 2016-02-18 16:13:56 +02:00
virtio-net.c virtio-net: use the backend cross-endian capabilities 2016-02-16 12:05:17 +02:00
vmware_utils.h fpu: Replace uint8 typedef with uint8_t 2016-01-22 15:09:21 +00:00
vmxnet3.c Fix some typos found by codespell 2016-05-18 15:04:27 +03:00
vmxnet3.h vmxnet3: Add support for VMXNET3_CMD_GET_ADAPTIVE_RING_INFO command 2015-10-12 13:19:29 +08:00
vmxnet_debug.h net/vmxnet3: fix debug macro pattern for vmxnet3 2016-01-11 11:01:34 +08:00
vmxnet_rx_pkt.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
vmxnet_rx_pkt.h Clean up includes some more 2016-03-22 22:20:16 +01:00
vmxnet_tx_pkt.c hw/net: Clean up includes 2016-01-29 15:07:23 +00:00
vmxnet_tx_pkt.h Clean up includes some more 2016-03-22 22:20:16 +01:00
xen_nic.c xen: Clean up includes 2016-01-29 15:07:23 +00:00
xgmac.c arm: Clean up includes 2016-01-29 15:07:23 +00:00
xilinx_axienet.c include/qemu/osdep.h: Don't include qapi/error.h 2016-03-22 22:20:15 +01:00
xilinx_ethlite.c hw: explicitly include qemu-common.h and cpu.h 2016-03-22 22:20:17 +01:00