From patchwork Wed Apr 29 10:37:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fam Zheng X-Patchwork-Id: 465974 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id C09821402BC for ; Wed, 29 Apr 2015 20:43:38 +1000 (AEST) Received: from localhost ([::1]:38150 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnPSq-0005t9-Qf for incoming@patchwork.ozlabs.org; Wed, 29 Apr 2015 06:43:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45298) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnPO4-0006f7-Mf for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:38:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnPO1-0003Iw-0O for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:38:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37702) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnPO0-0003If-OW for qemu-devel@nongnu.org; Wed, 29 Apr 2015 06:38:36 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t3TAcXma011084 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 29 Apr 2015 06:38:33 -0400 Received: from ad.nay.redhat.com (dhcp-14-137.nay.redhat.com [10.66.14.137]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t3TAc0Kr023811; Wed, 29 Apr 2015 06:38:29 -0400 From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 29 Apr 2015 18:37:53 +0800 Message-Id: <1430303875-31647-7-git-send-email-famz@redhat.com> In-Reply-To: <1430303875-31647-1-git-send-email-famz@redhat.com> References: <1430303875-31647-1-git-send-email-famz@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Kevin Wolf , Jason Wang , Vincenzo Maffione , Stefan Hajnoczi , Paolo Bonzini , Giuseppe Lettieri , Luigi Rizzo Subject: [Qemu-devel] [RFC PATCH 6/8] tap: Drop tap_can_send X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- net/tap.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/net/tap.c b/net/tap.c index 968df46..2ddf570 100644 --- a/net/tap.c +++ b/net/tap.c @@ -61,14 +61,12 @@ typedef struct TAPState { static int launch_script(const char *setup_script, const char *ifname, int fd); -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); @@ -165,13 +163,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) { @@ -190,10 +181,13 @@ static void tap_send(void *opaque) TAPState *s = opaque; int size; int packets = 0; + bool can_send = true; - while (qemu_can_send_packet(&s->nc)) { + while (can_send) { uint8_t *buf = s->buf; + can_send = qemu_can_send_packet(&s->nc); + size = tap_read_packet(s->fd, s->buf, sizeof(s->buf)); if (size <= 0) { break; @@ -204,8 +198,13 @@ static void tap_send(void *opaque) size -= s->host_vnet_hdr_len; } + /* If !can_send, we will want to disable the read poll, but we still + * need the send completion callback to enable it again, which is a + * sign of peer becoming ready. So call the send function + * regardlessly of can_send. + */ size = qemu_send_packet_async(&s->nc, buf, size, tap_send_completed); - if (size == 0) { + if (size == 0 || !can_send) { tap_read_poll(s, false); break; } else if (size < 0) {