From d548a928a963e41ce9af9bfd73f0b2ffbabd3b43 Mon Sep 17 00:00:00 2001 From: Ben Collins Date: Tue, 24 Feb 2004 09:28:21 -0500 Subject: [PATCH] SPARC64: Fix debug spinlocks to not trash random memory with > 4 cpus's (or sparse cpu's). --- arch/sparc64/lib/debuglocks.c | 9 ++++++--- include/asm-sparc64/spinlock.h | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/sparc64/lib/debuglocks.c b/arch/sparc64/lib/debuglocks.c index 8a7c0f77ff2e8..341cce76b7732 100644 --- a/arch/sparc64/lib/debuglocks.c +++ b/arch/sparc64/lib/debuglocks.c @@ -35,14 +35,17 @@ static inline void show_read (char *str, rwlock_t *lock, unsigned long caller) static inline void show_write (char *str, rwlock_t *lock, unsigned long caller) { int cpu = smp_processor_id(); + int i; printk("%s(%p) CPU#%d stuck at %08x\n", str, lock, cpu, (unsigned int) caller); printk("Writer: PC(%08x):CPU(%x)\n", lock->writer_pc, lock->writer_cpu); - printk("Readers: 0[%08x] 1[%08x] 2[%08x] 4[%08x]\n", - lock->reader_pc[0], lock->reader_pc[1], - lock->reader_pc[2], lock->reader_pc[3]); + printk("Readers:"); + for (i = 0; i < NR_CPUS; i++) + if (lock->reader_pc[i]) + printk(" %d[%08x]", i, lock->reader_pc[i]); + printk("\n"); } #undef INIT_STUCK diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index 201472fc01bcf..8387816e4ac24 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -7,6 +7,7 @@ #define __SPARC64_SPINLOCK_H #include +#include /* For NR_CPUS */ #ifndef __ASSEMBLY__ @@ -131,7 +132,7 @@ extern int __write_trylock(rwlock_t *); typedef struct { unsigned long lock; unsigned int writer_pc, writer_cpu; - unsigned int reader_pc[4]; + unsigned int reader_pc[NR_CPUS]; } rwlock_t; #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0xff, { 0, 0, 0, 0 } } #define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0) -- 2.53.0