mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/spinlock: support higher number of cpus
Allow 16 bits per cpu number, which is the limit imposed by spinlock_tickets_t. This will allow up to 65535 cpus, while increasing only the size of recursive spinlocks in debug builds from 8 to 12 bytes. The current Xen limit of 4095 cpus is imposed by SPINLOCK_CPU_BITS being 12. There are machines available with more cpus than the current Xen limit, so it makes sense to have the possibility to use more cpus. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
0b09531d21
commit
c286bb93d2
2 files changed
+12
-10
No files matched your search
@@ -485,7 +485,9 @@ bool _rspin_trylock(rspinlock_t *lock)
|
||||
|
||||
/* Don't allow overflow of recurse_cpu field. */
|
||||
BUILD_BUG_ON(NR_CPUS > SPINLOCK_NO_CPU);
|
||||
BUILD_BUG_ON(SPINLOCK_CPU_BITS > sizeof(lock->recurse_cpu) * 8);
|
||||
BUILD_BUG_ON(SPINLOCK_RECURSE_BITS < 3);
|
||||
BUILD_BUG_ON(SPINLOCK_MAX_RECURSE > ((1u << SPINLOCK_RECURSE_BITS) - 1));
|
||||
|
||||
check_lock(&lock->debug, true);
|
||||
|
||||
|
||||
+10
-10
@@ -8,16 +8,16 @@
|
||||
#include <asm/system.h>
|
||||
#include <asm/spinlock.h>
|
||||
|
||||
#define SPINLOCK_CPU_BITS 12
|
||||
#define SPINLOCK_CPU_BITS 16
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCKS
|
||||
union lock_debug {
|
||||
uint16_t val;
|
||||
#define LOCK_DEBUG_INITVAL 0xffff
|
||||
uint32_t val;
|
||||
#define LOCK_DEBUG_INITVAL 0xffffffff
|
||||
struct {
|
||||
uint16_t cpu:SPINLOCK_CPU_BITS;
|
||||
#define LOCK_DEBUG_PAD_BITS (14 - SPINLOCK_CPU_BITS)
|
||||
uint16_t :LOCK_DEBUG_PAD_BITS;
|
||||
unsigned int cpu:SPINLOCK_CPU_BITS;
|
||||
#define LOCK_DEBUG_PAD_BITS (30 - SPINLOCK_CPU_BITS)
|
||||
unsigned int :LOCK_DEBUG_PAD_BITS;
|
||||
bool irq_safe:1;
|
||||
bool unseen:1;
|
||||
};
|
||||
@@ -211,11 +211,11 @@ typedef struct spinlock {
|
||||
|
||||
typedef struct rspinlock {
|
||||
spinlock_tickets_t tickets;
|
||||
uint16_t recurse_cpu:SPINLOCK_CPU_BITS;
|
||||
uint16_t recurse_cpu;
|
||||
#define SPINLOCK_NO_CPU ((1u << SPINLOCK_CPU_BITS) - 1)
|
||||
#define SPINLOCK_RECURSE_BITS (16 - SPINLOCK_CPU_BITS)
|
||||
uint16_t recurse_cnt:SPINLOCK_RECURSE_BITS;
|
||||
#define SPINLOCK_MAX_RECURSE ((1u << SPINLOCK_RECURSE_BITS) - 1)
|
||||
#define SPINLOCK_RECURSE_BITS 8
|
||||
uint8_t recurse_cnt;
|
||||
#define SPINLOCK_MAX_RECURSE 15
|
||||
union lock_debug debug;
|
||||
#ifdef CONFIG_DEBUG_LOCK_PROFILE
|
||||
struct lock_profile *profile;
|
||||
|
||||