|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 2/3] xen/spinlock: split recursive spinlocks from normal ones
On 10.09.2022 17:49, Juergen Gross wrote:
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -397,7 +397,7 @@ int p2m_pod_empty_cache(struct domain *d)
>
> /* After this barrier no new PoD activities can happen. */
> BUG_ON(!d->is_dying);
> - spin_barrier(&p2m->pod.lock.lock);
> + spin_barrier(&p2m->pod.lock.lock.lock);
This is getting unwieldy as well, and ...
> @@ -160,21 +165,30 @@ typedef union {
>
> typedef struct spinlock {
> spinlock_tickets_t tickets;
> - u16 recurse_cpu:SPINLOCK_CPU_BITS;
> -#define SPINLOCK_NO_CPU ((1u << SPINLOCK_CPU_BITS) - 1)
> -#define SPINLOCK_RECURSE_BITS (16 - SPINLOCK_CPU_BITS)
> - u16 recurse_cnt:SPINLOCK_RECURSE_BITS;
> -#define SPINLOCK_MAX_RECURSE ((1u << SPINLOCK_RECURSE_BITS) - 1)
> union lock_debug debug;
> #ifdef CONFIG_DEBUG_LOCK_PROFILE
> struct lock_profile *profile;
> #endif
> } spinlock_t;
>
> +struct spinlock_recursive {
> + struct spinlock lock;
> + u16 recurse_cpu:SPINLOCK_CPU_BITS;
> +#define SPINLOCK_NO_CPU ((1u << SPINLOCK_CPU_BITS) - 1)
> +#define SPINLOCK_RECURSE_BITS (16 - SPINLOCK_CPU_BITS)
> + u16 recurse_cnt:SPINLOCK_RECURSE_BITS;
> +#define SPINLOCK_MAX_RECURSE ((1u << SPINLOCK_RECURSE_BITS) - 1)
> +};
... I'm not sure anyway it's a good idea to embed spinlock_t inside the
new struct. I'd prefer if non-optional fields were always at the same
position, and there's not going to be that much duplication if we went
with
typedef struct spinlock {
spinlock_tickets_t tickets;
union lock_debug debug;
#ifdef CONFIG_DEBUG_LOCK_PROFILE
struct lock_profile *profile;
#endif
} spinlock_t;
typedef struct rspinlock {
spinlock_tickets_t tickets;
u16 recurse_cpu:SPINLOCK_CPU_BITS;
#define SPINLOCK_NO_CPU ((1u << SPINLOCK_CPU_BITS) - 1)
#define SPINLOCK_RECURSE_BITS (16 - SPINLOCK_CPU_BITS)
u16 recurse_cnt:SPINLOCK_RECURSE_BITS;
#define SPINLOCK_MAX_RECURSE ((1u << SPINLOCK_RECURSE_BITS) - 1)
union lock_debug debug;
#ifdef CONFIG_DEBUG_LOCK_PROFILE
struct lock_profile *profile;
#endif
} rspinlock_t;
This would also eliminate the size increase of recursive locks in
debug builds. And functions like spin_barrier() then also would
(have to) properly indicate what kind of lock they act on.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |