Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Jan 2017 12:53:45 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Justin Hibbits <jhibbits@FreeBSD.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r312973 - head/sys/powerpc/include
Message-ID:  <20170130105345.GL3018@kib.kiev.ua>
In-Reply-To: <201701300215.v0U2Fsl0006455@repo.freebsd.org>
References:  <201701300215.v0U2Fsl0006455@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
> +#ifdef __GNUCLIKE_ASM
> +	__asm __volatile (
> +		"1:\tlwarx %0, 0, %3\n\t"	/* load old value */
> +		"cmplw %4, %0\n\t"		/* compare */
> +		"bne 2f\n\t"			/* exit if not equal */
> +		"stwcx. %5, 0, %3\n\t"      	/* attempt to store */
> +		"bne- 1b\n\t"			/* spin if failed */
> +		"li %0, 1\n\t"			/* success - retval = 1 */
> +		"b 3f\n\t"			/* we've succeeded */
> +		"2:\n\t"
> +		"stwcx. %0, 0, %3\n\t"       	/* clear reservation (74xx) */
> +		"stwx %0, 0, %7\n\t"
> +		"li %0, 0\n\t"			/* failure - retval = 0 */
> +		"3:\n\t"
> +		: "=&r" (ret), "=m" (*p), "=m" (*cmpval)
> +		: "r" (p), "r" (*cmpval), "r" (newval), "m" (*p), "r"(cmpval)
> +		: "cr0", "memory");
> +#endif

It seems that in case of failed conditional store, the code retries.
Note that this is not incorrect but also not a desirable behaviour
with fcmpset:  the function should return error and leave the retry
to the caller.  There is no point in having embedded loop.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170130105345.GL3018>