In message <201805291159.w4tbx3e5085...@repo.freebsd.org>, Hans Petter Selasky writes: > Author: hselasky > Date: Tue May 29 11:59:02 2018 > New Revision: 334320 > URL: https://svnweb.freebsd.org/changeset/base/334320 > > Log: > Implement atomic_add_64() and atomic_subtract_64() for the i386 target. > > While at it add missing _acq_ and _rel_ variants for 64-bit atomic > operations under i386. > > Reviewed by: kib @ > MFC after: 1 week > Sponsored by: Mellanox Technologies > > Modified: > head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c > head/sys/cddl/compat/opensolaris/sys/atomic.h > head/sys/i386/include/atomic.h > > Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c > ============================================================================= > = > --- head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c Tue May > 29 10:29:43 2018 (r334319) > +++ head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c Tue May > 29 11:59:02 2018 (r334320) > @@ -52,7 +52,8 @@ atomic_init(void) > } > #endif > > -#if !defined(__LP64__) && !defined(__mips_n32) && !defined(ARM_HAVE_ATOMIC64 > ) > +#if !defined(__LP64__) && !defined(__mips_n32) && \ > + !defined(ARM_HAVE_ATOMIC64) && !defined(__i386__) > void > atomic_add_64(volatile uint64_t *target, int64_t delta) > { > > Modified: head/sys/cddl/compat/opensolaris/sys/atomic.h > ============================================================================= > = > --- head/sys/cddl/compat/opensolaris/sys/atomic.h Tue May 29 10:29:43 201 > 8 (r334319) > +++ head/sys/cddl/compat/opensolaris/sys/atomic.h Tue May 29 11:59:02 201 > 8 (r334320) > @@ -36,7 +36,8 @@ > atomic_cmpset_ptr((volatile uintptr_t *)(_a), (uintptr_t)(_b), (uintptr > _t) (_c)) > #define cas32 atomic_cmpset_32 > > -#if !defined(__LP64__) && !defined(__mips_n32) && !defined(ARM_HAVE_ATOMIC64 > ) > +#if !defined(__LP64__) && !defined(__mips_n32) && \ > + !defined(ARM_HAVE_ATOMIC64) && !defined(__i386__) > extern void atomic_add_64(volatile uint64_t *target, int64_t delta); > extern void atomic_dec_64(volatile uint64_t *target); > #endif > @@ -85,7 +86,8 @@ atomic_dec_32_nv(volatile uint32_t *target) > return (atomic_fetchadd_32(target, -1) - 1); > } > > -#if defined(__LP64__) || defined(__mips_n32) || defined(ARM_HAVE_ATOMIC64) > +#if defined(__LP64__) || defined(__mips_n32) || \ > + defined(ARM_HAVE_ATOMIC64) || defined(__i386__) > static __inline void > atomic_dec_64(volatile uint64_t *target) > { > > Modified: head/sys/i386/include/atomic.h > ============================================================================= > = > --- head/sys/i386/include/atomic.h Tue May 29 10:29:43 2018 (r33431 > 9) > +++ head/sys/i386/include/atomic.h Tue May 29 11:59:02 2018 (r33432 > 0) > @@ -134,6 +134,8 @@ uint64_t atomic_load_acq_64(volatile uint64_t *); > void atomic_store_rel_64(volatile uint64_t *, uint64_t); > uint64_t atomic_swap_64(volatile uint64_t *, uint64_t); > uint64_t atomic_fetchadd_64(volatile uint64_t *, uint64_t); > +void atomic_add_64(volatile uint64_t *, uint64_t); > +void atomic_subtract_64(volatile uint64_t *, uint64_t); > > #else /* !KLD_MODULE && __GNUCLIKE_ASM */ > > @@ -581,6 +583,30 @@ atomic_fetchadd_64(volatile uint64_t *p, uint64_t v) > } > } > > +static __inline void > +atomic_add_64(volatile uint64_t *p, uint64_t v) > +{ > + uint64_t t; > + > + for (;;) { > + t = *p; > + if (atomic_cmpset_64(p, t, t + v)) > + break; > + } > +} > + > +static __inline void > +atomic_subtract_64(volatile uint64_t *p, uint64_t v) > +{ > + uint64_t t; > + > + for (;;) { > + t = *p; > + if (atomic_cmpset_64(p, t, t - v)) > + break; > + } > +} > + > #endif /* _KERNEL */ > > #endif /* KLD_MODULE || !__GNUCLIKE_ASM */ > @@ -804,6 +830,16 @@ u_long atomic_swap_long(volatile u_long *p, u_long v); > #define atomic_fetchadd_32 atomic_fetchadd_int > #define atomic_testandset_32 atomic_testandset_int > #define atomic_testandclear_32 atomic_testandclear_int > + > +/* Operations on 64-bit quad words. */ > +#define atomic_cmpset_acq_64 atomic_cmpset_64 > +#define atomic_cmpset_rel_64 atomic_cmpset_64 > +#define atomic_fetchadd_acq_64 atomic_fetchadd_64 > +#define atomic_fetchadd_rel_64 atomic_fetchadd_64 > +#define atomic_add_acq_64 atomic_add_64 > +#define atomic_add_rel_64 atomic_add_64 > +#define atomic_subtract_acq_64 atomic_subtract_64 > +#define atomic_subtract_rel_64 atomic_subtract_64 > > /* Operations on pointers. */ > #define atomic_set_ptr(p, v) \ >
Hi Hans, This broke in lib32 on an amd64 system. --- cddl/lib/libnvpair__L --- In file included from /opt/src/svn-current/sys/cddl/contrib/opensolaris/ common/nvpair/opensolaris_fnvpair.c:29: In file included from /opt/src/svn-current/cddl/contrib/opensolaris/lib/ libzpool/common/sys/zfs_context.h:74: /opt/src/svn-current/sys/cddl/compat/opensolaris/sys/atomic.h:94:2: error: implicit declaration of function 'atomic_subtract_64' is invalid in C99 [-Werror,-Wimplicit-function-declaration] atomic_subtract_64(target, 1); ^ -- Cheers, Cy Schubert <cy.schub...@cschubert.com> FreeBSD UNIX: <c...@freebsd.org> Web: http://www.FreeBSD.org The need of the many outweighs the greed of the few. _______________________________________________ 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"