On Mon, Aug 6, 2018 at 10:40 AM Hans Petter Selasky <hsela...@freebsd.org> wrote:
> Author: hselasky > Date: Mon Aug 6 08:40:02 2018 > New Revision: 337374 > URL: https://svnweb.freebsd.org/changeset/base/337374 > > Log: > Implement atomic_long_cmpxchg() function in the LinuxKPI. > > Submitted by: Johannes Lundberg <johal...@gmail.com> > MFC after: 1 week > Sponsored by: Mellanox Technologies > > Modified: > head/sys/compat/linuxkpi/common/include/asm/atomic-long.h > > Modified: head/sys/compat/linuxkpi/common/include/asm/atomic-long.h > > ============================================================================== > --- head/sys/compat/linuxkpi/common/include/asm/atomic-long.h Mon Aug 6 > 08:35:16 2018 (r337373) > +++ head/sys/compat/linuxkpi/common/include/asm/atomic-long.h Mon Aug 6 > 08:40:02 2018 (r337374) > @@ -81,6 +81,21 @@ atomic_long_xchg(atomic_long_t *v, long val) > return atomic_swap_long(&v->counter, val); > } > > +static inline long > +atomic_long_cmpxchg(atomic_long_t *v, long old, long new) > +{ > + long ret = old; > + > + for (;;) { > + if (atomic_cmpset_long(&v->counter, old, new)) > + break; > + ret = READ_ONCE(v->counter); > + if (ret != old) > + break; > + } > + return (ret); > +} This code is seriously inferior to atomic_fcmpset_long, which happens to return the found value just like the linux atomic_long_cmpxchg would. The atomic_cmpset_* primitives should not be used if the target value is to be inspected. + > static inline int > atomic_long_add_unless(atomic_long_t *v, long a, long u) > { > > -- Mateusz Guzik <mjguzik gmail.com> _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"