svn commit: r313040 - head/sys/mips/include

Konstantin Belousov kostikbel at gmail.com
Wed Feb 1 14:17:34 UTC 2017


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;
> +}
> +


More information about the svn-src-head mailing list