diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2017-09-08 12:57:28 +0100 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2017-09-08 12:57:28 +0100 |
| commit | 74bbfe024da80a50dbe51fbb17f219d2f3e4d2dd (patch) | |
| tree | 230aa7af0cb3b30fb825dae675e3e33d474b2994 /iothread.c | |
| parent | b3a1179f570b10b7a24a546f7a0dfdf78350d094 (diff) | |
| parent | 861d51e62bb197b43606f888dbefbabebaf0d854 (diff) | |
| download | focaccia-qemu-74bbfe024da80a50dbe51fbb17f219d2f3e4d2dd.tar.gz focaccia-qemu-74bbfe024da80a50dbe51fbb17f219d2f3e4d2dd.zip | |
Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging
# gpg: Signature made Fri 08 Sep 2017 03:00:34 BST # gpg: using RSA key 0xEF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: colo-compare: Update the COLO document to add the IOThread configuration colo-compare: Use IOThread to Check old packet regularly and Process pactkets of the primary qemu-iothread: IOThread supports the GMainContext event loop net/colo-compare.c: Fix comments and scheme net/colo-compare.c: Adjust net queue pop order for performance net/colo-compare.c: Optimize unpredictable tcp options comparison e1000: Rename the SEC symbol to SEQEC net/socket: Improve -net socket error reporting net/net: Convert parse_host_port() to Error net/socket: Convert several helper functions to Error net/socket: Don't treat odd socket type as SOCK_STREAM MAINTAINERS: Update mail address for COLO Proxy net: rtl8139: do not use old_mmio accesses net/rocker: Fix the unusual macro name net/rocker: Convert to realize() net/rocker: Plug memory leak in pci_rocker_init() net/rocker: Remove the dead error handling net/filter-rewriter.c: Fix rewirter checksum bug when use virtio-net Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'iothread.c')
| -rw-r--r-- | iothread.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/iothread.c b/iothread.c index beeb870534..44c8944dc4 100644 --- a/iothread.c +++ b/iothread.c @@ -57,6 +57,23 @@ static void *iothread_run(void *opaque) while (!atomic_read(&iothread->stopping)) { aio_poll(iothread->ctx, true); + + if (atomic_read(&iothread->worker_context)) { + GMainLoop *loop; + + g_main_context_push_thread_default(iothread->worker_context); + iothread->main_loop = + g_main_loop_new(iothread->worker_context, TRUE); + loop = iothread->main_loop; + + g_main_loop_run(iothread->main_loop); + iothread->main_loop = NULL; + g_main_loop_unref(loop); + + g_main_context_pop_thread_default(iothread->worker_context); + g_main_context_unref(iothread->worker_context); + iothread->worker_context = NULL; + } } rcu_unregister_thread(); @@ -73,6 +90,9 @@ static int iothread_stop(Object *object, void *opaque) } iothread->stopping = true; aio_notify(iothread->ctx); + if (atomic_read(&iothread->main_loop)) { + g_main_loop_quit(iothread->main_loop); + } qemu_thread_join(&iothread->thread); return 0; } @@ -125,6 +145,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp) qemu_mutex_init(&iothread->init_done_lock); qemu_cond_init(&iothread->init_done_cond); + iothread->once = (GOnce) G_ONCE_INIT; /* This assumes we are called from a thread with useful CPU affinity for us * to inherit. @@ -309,3 +330,27 @@ void iothread_stop_all(void) object_child_foreach(container, iothread_stop, NULL); } + +static gpointer iothread_g_main_context_init(gpointer opaque) +{ + AioContext *ctx; + IOThread *iothread = opaque; + GSource *source; + + iothread->worker_context = g_main_context_new(); + + ctx = iothread_get_aio_context(iothread); + source = aio_get_g_source(ctx); + g_source_attach(source, iothread->worker_context); + g_source_unref(source); + + aio_notify(iothread->ctx); + return NULL; +} + +GMainContext *iothread_get_g_main_context(IOThread *iothread) +{ + g_once(&iothread->once, iothread_g_main_context_init, iothread); + + return iothread->worker_context; +} |