[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 06/13] tap: Drop tap_can_send
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v3 06/13] tap: Drop tap_can_send |
Date: |
Tue, 19 May 2015 10:51:03 +0000 |
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 <address@hidden>
---
net/tap.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/net/tap.c b/net/tap.c
index 968df46..8407aea 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)
{
@@ -191,9 +182,12 @@ static void tap_send(void *opaque)
int size;
int packets = 0;
- while (qemu_can_send_packet(&s->nc)) {
+ while (true) {
+ bool 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,12 @@ 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 anyway.
+ */
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) {
--
2.4.1
- Re: [Qemu-devel] [PATCH v3 02/13] qemu-nbd: Switch to qemu_set_fd_handler, (continued)
- [Qemu-devel] [PATCH v3 03/13] l2tpv3: Drop l2tpv3_can_send, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 04/13] netmap: Drop netmap_can_send, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 01/13] stubs: Add qemu_set_fd_handler, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 05/13] net/socket: Drop net_socket_can_send, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 10/13] oss: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 06/13] tap: Drop tap_can_send,
Fam Zheng <=
- [Qemu-devel] [PATCH v3 11/13] xen_backend: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 12/13] event-notifier: Always return 0 for posix implementation, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 13/13] iohandler: Change return type of qemu_set_fd_handler to "void", Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 08/13] main-loop: Drop qemu_set_fd_handler2, Fam Zheng, 2015/05/18
- [Qemu-devel] [PATCH v3 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler, Fam Zheng, 2015/05/18
- Re: [Qemu-devel] [Qemu-block] [PATCH v3 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2, Stefan Hajnoczi, 2015/05/19