Date: Wed, 1 Feb 2017 16:17:21 +0200 From: Konstantin Belousov <kostikbel@gmail.com> To: Alexander Kabaev <kan@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r313040 - head/sys/mips/include Message-ID: <20170201141721.GB2092@kib.kiev.ua> In-Reply-To: <201702010500.v1150YLR075051@repo.freebsd.org> References: <201702010500.v1150YLR075051@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 01, 2017 at 05:00:34AM +0000, Alexander Kabaev wrote: > Author: kan > Date: Wed Feb 1 05:00:34 2017 > New Revision: 313040 > URL: https://svnweb.freebsd.org/changeset/base/313040 > > Log: > Add atomic_fcmpset_*() inlines for MIPS > > atomic_fcmpset_*() is analogous to atomic_cmpset(), but saves off the > read value from the target memory location into the 'old' pointer. > > Reviewed by: imp, brooks > Requested by: mjg > Differential Revision: https://reviews.freebsd.org/D9391 > > Modified: > head/sys/mips/include/atomic.h > > Modified: head/sys/mips/include/atomic.h > ============================================================================== > --- head/sys/mips/include/atomic.h Wed Feb 1 04:54:23 2017 (r313039) > +++ head/sys/mips/include/atomic.h Wed Feb 1 05:00:34 2017 (r313040) > @@ -362,7 +362,7 @@ atomic_load_64(__volatile uint64_t *p, u > * zero if the compare failed, nonzero otherwise. > */ > static __inline uint32_t > -atomic_cmpset_32(__volatile uint32_t* p, uint32_t cmpval, uint32_t newval) > +atomic_cmpset_32(__volatile uint32_t *p, uint32_t cmpval, uint32_t newval) > { > uint32_t ret; > > @@ -405,6 +405,46 @@ atomic_cmpset_rel_32(__volatile uint32_t > return (atomic_cmpset_32(p, cmpval, newval)); > } > > +static __inline uint32_t > +atomic_fcmpset_32(__volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) > +{ > + uint32_t ret; > + > + __asm __volatile ( > + "1:\n\t" > + "ll %0, %1\n\t" /* load old value */ > + "bne %0, %4, 2f\n\t" /* compare */ > + "move %0, %3\n\t" /* value to store */ > + "sc %0, %1\n\t" /* attempt to store */ > + "beqz %0, 1b\n\t" /* if it failed, spin */ Please do not retry on sc failure, return the error to upper layer. See also r313007 and preceeding discussion after r312973. > + "j 3f\n\t" > + "2:\n\t" > + "sw %0, %2\n\t" /* save old value */ > + "li %0, 0\n\t" > + "3:\n" > + : "=&r" (ret), "+m" (*p), "=m" (*cmpval) > + : "r" (newval), "r" (*cmpval) > + : "memory"); > + return ret; > +} > +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170201141721.GB2092>