From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mt5NZ-00063D-1P for qemu-devel@nongnu.org; Wed, 30 Sep 2009 16:02:25 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mt5NU-0005xM-6z for qemu-devel@nongnu.org; Wed, 30 Sep 2009 16:02:24 -0400 Received: from [199.232.76.173] (port=57908 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mt5NU-0005xC-1A for qemu-devel@nongnu.org; Wed, 30 Sep 2009 16:02:20 -0400 Received: from mail-fx0-f214.google.com ([209.85.220.214]:39130) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mt5NR-0006QX-HN for qemu-devel@nongnu.org; Wed, 30 Sep 2009 16:02:18 -0400 Received: by fxm10 with SMTP id 10so2147147fxm.8 for ; Wed, 30 Sep 2009 13:02:16 -0700 (PDT) Message-ID: <4AC3B944.2060708@codemonkey.ws> Date: Wed, 30 Sep 2009 15:02:12 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 1/2] unlock iothread mutex before running kvm ioctl References: <1254162464-20089-1-git-send-email-glommer@redhat.com> <1254162464-20089-2-git-send-email-glommer@redhat.com> In-Reply-To: <1254162464-20089-2-git-send-email-glommer@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Glauber Costa Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org Glauber Costa wrote: > From: Glauber Costa > > Without this, kvm will hold the mutex while it issues its run ioctl, > and never be able to step out of it, causing a deadlock. > > Signed-off-by: Glauber Costa > Breaks the build when !CONFIG_IOTHREAD and needs a new SoB. > --- > kvm-all.c | 2 ++ > qemu-common.h | 3 +++ > vl.c | 4 ++-- > 3 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/kvm-all.c b/kvm-all.c > index 7dcc553..11f4414 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -605,7 +605,9 @@ int kvm_cpu_exec(CPUState *env) > } > > kvm_arch_pre_run(env, run); > + qemu_mutex_unlock_iothread(); > ret = kvm_vcpu_ioctl(env, KVM_RUN, 0); > + qemu_mutex_lock_iothread(); > kvm_arch_post_run(env, run); > > if (ret == -EINTR || ret == -EAGAIN) { > diff --git a/qemu-common.h b/qemu-common.h > index 12e7dd0..820dd37 100644 > --- a/qemu-common.h > +++ b/qemu-common.h > @@ -146,6 +146,9 @@ char *qemu_strndup(const char *str, size_t size); > void *get_mmap_addr(unsigned long size); > > > +void qemu_mutex_lock_iothread(void); > +void qemu_mutex_unlock_iothread(void); > + > /* Error handling. */ > > void QEMU_NORETURN hw_error(const char *fmt, ...) > diff --git a/vl.c b/vl.c > index eb01da7..f24a260 100644 > --- a/vl.c > +++ b/vl.c > @@ -3640,7 +3640,7 @@ static void qemu_signal_lock(unsigned int msecs) > qemu_mutex_unlock(&qemu_fair_mutex); > } > > -static void qemu_mutex_lock_iothread(void) > +void qemu_mutex_lock_iothread(void) > { > if (kvm_enabled()) { > qemu_mutex_lock(&qemu_fair_mutex); > @@ -3650,7 +3650,7 @@ static void qemu_mutex_lock_iothread(void) > qemu_signal_lock(100); > } > > -static void qemu_mutex_unlock_iothread(void) > +void qemu_mutex_unlock_iothread(void) > { > qemu_mutex_unlock(&qemu_global_mutex); > } >