svn commit: r334712 - head/sys/compat/linuxkpi/common/include/asm
Mateusz Guzik
mjguzik at gmail.com
Wed Jun 6 15:06:44 UTC 2018
On Wed, Jun 6, 2018 at 3:59 PM, Hans Petter Selasky <hselasky at freebsd.org>
wrote:
> Author: hselasky
> Date: Wed Jun 6 13:59:51 2018
> New Revision: 334712
> URL: https://svnweb.freebsd.org/changeset/base/334712
>
> Log:
> Implement the atomic_dec_if_positive() function in the LinuxKPI.
>
> Submitted by: Johannes Lundberg <johalun0 at gmail.com>
> MFC after: 1 week
> Sponsored by: Mellanox Technologies
> Sponsored by: Limelight Networks
>
> Modified:
> head/sys/compat/linuxkpi/common/include/asm/atomic.h
>
> Modified: head/sys/compat/linuxkpi/common/include/asm/atomic.h
> ============================================================
> ==================
> --- head/sys/compat/linuxkpi/common/include/asm/atomic.h Wed Jun
> 6 13:37:31 2018 (r334711)
> +++ head/sys/compat/linuxkpi/common/include/asm/atomic.h Wed Jun
> 6 13:59:51 2018 (r334712)
> @@ -235,6 +235,22 @@ atomic_cmpxchg(atomic_t *v, int old, int new)
> __ret.val; \
> })
>
> +static inline int
> +atomic_dec_if_positive(atomic_t *v)
> +{
> + int retval;
> + int curr;
> +
> + do {
> + curr = atomic_read(v);
> + retval = curr - 1;
> + if (unlikely(retval < 0))
> + break;
> + } while (!likely(atomic_cmpset_int(&v->counter, curr, retval)));
> +
> + return (retval);
> +}
> +
>
cmpset loops are crap since they require an explicit re-read of the target
value
see fcmpset and refcount_acquire_if_not_zero for an example use
--
Mateusz Guzik <mjguzik gmail.com>
More information about the svn-src-all
mailing list