From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=34218 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OQq5q-0000h6-Lw for qemu-devel@nongnu.org; Mon, 21 Jun 2010 19:07:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OQq5p-0004RE-8v for qemu-devel@nongnu.org; Mon, 21 Jun 2010 19:07:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43999) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OQq5p-0004R0-0i for qemu-devel@nongnu.org; Mon, 21 Jun 2010 19:07:53 -0400 Date: Mon, 21 Jun 2010 20:06:07 -0300 From: Marcelo Tosatti Message-ID: <20100621230607.GA19203@amt.cnet> References: <4C1BA0B4.2010803@siemens.com> <4C1BCEB0.6050601@codemonkey.ws> <20100621193123.GA14083@amt.cnet> <4C1FCABA.3060207@web.de> <4C1FD278.5040403@web.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C1FD278.5040403@web.de> Subject: [Qemu-devel] Re: [PATCH] fix smp with tcg mode and --enable-io-thread List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Glauber Costa , qemu-devel On Mon, Jun 21, 2010 at 10:58:32PM +0200, Jan Kiszka wrote: > Jan Kiszka wrote: > > Marcelo Tosatti wrote: > >> Clear exit_request when iothread grabs the global lock. > >> > >> Signed-off-by: Marcelo Tosatti > >> > >> diff --git a/cpu-exec.c b/cpu-exec.c > >> index 026980a..74cb973 100644 > >> --- a/cpu-exec.c > >> +++ b/cpu-exec.c > >> @@ -236,10 +236,8 @@ int cpu_exec(CPUState *env1) > >> asm(""); > >> env = env1; > >> > >> - if (exit_request) { > >> + if (exit_request) > >> env->exit_request = 1; > >> - exit_request = 0; > >> - } > > > > Coding style... > > > >> > >> #if defined(TARGET_I386) > >> if (!kvm_enabled()) { > >> diff --git a/cpus.c b/cpus.c > >> index fcd0f09..ef1ab22 100644 > >> --- a/cpus.c > >> +++ b/cpus.c > >> @@ -598,6 +598,7 @@ void qemu_mutex_lock_iothread(void) > >> } > >> qemu_mutex_unlock(&qemu_fair_mutex); > >> } > >> + exit_request = 0; > >> } > >> > >> void qemu_mutex_unlock_iothread(void) > >> > >> > > > > I looked into this a bit as well, and that's what I also have in my > > queue. > > > > But things are still widely broken: pause_all_vcpus and run_on_cpu as > > there is no guarantee that all VCPUs regularly call into > > qemu_wait_io_event. Also breakpoints don't work, not only in SMP mode. This fixes pause for me: diff --git a/cpu-exec.c b/cpu-exec.c index c776605..0149da5 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -238,7 +238,6 @@ int cpu_exec(CPUState *env1) if (exit_request) { env->exit_request = 1; - exit_request = 0; } #if defined(TARGET_I386) diff --git a/cpus.c b/cpus.c index 826886c..14f7cfc 100644 --- a/cpus.c +++ b/cpus.c @@ -403,6 +403,8 @@ static void qemu_wait_io_event_common(CPUState *env) static void qemu_wait_io_event(CPUState *env) { + CPUState *e; + while (!tcg_has_work()) qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000); @@ -417,7 +419,9 @@ static void qemu_wait_io_event(CPUState *env) qemu_mutex_unlock(&qemu_fair_mutex); qemu_mutex_lock(&qemu_global_mutex); - qemu_wait_io_event_common(env); + + for (e = first_cpu; e != NULL; e = e->next_cpu) + qemu_wait_io_event_common(e); } static void qemu_kvm_eat_signal(CPUState *env, int timeout) @@ -614,6 +618,7 @@ void qemu_mutex_lock_iothread(void) } qemu_mutex_unlock(&qemu_fair_mutex); } + exit_request = 0; } void qemu_mutex_unlock_iothread(void) Perhaps there is a similar problem with debugging (round robin in tcg_cpu_exec fails when there is a timer pending, and the iothread is not processing pending timers).