[Blackfin] arch: fix bug - grab locks when not atomic

grab locks when not atomic - this fixes the issues
sometimes seen when using magic sysrq.

Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
Robin Getz 2008-03-26 09:17:43 +08:00 committed by Bryan Wu
parent 9a62ca40fd
commit 904656cda1

View File

@ -75,7 +75,7 @@ static void decode_address(char *buf, unsigned long address)
struct task_struct *p; struct task_struct *p;
struct mm_struct *mm; struct mm_struct *mm;
unsigned long flags, offset; unsigned long flags, offset;
unsigned int in_exception = bfin_read_IPEND() & 0x10; unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
unsigned long symsize; unsigned long symsize;
@ -117,7 +117,7 @@ static void decode_address(char *buf, unsigned long address)
*/ */
write_lock_irqsave(&tasklist_lock, flags); write_lock_irqsave(&tasklist_lock, flags);
for_each_process(p) { for_each_process(p) {
mm = (in_exception ? p->mm : get_task_mm(p)); mm = (in_atomic ? p->mm : get_task_mm(p));
if (!mm) if (!mm)
continue; continue;
@ -146,14 +146,14 @@ static void decode_address(char *buf, unsigned long address)
sprintf(buf, "<0x%p> [ %s + 0x%lx ]", sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
(void *)address, name, offset); (void *)address, name, offset);
if (!in_exception) if (!in_atomic)
mmput(mm); mmput(mm);
goto done; goto done;
} }
vml = vml->next; vml = vml->next;
} }
if (!in_exception) if (!in_atomic)
mmput(mm); mmput(mm);
} }