Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Aug 2019 11:14:06 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Andriy Gapon <avg@FreeBSD.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: confused/concerned about ZFS / 64-bit atomics / 32-bit platforms
Message-ID:  <20190816081406.GM2738@kib.kiev.ua>
In-Reply-To: <8bbee981-4f95-22eb-d9ec-00267c8e111d@FreeBSD.org>
References:  <8bbee981-4f95-22eb-d9ec-00267c8e111d@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Aug 16, 2019 at 10:23:01AM +0300, Andriy Gapon wrote:
> 
> I somewhat confused with respect to what guarantees C provides with
> respect to accessing 64-bit objects on 32-bit platforms, if any.
> I am also concerned about the use of 64-bit atomic values in ZFS given
> that FreeBSD seems to support ZFS on 32-bit platforms (powerpc, i386, ...).
> 
> My concerns stems from a failed import of a ZFS change from illumos.
> That change has this pattern:
> 
> volatile uint64_t *p;
> uint64_t x, y;
> ...
> x = *p;
> ...
> atomic_foo_64(p, y);
> 
> Specifically, I am concerned that there can be a torn read in x=*p
> assignment on 32-bit platforms even if they provide a native
> implementation of atomic_foo_64().  I am even more concerned about
> platforms where atomic_foo_64() is not available and we need to emulate
> it in opensolaris_atomic.c with the help from atomic_mtx.
> 
> In more general terms, I am concerned about plain reads of 64-bit
> variables that are manipulated atomically elsewhere, on 32-bit platforms.
> Is my concern justified?
Yes, your concerns are justified.  Plain reads of 64bit variables on 32bit
arches are not atomic.  Also we do not provide e.g. atomic_load_64(9) on
32bit machines.

On some architectures, there might be specific tricks to ensure
atomicity of load and store for 64bit vars, e.g. on i386 (actually
Pentium and newer) with use of of the CMPXCHG8 instruction, using it in
dumb mode. ARM seems to provide LDREXD/STREXD. But AFAIK 32 ppc does not
have any means to do it.

> 
> Note that I saw the above access pattern only in the code that is not
> imported yet.  I only suspect that that pattern might already be present
> in the current ZFS/FreeBSD code given that it uses 64-bit variables and
> atomics a lot.
> I am not sure if there is a quick way to check that.  Maybe
> devel/coccinelle could be used for that.
> 
> -- 
> Andriy Gapon
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20190816081406.GM2738>