All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Jason Wang <jasowang@redhat.com>,
	Vincenzo Maffione <v.maffione@gmail.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Giuseppe Lettieri <g.lettieri@iet.unipi.it>,
	Luigi Rizzo <rizzo@iet.unipi.it>
Subject: [Qemu-devel] [RFC PATCH v2 05/13] net/socket: Drop net_socket_can_send
Date: Thu, 14 May 2015 11:34:21 +0800	[thread overview]
Message-ID: <1431574469-9605-6-git-send-email-famz@redhat.com> (raw)
In-Reply-To: <1431574469-9605-1-git-send-email-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>
---
 net/socket.c | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index c30e03f..82fa175 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.0

  parent reply	other threads:[~2015-05-14  3:34 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-14  3:34 [Qemu-devel] [RFC PATCH v2 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2 Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 01/13] stubs: Add qemu_set_fd_handler Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 02/13] qemu-nbd: Switch to qemu_set_fd_handler Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 03/13] l2tpv3: Drop l2tpv3_can_send Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 04/13] netmap: Drop netmap_can_send Fam Zheng
2015-05-14  3:34 ` Fam Zheng [this message]
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 06/13] tap: Drop tap_can_send Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 08/13] main-loop: Drop qemu_set_fd_handler2 Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 10/13] oss: " Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 11/13] xen_backend: " Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 12/13] event-notifier: Always return 0 for posix implementation Fam Zheng
2015-05-14  3:34 ` [Qemu-devel] [RFC PATCH v2 13/13] iohandler: Use AioContext internally Fam Zheng
2015-05-14  4:35   ` Fam Zheng
2015-05-14  9:30     ` Paolo Bonzini
2015-05-14  4:39 ` [Qemu-devel] [RFC PATCH v2 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2 Fam Zheng
2015-05-14  9:36   ` Paolo Bonzini
2015-05-14 13:43     ` Fam Zheng

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=1431574469-9605-6-git-send-email-famz@redhat.com \
    --to=famz@redhat.com \
    --cc=g.lettieri@iet.unipi.it \
    --cc=jasowang@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rizzo@iet.unipi.it \
    --cc=stefanha@redhat.com \
    --cc=v.maffione@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.