All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] 答复: Re: [PATCHv3 01/03] qemu-iothread: IOThread supports the GMainContextevent loop
@ 2017-08-21  2:56 wang.yong155
  0 siblings, 0 replies; only message in thread
From: wang.yong155 @ 2017-08-21  2:56 UTC (permalink / raw)
  To: pbonzini
  Cc: stefanha, famz, jasowang, zhangchen.fnst, zhang.zhanghailiang,
	wang.guang55, lizhijian, qemu-devel

>> +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)>

>You still need aio_notify, so that the aio_poll call in iothread_run exits.
Thanks. The proposal is reasonable, and here we should notify aio_poll to exit.




WangYong



原始邮件



发件人: <pbonzini@redhat.com>
收件人:王勇10170530 <stefanha@redhat.com> <famz@redhat.com> <jasowang@redhat.com> <zhangchen.fnst@cn.fujitsu.com> <zhang.zhanghailiang@huawei.com>
抄送人:王广10165992 <lizhijian@cn.fujitsu.com> <qemu-devel@nongnu.org>
日 期 :2017年08月17日 19:47
主 题 :Re: [PATCHv3 01/03] qemu-iothread: IOThread supports the GMainContextevent loop





On 17/08/2017 12:58, Wang yong wrote:
> From: Wang Yong <wang.yong155@zte.com.cn>
> 
> IOThread uses AioContext event loop and does not run a GMainContext.
> Therefore,chardev cannot work in IOThread,such as the chardev is
> used for colo-compare packets reception.
> 
> This patch makes the IOThread run the GMainContext event loop,
> chardev and IOThread can work together.
> 
> Signed-off-by: Wang Yong <wang.yong155@zte.com.cn>
> Signed-off-by: Wang Guang <wang.guang55@zte.com.cn>
> ---
>  include/sysemu/iothread.h |  4 ++++
>  iothread.c                | 41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+)
> 
> diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
> index e6da1a4..d2985b3 100644
> --- a/include/sysemu/iothread.h
> +++ b/include/sysemu/iothread.h
> @@ -24,6 +24,9 @@ typedef struct {
>  
>      QemuThread thread
>      AioContext *ctx
> +    GMainContext *worker_context
> +    GMainLoop *main_loop
> +    GOnce once
>      QemuMutex init_done_lock
>      QemuCond init_done_cond    /* is thread initialization done? */
>      bool stopping
> @@ -41,5 +44,6 @@ typedef struct {
>  char *iothread_get_id(IOThread *iothread)
>  AioContext *iothread_get_aio_context(IOThread *iothread)
>  void iothread_stop_all(void)
> +GMainContext *iothread_get_g_main_context(IOThread *iothread)
>  
>  #endif /* IOTHREAD_H */
> diff --git a/iothread.c b/iothread.c
> index beeb870..80ef830 100644
> --- a/iothread.c
> +++ b/iothread.c
> @@ -57,6 +57,20 @@ static void *iothread_run(void *opaque)
>  
>      while (!atomic_read(&iothread->stopping)) {
>          aio_poll(iothread->ctx, true)
> +
> +        if (atomic_read(&iothread->worker_context)) {
> +            g_main_context_push_thread_default(iothread->worker_context)
> +            iothread->main_loop =
> +                g_main_loop_new(iothread->worker_context, TRUE)
> +            g_main_loop_run(iothread->main_loop)
> +
> +            g_main_loop_unref(iothread->main_loop)
> +            iothread->main_loop = NULL
> +
> +            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 +87,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 +142,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 +327,26 @@ 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)

You still need aio_notify, so that the aio_poll call in iothread_run exits.

Paolo

> +    return NULL
> +}
> +
> +GMainContext *iothread_get_g_main_context(IOThread *iothread)
> +{
> +    g_once(&iothread->once, iothread_g_main_context_init, iothread)
> +
> +    return iothread->worker_context
> +}
>

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-08-21  2:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-21  2:56 [Qemu-devel] 答复: Re: [PATCHv3 01/03] qemu-iothread: IOThread supports the GMainContextevent loop wang.yong155

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.