diff options
author | Oleg Nesterov <oleg@redhat.com> | 2015-11-15 14:33:14 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-11-23 03:48:18 -0500 |
commit | 6a19005157c464b47b2082f2617d12bc11198a0d (patch) | |
tree | 90b75567427d005de8b2032fe2005cd08153f40c | |
parent | 64038f292a1b33c7d46bd11f62f7798101152c00 (diff) |
stop_machine: Don't disable preemption in stop_two_cpus()
Now that stop_two_cpus() path does not check cpu_active() we can remove
preempt_disable(), it was only needed to ensure that stop_machine() can
not be called after we observe cpu_active() == T and before we queue the
new work.
Also, turn the pointless and confusing ->executed check into WARN_ON().
We know that both works must be executed, otherwise we have a bug. And
in fact I think that done->executed should die, see the next changes.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Tejun Heo <tj@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Milos Vyletel <milos@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20151115193314.GA8249@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | kernel/stop_machine.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index 1a66a9569915..17f01a9dc3df 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
@@ -258,7 +258,6 @@ int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void * | |||
258 | struct cpu_stop_work work1, work2; | 258 | struct cpu_stop_work work1, work2; |
259 | struct multi_stop_data msdata; | 259 | struct multi_stop_data msdata; |
260 | 260 | ||
261 | preempt_disable(); | ||
262 | msdata = (struct multi_stop_data){ | 261 | msdata = (struct multi_stop_data){ |
263 | .fn = fn, | 262 | .fn = fn, |
264 | .data = arg, | 263 | .data = arg, |
@@ -277,16 +276,12 @@ int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void * | |||
277 | 276 | ||
278 | if (cpu1 > cpu2) | 277 | if (cpu1 > cpu2) |
279 | swap(cpu1, cpu2); | 278 | swap(cpu1, cpu2); |
280 | if (cpu_stop_queue_two_works(cpu1, &work1, cpu2, &work2)) { | 279 | if (cpu_stop_queue_two_works(cpu1, &work1, cpu2, &work2)) |
281 | preempt_enable(); | ||
282 | return -ENOENT; | 280 | return -ENOENT; |
283 | } | ||
284 | |||
285 | preempt_enable(); | ||
286 | 281 | ||
287 | wait_for_completion(&done.completion); | 282 | wait_for_completion(&done.completion); |
288 | 283 | WARN_ON(!done.executed); | |
289 | return done.executed ? done.ret : -ENOENT; | 284 | return done.ret; |
290 | } | 285 | } |
291 | 286 | ||
292 | /** | 287 | /** |