diff options
author | Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com> | 2007-07-16 02:39:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-16 12:05:41 -0400 |
commit | 85653af7d488702165eba72c6c1dd0250fae4e70 (patch) | |
tree | f2e1340e3c19eda7c28b1c73c1f9f39c13e381a1 | |
parent | 647bd61a5f3a51a38c670f91af9d861ad66149a3 (diff) |
Fix stop_machine_run problem with naughty real time process
stop_machine_run() does its work on "kstopmachine" thread having max
priority. However that thread get such priority after woken up.
Therefore, in the following case ...
- "kstopmachine" try to run on CPU1
- There is a real time process which doesn't relinquish CPU time
voluntary on CPU1
... "kstopmachine" can't start to run and the CPU on which
stop_machine_run() is runing hangs up. To fix this problem, call
sched_setscheduler() before waking up that thread.
Signed-off-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: Gautham R Shenoy <ego@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | kernel/stop_machine.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index fcee2a8e6da3..319821ef78af 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
@@ -93,10 +93,6 @@ static void stopmachine_set_state(enum stopmachine_state state) | |||
93 | static int stop_machine(void) | 93 | static int stop_machine(void) |
94 | { | 94 | { |
95 | int i, ret = 0; | 95 | int i, ret = 0; |
96 | struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; | ||
97 | |||
98 | /* One high-prio thread per cpu. We'll do this one. */ | ||
99 | sched_setscheduler(current, SCHED_FIFO, ¶m); | ||
100 | 96 | ||
101 | atomic_set(&stopmachine_thread_ack, 0); | 97 | atomic_set(&stopmachine_thread_ack, 0); |
102 | stopmachine_num_threads = 0; | 98 | stopmachine_num_threads = 0; |
@@ -189,6 +185,10 @@ struct task_struct *__stop_machine_run(int (*fn)(void *), void *data, | |||
189 | 185 | ||
190 | p = kthread_create(do_stop, &smdata, "kstopmachine"); | 186 | p = kthread_create(do_stop, &smdata, "kstopmachine"); |
191 | if (!IS_ERR(p)) { | 187 | if (!IS_ERR(p)) { |
188 | struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; | ||
189 | |||
190 | /* One high-prio thread per cpu. We'll do this one. */ | ||
191 | sched_setscheduler(p, SCHED_FIFO, ¶m); | ||
192 | kthread_bind(p, cpu); | 192 | kthread_bind(p, cpu); |
193 | wake_up_process(p); | 193 | wake_up_process(p); |
194 | wait_for_completion(&smdata.done); | 194 | wait_for_completion(&smdata.done); |