svn commit: r334320 - in head/sys: cddl/compat/opensolaris/kern cddl/compat/opensolaris/sys i386/include

Hans Petter Selasky hps at selasky.org
Tue May 29 13:10:50 UTC 2018


On 05/29/18 15:02, Cy Schubert wrote:
> In message <201805291159.w4TBx3e5085835 at 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);
>          ^

I only tested buildkernel i386 LINT + GENERIC with this change. I will 
have a look ASAP.

--HPS



More information about the svn-src-all mailing list