Commit a6c4c1c5 authored by David S. Miller's avatar David S. Miller Committed by Greg Kroah-Hartman

sparc64: Make prom entry spinlock NMI safe.

[ Upstream commit 8a4fd1e4 ]

If we do something like try to print to the OF console from an NMI
while we're already in OpenFirmware, we'll deadlock on the spinlock.

Use a raw spinlock and disable NMIs when we take it.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8c2b12e1
...@@ -32,8 +32,7 @@ extern void prom_cif_interface(void); ...@@ -32,8 +32,7 @@ extern void prom_cif_interface(void);
extern void prom_cif_callback(void); extern void prom_cif_callback(void);
/* /*
* This provides SMP safety on the p1275buf. prom_callback() drops this lock * This provides SMP safety on the p1275buf.
* to allow recursuve acquisition.
*/ */
DEFINE_SPINLOCK(prom_entry_lock); DEFINE_SPINLOCK(prom_entry_lock);
...@@ -47,7 +46,9 @@ long p1275_cmd(const char *service, long fmt, ...) ...@@ -47,7 +46,9 @@ long p1275_cmd(const char *service, long fmt, ...)
p = p1275buf.prom_buffer; p = p1275buf.prom_buffer;
spin_lock_irqsave(&prom_entry_lock, flags); raw_local_save_flags(flags);
raw_local_irq_restore(PIL_NMI);
spin_lock(&prom_entry_lock);
p1275buf.prom_args[0] = (unsigned long)p; /* service */ p1275buf.prom_args[0] = (unsigned long)p; /* service */
strcpy (p, service); strcpy (p, service);
...@@ -139,7 +140,8 @@ long p1275_cmd(const char *service, long fmt, ...) ...@@ -139,7 +140,8 @@ long p1275_cmd(const char *service, long fmt, ...)
va_end(list); va_end(list);
x = p1275buf.prom_args [nargs + 3]; x = p1275buf.prom_args [nargs + 3];
spin_unlock_irqrestore(&prom_entry_lock, flags); spin_unlock(&prom_entry_lock);
raw_local_irq_restore(flags);
return x; return x;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment