diff options
author | Amit K. Arora <aarora@linux.vnet.ibm.com> | 2010-05-25 09:23:46 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-05-31 02:37:44 -0400 |
commit | 54e88fad223c4e1d94289611a90c7fe3ebe5631b (patch) | |
tree | c9c9f27bf4e1e9851ee75145960607f194b3313b | |
parent | 67a3e12b05e055c0415c556a315a3d3eb637e29e (diff) |
sched: Make sure timers have migrated before killing the migration_thread
Problem: In a stress test where some heavy tests were running along with
regular CPU offlining and onlining, a hang was observed. The system seems
to be hung at a point where migration_call() tries to kill the
migration_thread of the dying CPU, which just got moved to the current
CPU. This migration thread does not get a chance to run (and die) since
rt_throttled is set to 1 on current, and it doesn't get cleared as the
hrtimer which is supposed to reset the rt bandwidth
(sched_rt_period_timer) is tied to the CPU which we just marked dead!
Solution: This patch pushes the killing of migration thread to
"CPU_POST_DEAD" event. By then all the timers (including
sched_rt_period_timer) should have got migrated (along with other
callbacks).
Signed-off-by: Amit Arora <aarora@in.ibm.com>
Signed-off-by: Gautham R Shenoy <ego@in.ibm.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <20100525132346.GA14986@amitarora.in.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | kernel/stop_machine.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index b4e7431e7c78..70f8d90331e9 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
@@ -321,7 +321,7 @@ static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb, | |||
321 | 321 | ||
322 | #ifdef CONFIG_HOTPLUG_CPU | 322 | #ifdef CONFIG_HOTPLUG_CPU |
323 | case CPU_UP_CANCELED: | 323 | case CPU_UP_CANCELED: |
324 | case CPU_DEAD: | 324 | case CPU_POST_DEAD: |
325 | { | 325 | { |
326 | struct cpu_stop_work *work; | 326 | struct cpu_stop_work *work; |
327 | 327 | ||