All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: mtosatti@redhat.com, "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Subject: [Qemu-devel] Re: [patch 05/11] qemu: separate thread for io
Date: Fri, 17 Apr 2009 09:05:15 -0500	[thread overview]
Message-ID: <49E88C9B.2050205@us.ibm.com> (raw)
In-Reply-To: <20090407195443.121795529@localhost.localdomain>

mtosatti@redhat.com wrote:
> Introduce a thread to handle host IO events.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> Index: trunk/qemu-common.h
> ===================================================================
> --- trunk.orig/qemu-common.h
> +++ trunk/qemu-common.h
> @@ -191,6 +191,10 @@ void main_loop_break(void);
>  /* Force QEMU to process pending events */
>  void qemu_notify_event(void);
>
> +/* Unblock cpu */
> +void qemu_cpu_kick(void *env);
> +int qemu_cpu_self(void *env);
> +
>  typedef struct QEMUIOVector {
>      struct iovec *iov;
>      int niov;
> Index: trunk/vl.c
> ===================================================================
> --- trunk.orig/vl.c
> +++ trunk/vl.c
> @@ -146,6 +146,7 @@ int main(int argc, char **argv)
>  #include "gdbstub.h"
>  #include "qemu-timer.h"
>  #include "qemu-char.h"
> +#include "qemu-thread.h"
>  #include "cache-utils.h"
>  #include "block.h"
>  #include "dma.h"
> @@ -278,6 +279,13 @@ uint8_t qemu_uuid[16];
>
>  static int io_thread_fd = -1;
>
> +QemuMutex qemu_global_mutex;
> +QemuMutex qemu_fair_mutex;
> +
> +QemuThread io_thread;
> +QemuThread cpus_thread;
> +QemuCond halt_cond;
> +
>  /***********************************************************/
>  /* x86 ISA bus support */
>
> @@ -1347,8 +1355,6 @@ static void host_alarm_handler(int host_
>          write(alarm_timer_wfd, &byte, sizeof(byte));
>  #endif
>          alarm_timer->flags |= ALARM_FLAG_EXPIRED;
> -
> -        qemu_notify_event();
>      }
>  }
>   

Isn't this unsafe in TCG?  If you have chained TBs in a tight loop, 
removing qemu_notify_event() eliminates the cpu_interrupt call which 
then means that you'll never break out of that tight TB loop.

> @@ -2957,6 +2963,7 @@ int qemu_set_fd_handler2(int fd,
>          ioh->opaque = opaque;
>          ioh->deleted = 0;
>      }
> +    main_loop_break();
>      return 0;
>  }
>
> @@ -3324,7 +3331,6 @@ static int ram_load(QEMUFile *f, void *o
>
>  void qemu_service_io(void)
>  {
> -    qemu_notify_event();
>  }
>   

The same comment from above is applicable here.  qemu_service_io() is 
called from a signal handler.  We should 
s/qemu_service_io/qemu_notify_event/.

>  void main_loop_break(void)
> @@ -3733,6 +3731,105 @@ static void host_main_loop_wait(int *tim
>  }
>  #endif
>   

#ifndef CONFIG_IO_THREAD, doesn't main_loop_break need to do cpu_interrupt?

> +static void qemu_wait_io_event(CPUState *env, int timeout)
> +{
> +    if (timeout)
> +        while (!tcg_has_work(env))
> +            qemu_cond_timedwait(&halt_cond, &qemu_global_mutex, timeout);
>   

What's the point of having a timeout?

> +
> +static void qemu_signal_lock(unsigned int msecs)
> +{
> +    qemu_mutex_lock(&qemu_fair_mutex);
> +
> +    while (qemu_mutex_trylock(&qemu_global_mutex)) {
> +        qemu_thread_signal(&cpus_thread, SIGUSR1);
> +        if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
> +            break;
> +    }
> +    qemu_mutex_unlock(&qemu_fair_mutex);
> +}
> +
>   

Now's a good time to attempt to move a lot of the main loop stuff into a 
separate file.  We can do it after the IO thread series or you can make 
it part of the IO thread series.

-- 
Regards,

Anthony Liguori

  parent reply	other threads:[~2009-04-17 14:05 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090407195126.467365249@localhost.localdomain>
     [not found] ` <20090407195442.646407971@localhost.localdomain>
2009-04-16 20:53   ` [Qemu-devel] Re: [patch 01/11] qemu: create helper for event notification Anthony Liguori
2009-04-16 20:58     ` Marcelo Tosatti
2009-04-17 17:21       ` Anthony Liguori
     [not found] ` <20090407195442.764405844@localhost.localdomain>
2009-04-17 13:53   ` [Qemu-devel] Re: [patch 02/11] qemu: mutex/thread/cond wrappers Anthony Liguori
     [not found] ` <20090407195443.004166674@localhost.localdomain>
2009-04-17 13:57   ` [Qemu-devel] Re: [patch 04/11] qemu: introduce main_loop_break Anthony Liguori
     [not found] ` <20090407195443.121795529@localhost.localdomain>
2009-04-17 14:05   ` Anthony Liguori [this message]
2009-04-18 20:45     ` [Qemu-devel] Re: [patch 05/11] qemu: separate thread for io Marcelo Tosatti
     [not found] ` <20090407195443.716079176@localhost.localdomain>
2009-04-17 14:07   ` [Qemu-devel] Re: [patch 10/11] qemu: make iothread selectable at compile time Anthony Liguori
     [not found] ` <20090407195443.832269134@localhost.localdomain>
2009-04-17 14:09   ` [Qemu-devel] Re: [patch 11/11] qemu: basic kvm iothread support Anthony Liguori
2009-04-22 19:15     ` [Qemu-devel] [patch 00/14] qemu: introduce iothread (v4) mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 01/14] qemu: create helper for event notification mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 02/14] qemu: mutex/thread/cond wrappers and configure tweaks mtosatti
2009-04-22 20:33         ` [Qemu-devel] " Anthony Liguori
2009-04-23 11:15           ` [Qemu-devel] svn trunk currently borked Martin Mohring
2009-04-23 11:58             ` Laurent Desnogues
2009-04-23 13:17               ` Anthony Liguori
2009-04-23 13:21               ` Martin Mohring
2009-04-22 19:15       ` [Qemu-devel] [patch 03/14] qemu: per-arch cpu_has_work mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 04/14] qemu: explictly rearm alarm timer on main_loop_wait mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 05/14] qemu: factor out special event notification mtosatti
2009-04-22 20:58         ` Anthony Liguori
2009-04-22 19:15       ` [Qemu-devel] [patch 06/14] qemu: refactor main_loop mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 07/14] qemu: introduce qemu_init_vcpu mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 08/14] qemu: introduce qemu_cpu_kick mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 09/14] qemu: introduce qemu_init_main_loop mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 10/14] qemu: introduce lock/unlock_iothread mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 11/14] qemu: use debug_requested global instead of cpu_exec return mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 12/14] qemu: refactor tcg cpu execution loop mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 13/14] qemu: handle stop request in main loop mtosatti
2009-04-22 19:15       ` [Qemu-devel] [patch 14/14] qemu: introduce iothread mtosatti

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=49E88C9B.2050205@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=mtosatti@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.