Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=85653af7d488702165eba72c6c1dd0250fae4e70
Commit:     85653af7d488702165eba72c6c1dd0250fae4e70
Parent:     647bd61a5f3a51a38c670f91af9d861ad66149a3
Author:     Satoru Takeuchi <[EMAIL PROTECTED]>
AuthorDate: Sun Jul 15 23:39:47 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Mon Jul 16 09:05:41 2007 -0700

    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 <[EMAIL PROTECTED]>
    Cc: Rusty Russell <[EMAIL PROTECTED]>
    Cc: Ingo Molnar <[EMAIL PROTECTED]>
    Cc: Oleg Nesterov <[EMAIL PROTECTED]>
    Cc: Ashok Raj <[EMAIL PROTECTED]>
    Cc: Gautham R Shenoy <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 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 fcee2a8..319821e 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -93,10 +93,6 @@ static void stopmachine_set_state(enum stopmachine_state 
state)
 static int stop_machine(void)
 {
        int i, ret = 0;
-       struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
-
-       /* One high-prio thread per cpu.  We'll do this one. */
-       sched_setscheduler(current, SCHED_FIFO, &param);
 
        atomic_set(&stopmachine_thread_ack, 0);
        stopmachine_num_threads = 0;
@@ -189,6 +185,10 @@ struct task_struct *__stop_machine_run(int (*fn)(void *), 
void *data,
 
        p = kthread_create(do_stop, &smdata, "kstopmachine");
        if (!IS_ERR(p)) {
+               struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+
+               /* One high-prio thread per cpu.  We'll do this one. */
+               sched_setscheduler(p, SCHED_FIFO, &param);
                kthread_bind(p, cpu);
                wake_up_process(p);
                wait_for_completion(&smdata.done);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to