[Blackfin] arch: fix bug - grab locks when not atomic
authorRobin Getz <rgetz@blackfin.uclinux.org>
Wed, 26 Mar 2008 01:17:43 +0000 (09:17 +0800)
committerBryan Wu <cooloney@kernel.org>
Wed, 26 Mar 2008 01:17:43 +0000 (09:17 +0800)
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>
arch/blackfin/kernel/traps.c

index 7557d0d..de249d6 100644 (file)
@@ -75,7 +75,7 @@ static void decode_address(char *buf, unsigned long address)
        struct task_struct *p;
        struct mm_struct *mm;
        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
        unsigned long symsize;
@@ -117,7 +117,7 @@ static void decode_address(char *buf, unsigned long address)
         */
        write_lock_irqsave(&tasklist_lock, flags);
        for_each_process(p) {
-               mm = (in_exception ? p->mm : get_task_mm(p));
+               mm = (in_atomic ? p->mm : get_task_mm(p));
                if (!mm)
                        continue;
 
@@ -146,14 +146,14 @@ static void decode_address(char *buf, unsigned long address)
 
                                sprintf(buf, "<0x%p> [ %s + 0x%lx ]",
                                        (void *)address, name, offset);
-                               if (!in_exception)
+                               if (!in_atomic)
                                        mmput(mm);
                                goto done;
                        }
 
                        vml = vml->next;
                }
-               if (!in_exception)
+               if (!in_atomic)
                        mmput(mm);
        }