Skip site navigation (1)Skip section navigation (2)
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>