git: ce65353ac1a1 - main - linuxkpi: Implement atomic_dec_and_lock_irqsave()
Mateusz Guzik
mjguzik at gmail.com
Mon Apr 26 15:23:08 UTC 2021
On 4/26/21, Neel Chauhan <nc at freebsd.org> wrote:
> The branch main has been updated by nc (ports committer):
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=ce65353ac1a17677bef03e96df8da967c9086743
>
> commit ce65353ac1a17677bef03e96df8da967c9086743
> Author: Neel Chauhan <nc at FreeBSD.org>
> AuthorDate: 2021-04-26 15:15:49 +0000
> Commit: Neel Chauhan <nc at FreeBSD.org>
> CommitDate: 2021-04-26 15:15:49 +0000
>
> linuxkpi: Implement atomic_dec_and_lock_irqsave()
>
> This is needed by the drm-kmod 5.5 update.
>
> Reviewed by: hselasky, manu
> MFC after: 3 days
> Differential Revision: https://reviews.freebsd.org/D29988
> ---
> sys/compat/linuxkpi/common/include/linux/spinlock.h | 13 +++++++++++++
> sys/sys/param.h | 2 +-
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/sys/compat/linuxkpi/common/include/linux/spinlock.h
> b/sys/compat/linuxkpi/common/include/linux/spinlock.h
> index 2309794b26ec..7ef474b671dc 100644
> --- a/sys/compat/linuxkpi/common/include/linux/spinlock.h
> +++ b/sys/compat/linuxkpi/common/include/linux/spinlock.h
> @@ -31,6 +31,7 @@
> #ifndef _LINUX_SPINLOCK_H_
> #define _LINUX_SPINLOCK_H_
>
> +#include <asm/atomic.h>
> #include <sys/param.h>
> #include <sys/kernel.h>
> #include <sys/lock.h>
> @@ -160,4 +161,16 @@ spin_lock_destroy(spinlock_t *lock)
> mtx_assert(&(_l)->m, MA_OWNED); \
> } while (0)
>
> +static inline int
> +atomic_dec_and_lock_irqsave(atomic_t *cnt, spinlock_t *lock,
> + unsigned long flags)
> +{
> + spin_lock_irqsave(lock, flags);
> + if (atomic_dec_and_test(cnt)) {
> + return (1);
> + }
> + spin_unlock_irqrestore(lock, flags);
> + return (0);
> +}
This is likely going to significantly reduce performance. The routine
is only expected to grab the lock when transitioning the count to 0.
iow, this wants a fcmpset loop akin to what can be found in
refcount_release_if_gt
> +
> #endif /* _LINUX_SPINLOCK_H_ */
> diff --git a/sys/sys/param.h b/sys/sys/param.h
> index e4fdb272b7fe..4f80ad5972a4 100644
> --- a/sys/sys/param.h
> +++ b/sys/sys/param.h
> @@ -60,7 +60,7 @@
> * in the range 5 to 9.
> */
> #undef __FreeBSD_version
> -#define __FreeBSD_version 1400010 /* Master, propagated to newvers */
> +#define __FreeBSD_version 1400011 /* Master, propagated to newvers */
>
> /*
> * __FreeBSD_kernel__ indicates that this system uses the kernel of
> FreeBSD,
>
--
Mateusz Guzik <mjguzik gmail.com>
More information about the dev-commits-src-all
mailing list