From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37307) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXmFU-0006EE-74 for qemu-devel@nongnu.org; Fri, 04 Sep 2015 04:21:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZXmFT-0003kN-9q for qemu-devel@nongnu.org; Fri, 04 Sep 2015 04:21:28 -0400 Sender: Paolo Bonzini References: <1441313313-3040-1-git-send-email-anibal.limon@linux.intel.com> From: Paolo Bonzini Message-ID: <55E9530E.7020600@redhat.com> Date: Fri, 4 Sep 2015 10:15:10 +0200 MIME-Version: 1.0 In-Reply-To: <1441313313-3040-1-git-send-email-anibal.limon@linux.intel.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH] cpus.c: qemu_mutex_lock_iothread fix race condition at cpu thread init List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?QW7DrWJhbCBMaW3Ds24=?= , qemu-devel@nongnu.org, qemu-stable On 03/09/2015 22:48, Aníbal Limón wrote: > When QEMU starts the RCU thread executes qemu_mutex_lock_thread > causing error "qemu:qemu_cpu_kick_thread: No such process" and exits. > > This isn't occur frequently but in glibc the thread id can exist and > this not guarantee that the thread is on active/running state. If is > inserted a sleep(1) after newthread assignment [1] the issue appears. > > So not make assumption that thread exist if first_cpu->thread is set > then change the validation of cpu to created that is set into cpu > threads (kvm, tcg, dummy). > > [1] https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_create.c;h=d10f4ea8004e1d8f3a268b95cc0f8d93b8d89867;hb=HEAD#l621 > > Signed-off-by: Aníbal Limón Cc: qemu-stable@nongnu.org Paolo > --- > cpus.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/cpus.c b/cpus.c > index 7e4786e..05e5400 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -1171,7 +1171,7 @@ void qemu_mutex_lock_iothread(void) > * TCG code execution. > */ > if (!tcg_enabled() || qemu_in_vcpu_thread() || > - !first_cpu || !first_cpu->thread) { > + !first_cpu || !first_cpu->created) { > qemu_mutex_lock(&qemu_global_mutex); > atomic_dec(&iothread_requesting_mutex); > } else { >