Stop dropping so many RX packets in tap
Normally, tap always reads packets and simply lets the client drop them if it
cannot receive them. For virtio-net, this results in massive packet loss and
about an 80% performance loss in TCP throughput.
This patch modifies qemu_send_packet() to only deliver a packet to a VLAN
client if it doesn't have a fd_can_read method or the fd_can_read method
indicates that it can receive packets. We also return a status of whether
any clients were able to receive the packet.
If no clients were able to receive a packet, we buffer the packet until a
client indicates that it can receive packets again.
This patch also modifies the tap code to only read from the tap fd if at least
one client on the VLAN is able to receive a packet.
Finally, this patch changes the tap code to drain all possible packets from
the tap device when the tap fd is readable.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>