Message ID | 1434113861-26495-6-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
On 2015-06-12 13:57, Stefan Hajnoczi wrote: > From: Fam Zheng <famz@redhat.com> > > This callback is called by main loop before polling s->fd, if it returns > false, the fd will not be polled in this iteration. > > This is redundant with checks inside read callback. After this patch, > the data will be sent to peer when it arrives. If the device can't > receive, it will be queued to incoming_queue, and when the device status > changes, this queue will be flushed. > > Signed-off-by: Fam Zheng <famz@redhat.com> > Message-id: 1433400324-7358-7-git-send-email-famz@redhat.com > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > net/tap.c | 13 ++----------- > 1 file changed, 2 insertions(+), 11 deletions(-) I just gave a try to QEMU 2.4.0-rc0 with an s390x target, and it seems this patch breaks virtio-net with a tap device (it works well with the user mode network stack). The guest correctly sends out packets, but it seems to not get incoming packets. This is with TCG, I don't know if KVM is also affected.
diff --git a/net/tap.c b/net/tap.c index d1ca314..0d184cf 100644 --- a/net/tap.c +++ b/net/tap.c @@ -62,14 +62,12 @@ typedef struct TAPState { static void launch_script(const char *setup_script, const char *ifname, int fd, Error **errp); -static int tap_can_send(void *opaque); static void tap_send(void *opaque); static void tap_writable(void *opaque); static void tap_update_fd_handler(TAPState *s) { - qemu_set_fd_handler2(s->fd, - s->read_poll && s->enabled ? tap_can_send : NULL, + qemu_set_fd_handler2(s->fd, NULL, s->read_poll && s->enabled ? tap_send : NULL, s->write_poll && s->enabled ? tap_writable : NULL, s); @@ -166,13 +164,6 @@ static ssize_t tap_receive(NetClientState *nc, const uint8_t *buf, size_t size) return tap_write_packet(s, iov, 1); } -static int tap_can_send(void *opaque) -{ - TAPState *s = opaque; - - return qemu_can_send_packet(&s->nc); -} - #ifndef __sun__ ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen) { @@ -192,7 +183,7 @@ static void tap_send(void *opaque) int size; int packets = 0; - while (qemu_can_send_packet(&s->nc)) { + while (true) { uint8_t *buf = s->buf; size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));