|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 10/12] xen/spinlock: split recursive spinlocks from normal ones
On 12.12.2023 10:47, Juergen Gross wrote:
> --- a/xen/common/spinlock.c
> +++ b/xen/common/spinlock.c
> @@ -541,6 +541,55 @@ void rspin_unlock_irqrestore(rspinlock_t *lock, unsigned
> long flags)
> local_irq_restore(flags);
> }
>
> +int nrspin_trylock(rspinlock_t *lock)
> +{
> + check_lock(&lock->debug, true);
> +
> + if ( unlikely(lock->recurse_cpu != SPINLOCK_NO_CPU) )
> + return 0;
> +
> + return spin_trylock_common(&lock->tickets, &lock->debug,
> LOCK_PROFILE_PAR);
> +}
I wonder if we shouldn't take the opportunity and stop having trylock
functions have "int" return type. Perhaps already spin_trylock_common()
when introduced could use "bool" instead, then here following suit.
> +void nrspin_lock(rspinlock_t *lock)
> +{
> + spin_lock_common(&lock->tickets, &lock->debug, LOCK_PROFILE_PAR, NULL,
> + NULL);
> +}
> +
> +void nrspin_unlock(rspinlock_t *lock)
> +{
> + spin_unlock_common(&lock->tickets, &lock->debug, LOCK_PROFILE_PAR);
> +}
> +
> +void nrspin_lock_irq(rspinlock_t *lock)
> +{
> + ASSERT(local_irq_is_enabled());
> + local_irq_disable();
> + nrspin_lock(lock);
> +}
> +
> +void nrspin_unlock_irq(rspinlock_t *lock)
> +{
> + nrspin_unlock(lock);
> + local_irq_enable();
> +}
> +
> +unsigned long __nrspin_lock_irqsave(rspinlock_t *lock)
> +{
> + unsigned long flags;
> +
> + local_irq_save(flags);
> + nrspin_lock(lock);
> + return flags;
Nit: Strictly speaking we want a blank line ahead of this "return".
> @@ -166,11 +172,15 @@ struct lock_profile_qhead { };
> struct lock_profile { };
>
> #define SPIN_LOCK_UNLOCKED {
> \
> + .debug =_LOCK_DEBUG,
> \
> +}
> +#define RSPIN_LOCK_UNLOCKED {
> \
> + .debug =_LOCK_DEBUG,
> \
> .recurse_cpu = SPINLOCK_NO_CPU,
> \
> .debug =_LOCK_DEBUG,
> \
> }
Initializing .debug twice?
> @@ -180,7 +190,6 @@ struct lock_profile { };
>
> #endif
>
> -
> typedef union {
> uint32_t head_tail;
> struct {
Looks like this might be undoing what the earlier patch isn't going to
do anymore?
> @@ -242,6 +257,19 @@ void rspin_unlock_irqrestore(rspinlock_t *lock, unsigned
> long flags);
> int rspin_is_locked(const rspinlock_t *lock);
> void rspin_barrier(rspinlock_t *lock);
>
> +int nrspin_trylock(rspinlock_t *lock);
> +void nrspin_lock(rspinlock_t *lock);
> +void nrspin_unlock(rspinlock_t *lock);
> +void nrspin_lock_irq(rspinlock_t *lock);
> +void nrspin_unlock_irq(rspinlock_t *lock);
> +#define nrspin_lock_irqsave(l, f) \
> + ({ \
> + BUILD_BUG_ON(sizeof(f) != sizeof(unsigned long)); \
> + ((f) = __nrspin_lock_irqsave(l)); \
I don't think the outer pair of parentheses is needed here. As to the
leading double underscores, see comments elsewhere.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |