All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, aneesh.kumar@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH for-2.5] virtio-9p: use QEMU thread pool
Date: Fri, 27 Nov 2015 13:42:46 +0100	[thread overview]
Message-ID: <20151127134246.3a33702d@bahia.local> (raw)
In-Reply-To: <1448624586-28299-2-git-send-email-pbonzini@redhat.com>

On Fri, 27 Nov 2015 12:43:06 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> The QEMU thread pool already has a mechanism to invoke callbacks in the main
> thread.  It does not need an EventNotifier and it is more efficient too.
> Use it instead of GAsyncQueue + GThreadPool + glue.
> 
> As a side effect, it silences Coverity's complaint about an unchecked
> return value for event_notifier_init.
> 

And it makes the code a lot nicer too !

> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---

I have just one minor remark in hw/9pfs/virtio-9p-coth.h but anyway:

Reviewed-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Tested-by: Greg Kurz <gkurz@linux.vnet.ibm.com>

>  hw/9pfs/virtio-9p-coth.c   | 79 +++++++++++-----------------------------------
>  hw/9pfs/virtio-9p-coth.h   |  9 +-----
>  hw/9pfs/virtio-9p-device.c |  4 ---
>  3 files changed, 20 insertions(+), 72 deletions(-)
> 
> diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c
> index 5057f8d..fb6e8f8 100644
> --- a/hw/9pfs/virtio-9p-coth.c
> +++ b/hw/9pfs/virtio-9p-coth.c
> @@ -12,71 +12,30 @@
>   *
>   */
> 
> -#include "fsdev/qemu-fsdev.h"
> -#include "qemu/thread.h"
> -#include "qemu/event_notifier.h"
> +#include "qemu-common.h"
> +#include "block/thread-pool.h"
>  #include "qemu/coroutine.h"
> +#include "qemu/main-loop.h"
>  #include "virtio-9p-coth.h"
> 
> -/* v9fs glib thread pool */
> -static V9fsThPool v9fs_pool;
> +/* Called from QEMU I/O thread.  */
> +static void coroutine_enter_cb(void *opaque, int ret)
> +{
> +    Coroutine *co = opaque;
> +    qemu_coroutine_enter(co, NULL);
> +}
> +
> +/* Called from worker thread.  */
> +static int coroutine_enter_func(void *arg)
> +{
> +    Coroutine *co = arg;
> +    qemu_coroutine_enter(co, NULL);
> +    return 0;
> +}
> 
>  void co_run_in_worker_bh(void *opaque)
>  {
>      Coroutine *co = opaque;
> -    g_thread_pool_push(v9fs_pool.pool, co, NULL);
> -}
> -
> -static void v9fs_qemu_process_req_done(EventNotifier *e)
> -{
> -    Coroutine *co;
> -
> -    event_notifier_test_and_clear(e);
> -
> -    while ((co = g_async_queue_try_pop(v9fs_pool.completed)) != NULL) {
> -        qemu_coroutine_enter(co, NULL);
> -    }
> -}
> -
> -static void v9fs_thread_routine(gpointer data, gpointer user_data)
> -{
> -    Coroutine *co = data;
> -
> -    qemu_coroutine_enter(co, NULL);
> -
> -    g_async_queue_push(v9fs_pool.completed, co);
> -
> -    event_notifier_set(&v9fs_pool.e);
> -}
> -
> -int v9fs_init_worker_threads(void)
> -{
> -    int ret = 0;
> -    V9fsThPool *p = &v9fs_pool;
> -    sigset_t set, oldset;
> -
> -    sigfillset(&set);
> -    /* Leave signal handling to the iothread.  */
> -    pthread_sigmask(SIG_SETMASK, &set, &oldset);
> -
> -    p->pool = g_thread_pool_new(v9fs_thread_routine, p, -1, FALSE, NULL);
> -    if (!p->pool) {
> -        ret = -1;
> -        goto err_out;
> -    }
> -    p->completed = g_async_queue_new();
> -    if (!p->completed) {
> -        /*
> -         * We are going to terminate.
> -         * So don't worry about cleanup
> -         */
> -        ret = -1;
> -        goto err_out;
> -    }
> -    event_notifier_init(&p->e, 0);
> -
> -    event_notifier_set_handler(&p->e, v9fs_qemu_process_req_done);
> -err_out:
> -    pthread_sigmask(SIG_SETMASK, &oldset, NULL);
> -    return ret;
> +    thread_pool_submit_aio(qemu_get_aio_context()->thread_pool,
> +                           coroutine_enter_func, co, coroutine_enter_cb, co);
>  }
> diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
> index 0fbe49a..535743f 100644
> --- a/hw/9pfs/virtio-9p-coth.h
> +++ b/hw/9pfs/virtio-9p-coth.h
> @@ -20,13 +20,6 @@
>  #include "virtio-9p.h"
>  #include <glib.h>
> 

glib.h is no more needed.

> -typedef struct V9fsThPool {
> -    EventNotifier e;
> -
> -    GThreadPool *pool;
> -    GAsyncQueue *completed;
> -} V9fsThPool;
> -
>  /*
>   * we want to use bottom half because we want to make sure the below
>   * sequence of events.
> @@ -45,7 +38,7 @@ typedef struct V9fsThPool {
>          qemu_bh_schedule(co_bh);                                        \
>          /*                                                              \
>           * yield in qemu thread and re-enter back                       \
> -         * in glib worker thread                                        \
> +         * in worker thread                                             \
>           */                                                             \
>          qemu_coroutine_yield();                                         \
>          qemu_bh_delete(co_bh);                                          \
> diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
> index e3abcfa..944b5f5 100644
> --- a/hw/9pfs/virtio-9p-device.c
> +++ b/hw/9pfs/virtio-9p-device.c
> @@ -116,10 +116,6 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
>                     " and export path:%s", s->fsconf.fsdev_id, s->ctx.fs_root);
>          goto out;
>      }
> -    if (v9fs_init_worker_threads() < 0) {
> -        error_setg(errp, "worker thread initialization failed");
> -        goto out;
> -    }
> 
>      /*
>       * Check details of export path, We need to use fs driver

  reply	other threads:[~2015-11-27 12:42 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-27 11:43 [Qemu-devel] [PATCH for-2.5] virtio-9p: use QEMU thread pool Paolo Bonzini
2015-11-27 12:42 ` Greg Kurz [this message]
2015-11-27 13:08   ` Paolo Bonzini
2015-11-27 14:06     ` Greg Kurz

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=20151127134246.3a33702d@bahia.local \
    --to=gkurz@linux.vnet.ibm.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --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 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.