From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40587) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a1FvZ-0004lN-UT for qemu-devel@nongnu.org; Tue, 24 Nov 2015 10:54:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a1FvW-00025O-OU for qemu-devel@nongnu.org; Tue, 24 Nov 2015 10:54:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44735) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a1FvW-00025J-Jr for qemu-devel@nongnu.org; Tue, 24 Nov 2015 10:54:42 -0500 References: <565485A0.5090902@sysgo.com> From: Paolo Bonzini Message-ID: <5654883F.9050509@redhat.com> Date: Tue, 24 Nov 2015 16:54:39 +0100 MIME-Version: 1.0 In-Reply-To: <565485A0.5090902@sysgo.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH] qemu_mutex_iothread_locked not correctly synchronized List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Engraf , qemu-devel@nongnu.org Cc: Fam Zheng On 24/11/2015 16:43, David Engraf wrote: > Commit afbe70535ff1a8a7a32910cc15ebecc0ba92e7da introduced the function > qemu_mutex_iothread_locked to avoid recursive locking of the iothread > lock. The iothread_locked variable uses the __thread attribute which > results in a per thread storage location whereas the qemu_global_mutex > is not thread specific. This leads to race conditions because the > variable is not in sync between threads. Frankly, this makes no sense. You're modifying the qemu_mutex_iothread_locked function to return whether _some_ thread has taken the mutex, but the function tells you whether _the calling_ thread has taken the mutex (that's the point about recursive locking). This breaks the callers of qemu_mutex_iothread_locked completely. The variable need not be in sync between the different threads; each thread only needs to know about itself. The current code works because: 1) the iothread mutex is not locked before qemu_mutex_lock_iothread 2) the iothread mutex is not locked after qemu_mutex_lock_iothread 3) qemu_cond_wait doesn't matter because the thread does not run during a qemu_cond_wait. > I triggered this problem reproducible on a Windows machine whereas Linu= x works fine.=20 What are the symptoms, and what is your Windows compiler? Paolo