diff mbox

[PULL,05/16] tap: Drop tap_can_send

Message ID 1434113861-26495-6-git-send-email-stefanha@redhat.com
State New
Headers show

Commit Message

Stefan Hajnoczi June 12, 2015, 12:57 p.m. UTC
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(-)

Comments

Aurelien Jarno July 9, 2015, 10:42 p.m. UTC | #1
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 mbox

Patch

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));