diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-08-09 12:12:52 +0200 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-08-09 12:12:52 +0200 |
| commit | d0ed4c60abfb9a4ab6cd416d1dea9df6266f8fc7 (patch) | |
| tree | 8fd3af1a9e788333e85d2a51a4fc2a9858a9a95a /kernel/stop_machine.c | |
| parent | 72a361a5b91c77b33ab2533674fdcec4de3278d0 (diff) | |
| parent | aba941392aeef2d1bc064a1e4b09293473ef7b9b (diff) | |
Merge branch 'acpi-scan' to satisfy dependencies.
Diffstat (limited to 'kernel/stop_machine.c')
| -rw-r--r-- | kernel/stop_machine.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index f89014a2c238..e190d1ef3a23 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c @@ -260,6 +260,15 @@ retry: err = 0; __cpu_stop_queue_work(stopper1, work1, &wakeq); __cpu_stop_queue_work(stopper2, work2, &wakeq); + /* + * The waking up of stopper threads has to happen + * in the same scheduling context as the queueing. + * Otherwise, there is a possibility of one of the + * above stoppers being woken up by another CPU, + * and preempting us. This will cause us to n ot + * wake up the other stopper forever. + */ + preempt_disable(); unlock: raw_spin_unlock(&stopper2->lock); raw_spin_unlock_irq(&stopper1->lock); @@ -270,7 +279,10 @@ unlock: goto retry; } - wake_up_q(&wakeq); + if (!err) { + wake_up_q(&wakeq); + preempt_enable(); + } return err; } |
