Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Jun 2018 17:06:42 +0200
From:      Mateusz Guzik <mjguzik@gmail.com>
To:        Hans Petter Selasky <hselasky@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r334712 - head/sys/compat/linuxkpi/common/include/asm
Message-ID:  <CAGudoHFHZk_9qB016bUhcQH4sGCbNLj28FkdJ0Q4M2joR0x3xw@mail.gmail.com>
In-Reply-To: <201806061359.w56DxpSZ020224@repo.freebsd.org>
References:  <201806061359.w56DxpSZ020224@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jun 6, 2018 at 3:59 PM, Hans Petter Selasky <hselasky@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@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>



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