aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cpu.c
diff options
context:
space:
mode:
authorSuresh Siddha <suresh.b.siddha@intel.com>2012-04-20 20:08:50 -0400
committerThomas Gleixner <tglx@linutronix.de>2012-05-03 13:32:34 -0400
commit3bb5d2ee396aabaa4e318f17e94d13e2ee0e5a88 (patch)
tree723fd419cbbc6874b3303d11a439303f3c4ff46c /kernel/cpu.c
parent9a1347237492f273f84ec39962b5806c70b2806a (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.c9
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));