[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 05/13] net/socket: Drop net_socket_can_send
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v4 05/13] net/socket: Drop net_socket_can_send |
Date: |
Thu, 4 Jun 2015 14:45:16 +0800 |
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.
If the peer is not ready, disable the read poll until send completes.
Signed-off-by: Fam Zheng <address@hidden>
---
net/socket.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/net/socket.c b/net/socket.c
index 5a19aa1..7055d1e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -51,18 +51,9 @@ typedef struct NetSocketState {
static void net_socket_accept(void *opaque);
static void net_socket_writable(void *opaque);
-/* Only read packets from socket when peer can receive them */
-static int net_socket_can_send(void *opaque)
-{
- NetSocketState *s = opaque;
-
- return qemu_can_send_packet(&s->nc);
-}
-
static void net_socket_update_fd_handler(NetSocketState *s)
{
- qemu_set_fd_handler2(s->fd,
- s->read_poll ? net_socket_can_send : NULL,
+ qemu_set_fd_handler2(s->fd, NULL,
s->read_poll ? s->send_fn : NULL,
s->write_poll ? net_socket_writable : NULL,
s);
@@ -142,6 +133,15 @@ static ssize_t net_socket_receive_dgram(NetClientState
*nc, const uint8_t *buf,
return ret;
}
+static void net_socket_send_completed(NetClientState *nc, ssize_t len)
+{
+ NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
+
+ if (!s->read_poll) {
+ net_socket_read_poll(s, true);
+ }
+}
+
static void net_socket_send(void *opaque)
{
NetSocketState *s = opaque;
@@ -211,9 +211,13 @@ static void net_socket_send(void *opaque)
buf += l;
size -= l;
if (s->index >= s->packet_len) {
- qemu_send_packet(&s->nc, s->buf, s->packet_len);
s->index = 0;
s->state = 0;
+ if (qemu_send_packet_async(&s->nc, s->buf, size,
+ net_socket_send_completed) == 0) {
+ net_socket_read_poll(s, false);
+ break;
+ }
}
break;
}
@@ -234,7 +238,10 @@ static void net_socket_send_dgram(void *opaque)
net_socket_write_poll(s, false);
return;
}
- qemu_send_packet(&s->nc, s->buf, size);
+ if (qemu_send_packet_async(&s->nc, s->buf, size,
+ net_socket_send_completed) == 0) {
+ net_socket_read_poll(s, false);
+ }
}
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct
in_addr *localaddr)
--
2.4.2
- [Qemu-devel] [PATCH v4 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 01/13] stubs: Add qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 02/13] qemu-nbd: Switch to qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 03/13] l2tpv3: Drop l2tpv3_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 04/13] netmap: Drop netmap_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 05/13] net/socket: Drop net_socket_can_send,
Fam Zheng <=
- [Qemu-devel] [PATCH v4 06/13] tap: Drop tap_can_send, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 08/13] main-loop: Drop qemu_set_fd_handler2, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 10/13] oss: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 11/13] xen_backend: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 12/13] event-notifier: Always return 0 for posix implementation, Fam Zheng, 2015/06/04
- [Qemu-devel] [PATCH v4 13/13] iohandler: Change return type of qemu_set_fd_handler to "void", Fam Zheng, 2015/06/04
- Re: [Qemu-devel] [PATCH v4 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2, Stefan Hajnoczi, 2015/06/05