summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@nuts.davemloft.net>2004-02-24 07:29:30 -0800
committerDavid S. Miller <davem@nuts.davemloft.net>2004-02-24 07:29:30 -0800
commit9b91e15be1064f3b9b75be8fa44f5fffe0c14c9c (patch)
treec52b55e6b2843d93b75b6cf31e07482cf3af7d44
parent61e7d4eb42c5e71e647ac7275f16be56036ad865 (diff)
parentd6c90be10ece90d36a76975be330f638495c3d36 (diff)
Merge bk://bk.phunnypharm.org/sparc-2.6
into nuts.davemloft.net:/disk1/BK/sparc-2.6
-rw-r--r--arch/sparc64/kernel/irq.c5
-rw-r--r--arch/sparc64/lib/debuglocks.c9
-rw-r--r--include/asm-sparc64/spinlock.h3
3 files changed, 11 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
index 50cbd964e6c5..48d96659a369 100644
--- a/arch/sparc64/kernel/irq.c
+++ b/arch/sparc64/kernel/irq.c
@@ -1104,8 +1104,9 @@ void init_irqwork_curcpu(void)
{
register struct irq_work_struct *workp asm("o2");
unsigned long tmp;
+ int cpu = hard_smp_processor_id();
- memset(__irq_work + smp_processor_id(), 0, sizeof(*workp));
+ memset(__irq_work + cpu, 0, sizeof(*workp));
/* Make sure we are called with PSTATE_IE disabled. */
__asm__ __volatile__("rdpr %%pstate, %0\n\t"
@@ -1120,7 +1121,7 @@ void init_irqwork_curcpu(void)
}
/* Set interrupt globals. */
- workp = &__irq_work[smp_processor_id()];
+ workp = &__irq_work[cpu];
__asm__ __volatile__(
"rdpr %%pstate, %0\n\t"
"wrpr %0, %1, %%pstate\n\t"
diff --git a/arch/sparc64/lib/debuglocks.c b/arch/sparc64/lib/debuglocks.c
index 8a7c0f77ff2e..341cce76b773 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 201472fc01bc..8387816e4ac2 100644
--- a/include/asm-sparc64/spinlock.h
+++ b/include/asm-sparc64/spinlock.h
@@ -7,6 +7,7 @@
#define __SPARC64_SPINLOCK_H
#include <linux/config.h>
+#include <linux/threads.h> /* 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)