From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1M7VgJ-00084X-3u for qemu-devel@nongnu.org; Fri, 22 May 2009 10:25:07 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1M7VgD-00083s-Qj for qemu-devel@nongnu.org; Fri, 22 May 2009 10:25:06 -0400 Received: from [199.232.76.173] (port=45270 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1M7VgD-00083p-Oz for qemu-devel@nongnu.org; Fri, 22 May 2009 10:25:01 -0400 Received: from mx2.redhat.com ([66.187.237.31]:47209) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1M7VgD-0000I3-7H for qemu-devel@nongnu.org; Fri, 22 May 2009 10:25:01 -0400 From: Mark McLoughlin In-Reply-To: <1243002261.29542.6.camel@blaa> References: <1242726931-5726-1-git-send-email-markmc@redhat.com> <1242726931-5726-2-git-send-email-markmc@redhat.com> <1242726931-5726-3-git-send-email-markmc@redhat.com> <1242726931-5726-4-git-send-email-markmc@redhat.com> <1242726931-5726-5-git-send-email-markmc@redhat.com> <1242726931-5726-6-git-send-email-markmc@redhat.com> <1242726931-5726-7-git-send-email-markmc@redhat.com> <1242726931-5726-8-git-send-email-markmc@redhat.com> <1242726931-5726-9-git-send-email-markmc@redhat.com> <1242726931-5726-10-git-send-email-markmc@redhat.com> <1243002216.29542.5.camel@blaa> <1243002261.29542.6.camel@blaa> Content-Type: text/plain Date: Fri, 22 May 2009 15:24:57 +0100 Message-Id: <1243002297.29542.7.camel@blaa> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 12/13] net: make use of async packet sending API in tap client Reply-To: Mark McLoughlin List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org If a packet is queued by qemu_send_packet(), remove I/O handler for the tap fd until we get notification that the packet has been sent. A not insignificant side effect of this is we can now drain the tap send queue in one go without fear of packets being dropped. Signed-off-by: Mark McLoughlin --- net.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/net.c b/net.c index 3675bc5..4cd041c 100644 --- a/net.c +++ b/net.c @@ -934,15 +934,31 @@ static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen) } #endif +static void tap_send(void *opaque); + +static void tap_send_completed(VLANClientState *vc) +{ + TAPState *s = vc->opaque; + + qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s); +} + static void tap_send(void *opaque) { TAPState *s = opaque; int size; - size = tap_read_packet(s->fd, s->buf, sizeof(s->buf)); - if (size > 0) { - qemu_send_packet(s->vc, s->buf, size); - } + do { + size = tap_read_packet(s->fd, s->buf, sizeof(s->buf)); + if (size <= 0) { + break; + } + + size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed); + if (size == 0) { + qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); + } + } while (size > 0); } static void tap_cleanup(VLANClientState *vc) -- 1.6.0.6