xemu/net
Stefan Hajnoczi a290aeebc4 tap: avoid deadlocking rx
The net subsystem has a control flow mechanism so peer NetClientStates
can tell each other to stop sending packets.  This is used to stop
monitoring the tap file descriptor for incoming packets if the guest rx
ring has no spare buffers.

There is a corner case when tap_can_send() is true at the beginning of
an event loop iteration but becomes false before the tap_send() fd
handler is invoked.

tap_send() will read the packet from the tap file descriptor and attempt
to send it.  The net queue will hold on to the packet and return 0,
indicating that further I/O is not possible.  tap then stops monitoring
the file descriptor for reads.

This is unlike the normal case where tap_can_send() is the same before
and during the event loop iteration.  The event loop would simply not
monitor the file descriptor if tap_can_send() returns true.  Upon next
iteration it would check tap_can_send() again and begin monitoring if we
can send.

The deadlock happens because tap_send() explicitly disabled read_poll.
This is done with the expectation that the peer will call
qemu_net_queue_flush().  But hw/net/virtio-net.c does not monitor
vm_running transitions and issue the flush.  Hence we're left with a
broken tap device.

Cc: qemu-stable@nongnu.org
Reported-by: Neil Skrypuch <neil@tembosocial.com>
Tested-by: Neil Skrypuch <neil@tembosocial.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
(cherry picked from commit 68e5ec6400)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
2014-06-25 15:17:15 -05:00
..
Makefile.objs Common definitions for VMWARE devices 2013-03-25 11:13:10 +01:00
checksum.c net: iovec checksum calculator 2013-03-25 11:13:10 +01:00
clients.h net: reorganize headers 2012-12-19 08:31:29 +01:00
dump.c aio / timers: Switch entire codebase to the new timer API 2013-08-22 19:14:24 +02:00
eth.c misc: Use g_assert_not_reached for code which is expected to be unreachable 2013-07-27 11:22:54 +04:00
hub.c net: Rename send_queue to incoming_queue 2013-09-06 17:01:26 +02:00
hub.h net: fix qemu_flush_queued_packets() in presence of a hub 2013-02-27 16:10:23 +01:00
net.c net: fix qemu_flush_queued_packets() in presence of a hub 2013-11-08 17:32:34 +01:00
queue.c net: fix unbounded NetQueue 2013-02-27 16:10:39 +01:00
slirp.c fix -net user checks by reordering checks 2013-06-19 12:44:38 +02:00
socket.c net: call socket_set_fast_reuse instead of setting SO_REUSEADDR 2013-10-02 19:20:31 +02:00
tap-aix.c tap: multiqueue support 2013-02-01 11:03:02 -06:00
tap-bsd.c tap: Use numbered tap/tun devices on all *BSD OS's 2013-09-06 17:01:26 +02:00
tap-haiku.c tap: multiqueue support 2013-02-01 11:03:02 -06:00
tap-linux.c tap: set IFF_ONE_QUEUE per default 2013-02-27 16:10:47 +01:00
tap-linux.h tap: set IFF_ONE_QUEUE per default 2013-02-27 16:10:47 +01:00
tap-solaris.c tap: multiqueue support 2013-02-01 11:03:02 -06:00
tap-win32.c tap: support enabling or disabling a queue 2013-02-01 11:03:02 -06:00
tap.c tap: avoid deadlocking rx 2014-06-25 15:17:15 -05:00
tap_int.h tap: multiqueue support 2013-02-01 11:03:02 -06:00
util.c net: reorganize headers 2012-12-19 08:31:29 +01:00
util.h net: move parse_macaddr() to net/util.[ch] 2009-12-03 09:41:34 -06:00
vde.c net: increase buffer size to accommodate Jumbo frame pkts 2013-03-25 11:14:07 +01:00