diff options
| author | Luigi Rizzo <rizzo@iet.unipi.it> | 2013-02-05 17:53:31 +0100 |
|---|---|---|
| committer | Stefan Hajnoczi <stefanha@redhat.com> | 2013-02-27 16:10:23 +0100 |
| commit | 199ee608f0d08510b5c6c37f31a7fbff211d63c4 (patch) | |
| tree | 62d264bb698419fdc701bd11830d47d905cab9e8 /net/net.c | |
| parent | ee24aaf356f44ca7c8fbef136a438c12091cffd0 (diff) | |
| download | focaccia-qemu-199ee608f0d08510b5c6c37f31a7fbff211d63c4.tar.gz focaccia-qemu-199ee608f0d08510b5c6c37f31a7fbff211d63c4.zip | |
net: fix qemu_flush_queued_packets() in presence of a hub
When frontend and backend are connected through a hub as below (showing only one direction), and the frontend (or in general, all output ports of the hub) cannot accept more traffic, the backend queues packets in queue-A. When the frontend (or in general, one output port) becomes ready again, quemu tries to flush packets from queue-B, which is unfortunately empty. e1000.0 <--[queue B]-- hub0port0(hub)hub0port1 <--[queue A]-- tap.0 To fix this i propose to introduce a new function net_hub_flush() which is called when trying to flush a queue connected to a hub. Signed-off-by: Luigi Rizzo <rizzo@iet.unipi.it> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'net/net.c')
| -rw-r--r-- | net/net.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/net.c b/net/net.c index be03a8dd14..a66aa02472 100644 --- a/net/net.c +++ b/net/net.c @@ -441,6 +441,12 @@ void qemu_flush_queued_packets(NetClientState *nc) { nc->receive_disabled = 0; + if (nc->peer && nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_HUBPORT) { + if (net_hub_flush(nc->peer)) { + qemu_notify_event(); + } + return; + } if (qemu_net_queue_flush(nc->send_queue)) { /* We emptied the queue successfully, signal to the IO thread to repoll * the file descriptor (for tap, for example). |