All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark McLoughlin <markmc@redhat.com>
To: qemu-devel@nongnu.org
Cc: Sven Rudolph <Sven_Rudolph@drewag.de>,
	Scott Tsai <scottt.tw@gmail.com>,
	Mark McLoughlin <markmc@redhat.com>
Subject: [Qemu-devel] [PATCH 5/5] tap: drain queue in tap_send()
Date: Tue, 27 Oct 2009 18:16:39 +0000	[thread overview]
Message-ID: <1256667399-3149-6-git-send-email-markmc@redhat.com> (raw)
In-Reply-To: <1256667399-3149-1-git-send-email-markmc@redhat.com>

Okay, let's try re-enabling the drain-entire-queue behaviour, with a
difference - before each subsequent packet, use qemu_can_send_packet()
to check that we can send it. This is similar to how we check before
polling the tap fd and avoids having to drop a packet if the receiver
cannot handle it.

This patch should be a performance improvement since we no longer have
to go through the mainloop for each packet.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 net/tap.c |   33 ++++++++++++++++++---------------
 1 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/net/tap.c b/net/tap.c
index f32226b..5272d7d 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -187,23 +187,26 @@ static void tap_send_completed(VLANClientState *vc, ssize_t len)
 static void tap_send(void *opaque)
 {
     TAPState *s = opaque;
-    uint8_t *buf = s->buf;
     int size;
 
-    size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
-    if (size <= 0) {
-        return;
-    }
+    do {
+        uint8_t *buf = s->buf;
 
-    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
-        buf  += sizeof(struct virtio_net_hdr);
-        size -= sizeof(struct virtio_net_hdr);
-    }
+        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
+        if (size <= 0) {
+            break;
+        }
 
-    size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
-    if (size == 0) {
-        tap_read_poll(s, 0);
-    }
+        if (s->has_vnet_hdr && !s->using_vnet_hdr) {
+            buf  += sizeof(struct virtio_net_hdr);
+            size -= sizeof(struct virtio_net_hdr);
+        }
+
+        size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
+        if (size == 0) {
+            tap_read_poll(s, 0);
+        }
+    } while (size > 0 && qemu_can_send_packet(s->vc));
 }
 
 int tap_has_ufo(VLANClientState *vc)
-- 
1.6.2.5

  parent reply	other threads:[~2009-10-27 18:19 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-27 18:16 [Qemu-devel] [PATCH 0/5] Fix packet queueing to allow full tap queue drain Mark McLoughlin
2009-10-27 18:16 ` [Qemu-devel] [PATCH 1/5] tap: disable draining queue in one go Mark McLoughlin
2009-10-27 18:16 ` [Qemu-devel] [PATCH 2/5] net: disable receiving if client returns zero Mark McLoughlin
2009-10-27 18:16 ` [Qemu-devel] [PATCH 3/5] net/queue: queue packets even if sender doesn't supply a callback Mark McLoughlin
2009-10-27 18:16 ` [Qemu-devel] [PATCH 4/5] virtio-net: split the has_buffers() logic from can_receive() Mark McLoughlin
2009-10-27 18:16 ` Mark McLoughlin [this message]
2009-10-30 16:21   ` [Qemu-devel] [PATCH 5/5] tap: drain queue in tap_send() Anthony Liguori
2009-10-30 16:34     ` Mark McLoughlin
2009-10-30 17:46       ` Anthony Liguori
2009-10-28  3:36 ` [Qemu-devel] Re: [PATCH 0/5] Fix packet queueing to allow full tap queue drain Scott Tsai
2009-10-28  8:49   ` Mark McLoughlin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1256667399-3149-6-git-send-email-markmc@redhat.com \
    --to=markmc@redhat.com \
    --cc=Sven_Rudolph@drewag.de \
    --cc=qemu-devel@nongnu.org \
    --cc=scottt.tw@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.