From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60172) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bulYP-0003iL-Bc for qemu-devel@nongnu.org; Thu, 13 Oct 2016 15:20:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bulYJ-0005TU-A8 for qemu-devel@nongnu.org; Thu, 13 Oct 2016 15:20:32 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:55224) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bulYG-0005NK-U9 for qemu-devel@nongnu.org; Thu, 13 Oct 2016 15:20:27 -0400 Date: Thu, 13 Oct 2016 15:20:15 -0400 From: "Emilio G. Cota" Message-ID: <20161013192015.GA22617@flamenco> References: <1476107947-31430-1-git-send-email-pbonzini@redhat.com> <1476107947-31430-3-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1476107947-31430-3-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH 2/5] cpus: use atomic_read to read seqlock-protected variables List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, alex.bennee@linaro.org On Mon, Oct 10, 2016 at 15:59:04 +0200, Paolo Bonzini wrote: > There is a data race if the variable is written concurrently to the > read. In C11 this has undefined behavior. Use atomic_read. The > write side does not need atomic_set, because it is protected by a > mutex. Is tsan happy with the way seqlocks are written right now? According to this message I just found by Dmitry Vyukov, tsan shouldn't be. Note however that the message is from April'15, so it might be outdated: Dmitry Vyukov wrote: > 1. Tsan is bad at handling stand-alone memory barriers. > And here is a way to express seqlock that is both correct, is > understood by tsan and is no overhead on x86: > > // writer > atomic_store(&seq, seq+1, memory_order_relaxed); > atomic_store(&data[0], ..., memory_order_release); > ... > atomic_store(&data[N], ..., memory_order_release); > atomic_store(&seq, seq+1, memory_order_release); > > // reader > atomic_load(&seq, memory_order_acquire); > d0 = atomic_load(&data[0], memory_order_acquire); > ... > dN = atomic_load(&data[N], memory_order_acquire); > atomic_load(&seq, memory_order_relaxed); Source: https://groups.google.com/forum/#!topic/thread-sanitizer/B4i9EMQ4BQE Thanks, Emilio