[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/13] net: make use of async packet sending API in
From: |
Mark McLoughlin |
Subject: |
[Qemu-devel] [PATCH 12/13] net: make use of async packet sending API in tap client |
Date: |
Fri, 22 May 2009 15:24:57 +0100 |
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 <address@hidden>
---
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
- [Qemu-devel] [PATCH 02/13] net: move the tap buffer into TAPState, (continued)
- [Qemu-devel] [PATCH 02/13] net: move the tap buffer into TAPState, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 03/13] net: vlan clients with no fd_can_read() can always receive, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 04/13] net: only read from tapfd when we can send, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 05/13] net: add fd_readv() handler to qemu_new_vlan_client() args, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 06/13] net: re-name vc->fd_read() to vc->receive(), Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 07/13] net: pass VLANClientState* as first arg to receive handlers, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 08/13] net: add return value to packet receive handler, Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 09/13] net: return status from qemu_deliver_packet(), Mark McLoughlin, 2009/05/19
- [Qemu-devel] [PATCH 10/13] net: split out packet queueing and flushing into separate functions, Mark McLoughlin, 2009/05/22
- [Qemu-devel] [PATCH 11/13] net: add qemu_send_packet_async(), Mark McLoughlin, 2009/05/22
- [Qemu-devel] [PATCH 12/13] net: make use of async packet sending API in tap client,
Mark McLoughlin <=
- [Qemu-devel] [PATCH 13/13] virtio-net: implement rx packet queueing, Mark McLoughlin, 2009/05/22
Re: [Qemu-devel] [PATCH 0/13] Add generic packet buffering API, Avi Kivity, 2009/05/19
[Qemu-devel] Re: [PATCH 0/13] Add generic packet buffering API, Anthony Liguori, 2009/05/22