diff options
Diffstat (limited to 'arch/blackfin/kernel/trace.c')
| -rw-r--r-- | arch/blackfin/kernel/trace.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/arch/blackfin/kernel/trace.c b/arch/blackfin/kernel/trace.c index 44bbf2f564cb..f7f7a18abca9 100644 --- a/arch/blackfin/kernel/trace.c +++ b/arch/blackfin/kernel/trace.c | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | #include <linux/hardirq.h> | 10 | #include <linux/hardirq.h> |
| 11 | #include <linux/thread_info.h> | 11 | #include <linux/thread_info.h> |
| 12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 13 | #include <linux/oom.h> | ||
| 14 | #include <linux/sched.h> | ||
| 13 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
| 14 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 15 | #include <linux/kallsyms.h> | 17 | #include <linux/kallsyms.h> |
| @@ -27,8 +29,7 @@ void decode_address(char *buf, unsigned long address) | |||
| 27 | { | 29 | { |
| 28 | struct task_struct *p; | 30 | struct task_struct *p; |
| 29 | struct mm_struct *mm; | 31 | struct mm_struct *mm; |
| 30 | unsigned long flags, offset; | 32 | unsigned long offset; |
| 31 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); | ||
| 32 | struct rb_node *n; | 33 | struct rb_node *n; |
| 33 | 34 | ||
| 34 | #ifdef CONFIG_KALLSYMS | 35 | #ifdef CONFIG_KALLSYMS |
| @@ -112,17 +113,17 @@ void decode_address(char *buf, unsigned long address) | |||
| 112 | * mappings of all our processes and see if we can't be a whee | 113 | * mappings of all our processes and see if we can't be a whee |
| 113 | * bit more specific | 114 | * bit more specific |
| 114 | */ | 115 | */ |
| 115 | write_lock_irqsave(&tasklist_lock, flags); | 116 | read_lock(&tasklist_lock); |
| 116 | for_each_process(p) { | 117 | for_each_process(p) { |
| 117 | mm = (in_atomic ? p->mm : get_task_mm(p)); | 118 | struct task_struct *t; |
| 118 | if (!mm) | ||
| 119 | continue; | ||
| 120 | 119 | ||
| 121 | if (!down_read_trylock(&mm->mmap_sem)) { | 120 | t = find_lock_task_mm(p); |
| 122 | if (!in_atomic) | 121 | if (!t) |
| 123 | mmput(mm); | ||
| 124 | continue; | 122 | continue; |
| 125 | } | 123 | |
| 124 | mm = t->mm; | ||
| 125 | if (!down_read_trylock(&mm->mmap_sem)) | ||
| 126 | goto __continue; | ||
| 126 | 127 | ||
| 127 | for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { | 128 | for (n = rb_first(&mm->mm_rb); n; n = rb_next(n)) { |
| 128 | struct vm_area_struct *vma; | 129 | struct vm_area_struct *vma; |
| @@ -131,7 +132,7 @@ void decode_address(char *buf, unsigned long address) | |||
| 131 | 132 | ||
| 132 | if (address >= vma->vm_start && address < vma->vm_end) { | 133 | if (address >= vma->vm_start && address < vma->vm_end) { |
| 133 | char _tmpbuf[256]; | 134 | char _tmpbuf[256]; |
| 134 | char *name = p->comm; | 135 | char *name = t->comm; |
| 135 | struct file *file = vma->vm_file; | 136 | struct file *file = vma->vm_file; |
| 136 | 137 | ||
| 137 | if (file) { | 138 | if (file) { |
| @@ -164,8 +165,7 @@ void decode_address(char *buf, unsigned long address) | |||
| 164 | name, vma->vm_start, vma->vm_end); | 165 | name, vma->vm_start, vma->vm_end); |
| 165 | 166 | ||
| 166 | up_read(&mm->mmap_sem); | 167 | up_read(&mm->mmap_sem); |
| 167 | if (!in_atomic) | 168 | task_unlock(t); |
| 168 | mmput(mm); | ||
| 169 | 169 | ||
| 170 | if (buf[0] == '\0') | 170 | if (buf[0] == '\0') |
| 171 | sprintf(buf, "[ %s ] dynamic memory", name); | 171 | sprintf(buf, "[ %s ] dynamic memory", name); |
| @@ -175,8 +175,8 @@ void decode_address(char *buf, unsigned long address) | |||
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | up_read(&mm->mmap_sem); | 177 | up_read(&mm->mmap_sem); |
| 178 | if (!in_atomic) | 178 | __continue: |
| 179 | mmput(mm); | 179 | task_unlock(t); |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | /* | 182 | /* |
| @@ -186,7 +186,7 @@ void decode_address(char *buf, unsigned long address) | |||
| 186 | sprintf(buf, "/* kernel dynamic memory */"); | 186 | sprintf(buf, "/* kernel dynamic memory */"); |
| 187 | 187 | ||
| 188 | done: | 188 | done: |
| 189 | write_unlock_irqrestore(&tasklist_lock, flags); | 189 | read_unlock(&tasklist_lock); |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | #define EXPAND_LEN ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 256 - 1) | 192 | #define EXPAND_LEN ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN) * 256 - 1) |
