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>
        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;
         */
        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;
 
 
                                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);
        }