diff options
author | Andrew Morton <akpm@osdl.org> | 2006-07-03 20:32:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-04 00:25:20 -0400 |
commit | d8cb7c1ded6e5a80a7335716dde60784a0d51c1d (patch) | |
tree | e7c975ad049fa84549ef1c9fef45f9f96ccae829 /kernel | |
parent | 38c54ee8d5338f49aca986081ea41a987c15cf9d (diff) |
[PATCH] revert "kthread: convert stop_machine into a kthread"
Jiri reports that the stop_machin kthread conversion caused his machine to
hang when suspending. Hyperthreading is apparently involved.
I don't see why that would be and I can't reproduce it. Revert to the 2.6.17
code.
Cc: "Serge E. Hallyn" <serue@us.ibm.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/stop_machine.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index 2c0aacc37c55..dcfb5d731466 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c | |||
@@ -4,7 +4,6 @@ | |||
4 | #include <linux/cpu.h> | 4 | #include <linux/cpu.h> |
5 | #include <linux/err.h> | 5 | #include <linux/err.h> |
6 | #include <linux/syscalls.h> | 6 | #include <linux/syscalls.h> |
7 | #include <linux/kthread.h> | ||
8 | #include <asm/atomic.h> | 7 | #include <asm/atomic.h> |
9 | #include <asm/semaphore.h> | 8 | #include <asm/semaphore.h> |
10 | #include <asm/uaccess.h> | 9 | #include <asm/uaccess.h> |
@@ -26,11 +25,13 @@ static unsigned int stopmachine_num_threads; | |||
26 | static atomic_t stopmachine_thread_ack; | 25 | static atomic_t stopmachine_thread_ack; |
27 | static DECLARE_MUTEX(stopmachine_mutex); | 26 | static DECLARE_MUTEX(stopmachine_mutex); |
28 | 27 | ||
29 | static int stopmachine(void *unused) | 28 | static int stopmachine(void *cpu) |
30 | { | 29 | { |
31 | int irqs_disabled = 0; | 30 | int irqs_disabled = 0; |
32 | int prepared = 0; | 31 | int prepared = 0; |
33 | 32 | ||
33 | set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu)); | ||
34 | |||
34 | /* Ack: we are alive */ | 35 | /* Ack: we are alive */ |
35 | smp_mb(); /* Theoretically the ack = 0 might not be on this CPU yet. */ | 36 | smp_mb(); /* Theoretically the ack = 0 might not be on this CPU yet. */ |
36 | atomic_inc(&stopmachine_thread_ack); | 37 | atomic_inc(&stopmachine_thread_ack); |
@@ -84,8 +85,7 @@ static void stopmachine_set_state(enum stopmachine_state state) | |||
84 | 85 | ||
85 | static int stop_machine(void) | 86 | static int stop_machine(void) |
86 | { | 87 | { |
87 | int ret = 0; | 88 | int i, ret = 0; |
88 | unsigned int i; | ||
89 | struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; | 89 | struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; |
90 | 90 | ||
91 | /* One high-prio thread per cpu. We'll do this one. */ | 91 | /* One high-prio thread per cpu. We'll do this one. */ |
@@ -96,16 +96,11 @@ static int stop_machine(void) | |||
96 | stopmachine_state = STOPMACHINE_WAIT; | 96 | stopmachine_state = STOPMACHINE_WAIT; |
97 | 97 | ||
98 | for_each_online_cpu(i) { | 98 | for_each_online_cpu(i) { |
99 | struct task_struct *tsk; | ||
100 | if (i == raw_smp_processor_id()) | 99 | if (i == raw_smp_processor_id()) |
101 | continue; | 100 | continue; |
102 | tsk = kthread_create(stopmachine, NULL, "stopmachine"); | 101 | ret = kernel_thread(stopmachine, (void *)(long)i,CLONE_KERNEL); |
103 | if (IS_ERR(tsk)) { | 102 | if (ret < 0) |
104 | ret = PTR_ERR(tsk); | ||
105 | break; | 103 | break; |
106 | } | ||
107 | kthread_bind(tsk, i); | ||
108 | wake_up_process(tsk); | ||
109 | stopmachine_num_threads++; | 104 | stopmachine_num_threads++; |
110 | } | 105 | } |
111 | 106 | ||