From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Fam Zheng <famz@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL 04/16] net/socket: Drop net_socket_can_send
Date: Fri, 12 Jun 2015 13:57:29 +0100 [thread overview]
Message-ID: <1434113861-26495-5-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1434113861-26495-1-git-send-email-stefanha@redhat.com>
From: Fam Zheng <famz@redhat.com>
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 <famz@redhat.com>
Message-id: 1433400324-7358-6-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
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
next prev parent reply other threads:[~2015-06-12 12:57 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-12 12:57 [Qemu-devel] [PULL 00/16] Net patches Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 01/16] stubs: Add qemu_set_fd_handler Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 02/16] l2tpv3: Drop l2tpv3_can_send Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 03/16] netmap: Drop netmap_can_send Stefan Hajnoczi
2015-06-12 12:57 ` Stefan Hajnoczi [this message]
2015-06-12 12:57 ` [Qemu-devel] [PULL 05/16] tap: Drop tap_can_send Stefan Hajnoczi
2015-07-09 22:42 ` Aurelien Jarno
2015-06-12 12:57 ` [Qemu-devel] [PULL 06/16] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 07/16] main-loop: Drop qemu_set_fd_handler2 Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 08/16] alsaaudio: Remove unused error handling of qemu_set_fd_handler Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 09/16] oss: " Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 10/16] xen_backend: " Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 11/16] event-notifier: Always return 0 for posix implementation Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 12/16] iohandler: Change return type of qemu_set_fd_handler to "void" Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 13/16] rocker: Add support for phys name Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 14/16] rocker: update tests using hw-derived interface names Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 15/16] rocker: bring link up/down on PHY enable/disable Stefan Hajnoczi
2015-06-12 12:57 ` [Qemu-devel] [PULL 16/16] qmp/hmp: add rocker device support Stefan Hajnoczi
2015-06-20 21:13 ` Paolo Bonzini
2015-06-12 17:03 ` [Qemu-devel] [PULL 00/16] Net patches Peter Maydell
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=1434113861-26495-5-git-send-email-stefanha@redhat.com \
--to=stefanha@redhat.com \
--cc=famz@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).