diff options
author | Anton Vorontsov <anton.vorontsov@linaro.org> | 2012-05-31 19:26:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-31 20:49:30 -0400 |
commit | 1198c8b9af611bb697d92259095d7cc20f5c961d (patch) | |
tree | bfb72d1ba5f362aca38cf09857e3d9fcc05dd60a | |
parent | 73863ab028579ed98c4f1f36d016536b1b415344 (diff) |
sh: use clear_tasks_mm_cpumask()
Checking for process->mm is not enough because process' main thread may
exit or detach its mm via use_mm(), but other threads may still have a
valid mm.
To fix this we would need to use find_lock_task_mm(), which would walk up
all threads and returns an appropriate task (with task lock held).
clear_tasks_mm_cpumask() has the issue fixed, so let's use it.
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/sh/kernel/smp.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index b86e9ca79455..2062aa88af41 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -123,7 +123,6 @@ void native_play_dead(void) | |||
123 | int __cpu_disable(void) | 123 | int __cpu_disable(void) |
124 | { | 124 | { |
125 | unsigned int cpu = smp_processor_id(); | 125 | unsigned int cpu = smp_processor_id(); |
126 | struct task_struct *p; | ||
127 | int ret; | 126 | int ret; |
128 | 127 | ||
129 | ret = mp_ops->cpu_disable(cpu); | 128 | ret = mp_ops->cpu_disable(cpu); |
@@ -153,11 +152,7 @@ int __cpu_disable(void) | |||
153 | flush_cache_all(); | 152 | flush_cache_all(); |
154 | local_flush_tlb_all(); | 153 | local_flush_tlb_all(); |
155 | 154 | ||
156 | read_lock(&tasklist_lock); | 155 | clear_tasks_mm_cpumask(cpu); |
157 | for_each_process(p) | ||
158 | if (p->mm) | ||
159 | cpumask_clear_cpu(cpu, mm_cpumask(p->mm)); | ||
160 | read_unlock(&tasklist_lock); | ||
161 | 156 | ||
162 | return 0; | 157 | return 0; |
163 | } | 158 | } |