diff options
author | Suresh Siddha <suresh.b.siddha@intel.com> | 2012-04-20 20:08:50 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2012-05-03 13:32:34 -0400 |
commit | 3bb5d2ee396aabaa4e318f17e94d13e2ee0e5a88 (patch) | |
tree | 723fd419cbbc6874b3303d11a439303f3c4ff46c /kernel/cpu.c | |
parent | 9a1347237492f273f84ec39962b5806c70b2806a (diff) |
smp, idle: Allocate idle thread for each possible cpu during boot
percpu areas are already allocated during boot for each possible cpu.
percpu idle threads can be considered as an extension of the percpu areas,
and allocate them for each possible cpu during boot.
This will eliminate the need for workqueue based idle thread allocation.
In future we can move the idle thread area into the percpu area too.
[ tglx: Moved the loop into smpboot.c and added an error check when
the init code failed to allocate an idle thread for a cpu which
should be onlined ]
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: venki@google.com
Link: http://lkml.kernel.org/r/1334966930.28674.245.camel@sbsiddha-desk.sc.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r-- | kernel/cpu.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 05c46bae5e55..0e6353cf147a 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -297,15 +297,18 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) | |||
297 | int ret, nr_calls = 0; | 297 | int ret, nr_calls = 0; |
298 | void *hcpu = (void *)(long)cpu; | 298 | void *hcpu = (void *)(long)cpu; |
299 | unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0; | 299 | unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0; |
300 | struct task_struct *idle; | ||
300 | 301 | ||
301 | if (cpu_online(cpu) || !cpu_present(cpu)) | 302 | if (cpu_online(cpu) || !cpu_present(cpu)) |
302 | return -EINVAL; | 303 | return -EINVAL; |
303 | 304 | ||
304 | cpu_hotplug_begin(); | 305 | cpu_hotplug_begin(); |
305 | 306 | ||
306 | ret = smpboot_prepare(cpu); | 307 | idle = idle_thread_get(cpu); |
307 | if (ret) | 308 | if (IS_ERR(idle)) { |
309 | ret = PTR_ERR(idle); | ||
308 | goto out; | 310 | goto out; |
311 | } | ||
309 | 312 | ||
310 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); | 313 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); |
311 | if (ret) { | 314 | if (ret) { |
@@ -316,7 +319,7 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) | |||
316 | } | 319 | } |
317 | 320 | ||
318 | /* Arch-specific enabling code. */ | 321 | /* Arch-specific enabling code. */ |
319 | ret = __cpu_up(cpu, idle_thread_get(cpu)); | 322 | ret = __cpu_up(cpu, idle); |
320 | if (ret != 0) | 323 | if (ret != 0) |
321 | goto out_notify; | 324 | goto out_notify; |
322 | BUG_ON(!cpu_online(cpu)); | 325 | BUG_ON(!cpu_online(cpu)); |