All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Daniel P . Berrange" <berrange@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	peterx@redhat.com, "Markus Armbruster" <armbru@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: [Qemu-devel] [PATCH 07/14] qio/chardev: update net listener gcontext
Date: Wed, 28 Feb 2018 13:06:26 +0800	[thread overview]
Message-ID: <20180228050633.7410-8-peterx@redhat.com> (raw)
In-Reply-To: <20180228050633.7410-1-peterx@redhat.com>

TCP chardevs can be using QIO network listeners working in the
background when in listening mode.  However the network listeners are
always running in main context.  This can race with chardevs that are
running in non-main contexts.

To solve this: firstly introduce qio_net_listener_set_context() to allow
caller to set gcontext for network listeners.  Then call it in
tcp_chr_update_read_handler(), with the newly cached gcontext.

It's fairly straightforward after we have introduced some net listener
helper functions - basically we unregister the GSources and add them
back with the correct context.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 chardev/char-socket.c     |  9 +++++++++
 include/io/net-listener.h | 12 ++++++++++++
 io/net-listener.c         |  7 +++++++
 3 files changed, 28 insertions(+)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index 43a2cc2c1c..8f0935cd15 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -559,6 +559,15 @@ static void tcp_chr_update_read_handler(Chardev *chr)
 {
     SocketChardev *s = SOCKET_CHARDEV(chr);
 
+    if (s->listener) {
+        /*
+         * It's possible that chardev context is changed in
+         * qemu_chr_be_update_read_handlers().  Reset it for QIO net
+         * listener if there is.
+         */
+        qio_net_listener_set_context(s->listener, chr->gcontext);
+    }
+
     if (!s->connected) {
         return;
     }
diff --git a/include/io/net-listener.h b/include/io/net-listener.h
index 566be283b3..39dede9d6f 100644
--- a/include/io/net-listener.h
+++ b/include/io/net-listener.h
@@ -106,6 +106,18 @@ int qio_net_listener_open_sync(QIONetListener *listener,
                                SocketAddress *addr,
                                Error **errp);
 
+/**
+ * qio_net_listener_set_context:
+ * @listener: the net listener object
+ * @context: the context that we'd like to bind the sources to
+ *
+ * This helper does not do anything but moves existing net listener
+ * sources from the old one to the new one.  It can be seen as a
+ * no-operation if there is no listening source at all.
+ */
+void qio_net_listener_set_context(QIONetListener *listener,
+                                  GMainContext *context);
+
 /**
  * qio_net_listener_add:
  * @listener: the network listener object
diff --git a/io/net-listener.c b/io/net-listener.c
index 7f07a81fed..7ffad72f55 100644
--- a/io/net-listener.c
+++ b/io/net-listener.c
@@ -145,6 +145,13 @@ static void qio_net_listener_sources_update(QIONetListener *listener,
     }
 }
 
+void qio_net_listener_set_context(QIONetListener *listener,
+                                  GMainContext *context)
+{
+    qio_net_listener_sources_clear(listener);
+    qio_net_listener_sources_update(listener, context);
+}
+
 void qio_net_listener_add(QIONetListener *listener,
                           QIOChannelSocket *sioc)
 {
-- 
2.14.3

  parent reply	other threads:[~2018-02-28  5:07 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-28  5:06 [Qemu-devel] [PATCH 00/14] qio: general non-default GMainContext support Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 01/14] chardev: fix leak in tcp_chr_telnet_init_io() Peter Xu
2018-02-28  9:26   ` Daniel P. Berrangé
2018-02-28  5:06 ` [Qemu-devel] [PATCH 02/14] qio: rename qio_task_thread_result Peter Xu
2018-02-28  9:26   ` Daniel P. Berrangé
2018-02-28  5:06 ` [Qemu-devel] [PATCH 03/14] qio: introduce qio_channel_add_watch_full() Peter Xu
2018-02-28  9:08   ` Daniel P. Berrangé
2018-02-28 12:44     ` Peter Xu
2018-02-28 12:47       ` Daniel P. Berrangé
2018-02-28 13:01         ` Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 04/14] migration: let incoming side use thread context Peter Xu
2018-02-28  9:10   ` Daniel P. Berrangé
2018-03-01  4:33     ` Peter Xu
2018-02-28 17:43   ` Dr. David Alan Gilbert
2018-03-01  2:53     ` Peter Xu
2018-03-01  9:58       ` Dr. David Alan Gilbert
2018-02-28  5:06 ` [Qemu-devel] [PATCH 05/14] qio: refactor net listener source operations Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 06/14] qio: store gsources for net listeners Peter Xu
2018-02-28  5:06 ` Peter Xu [this message]
2018-02-28  9:25   ` [Qemu-devel] [PATCH 07/14] qio/chardev: update net listener gcontext Daniel P. Berrangé
2018-02-28 12:52     ` Peter Xu
2018-02-28 13:06       ` Daniel P. Berrangé
2018-02-28  5:06 ` [Qemu-devel] [PATCH 08/14] chardev: allow telnet gsource to switch gcontext Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 09/14] qio: basic non-default context support for thread Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 10/14] qio: refcount QIOTask Peter Xu
2018-02-28  9:16   ` Daniel P. Berrangé
2018-02-28 12:54     ` Peter Xu
2018-02-28 13:07       ` Daniel P. Berrangé
2018-02-28 13:15         ` Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 11/14] qio/chardev: return QIOTask when connect async Peter Xu
2018-02-28  9:20   ` Daniel P. Berrangé
2018-02-28 13:07     ` Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 12/14] qio: move QIOTaskThreadData into QIOTask Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 13/14] qio: allow threaded qiotask to switch contexts Peter Xu
2018-02-28  9:23   ` Daniel P. Berrangé
2018-02-28 13:05     ` Peter Xu
2018-02-28 13:20       ` Daniel P. Berrangé
2018-03-01  8:49         ` Peter Xu
2018-02-28  5:06 ` [Qemu-devel] [PATCH 14/14] qio/chardev: specify gcontext for TLS handshake Peter Xu
2018-02-28 13:22   ` Daniel P. Berrangé
2018-03-01  6:28     ` Peter Xu

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=20180228050633.7410-8-peterx@redhat.com \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.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.