]>
Commit | Line | Data |
---|---|---|
38498a67 TG |
1 | /* |
2 | * Common SMP CPU bringup/teardown functions | |
3 | */ | |
29d5e047 TG |
4 | #include <linux/err.h> |
5 | #include <linux/smp.h> | |
38498a67 | 6 | #include <linux/init.h> |
29d5e047 TG |
7 | #include <linux/sched.h> |
8 | #include <linux/percpu.h> | |
38498a67 TG |
9 | |
10 | #include "smpboot.h" | |
11 | ||
29d5e047 | 12 | #ifdef CONFIG_GENERIC_SMP_IDLE_THREAD |
29d5e047 TG |
13 | /* |
14 | * For the hotplug case we keep the task structs around and reuse | |
15 | * them. | |
16 | */ | |
17 | static DEFINE_PER_CPU(struct task_struct *, idle_threads); | |
18 | ||
3bb5d2ee | 19 | struct task_struct * __cpuinit idle_thread_get(unsigned int cpu) |
29d5e047 TG |
20 | { |
21 | struct task_struct *tsk = per_cpu(idle_threads, cpu); | |
22 | ||
23 | if (!tsk) | |
3bb5d2ee | 24 | return ERR_PTR(-ENOMEM); |
29d5e047 TG |
25 | init_idle(tsk, cpu); |
26 | return tsk; | |
27 | } | |
28 | ||
3bb5d2ee | 29 | void __init idle_thread_set_boot_cpu(void) |
29d5e047 | 30 | { |
3bb5d2ee | 31 | per_cpu(idle_threads, smp_processor_id()) = current; |
29d5e047 TG |
32 | } |
33 | ||
3bb5d2ee | 34 | static inline void idle_init(unsigned int cpu) |
29d5e047 | 35 | { |
3bb5d2ee SS |
36 | struct task_struct *tsk = per_cpu(idle_threads, cpu); |
37 | ||
38 | if (!tsk) { | |
39 | tsk = fork_idle(cpu); | |
40 | if (IS_ERR(tsk)) | |
41 | pr_err("SMP: fork_idle() failed for CPU %u\n", cpu); | |
42 | else | |
43 | per_cpu(idle_threads, cpu) = tsk; | |
44 | } | |
29d5e047 TG |
45 | } |
46 | ||
47 | /** | |
48 | * idle_thread_init - Initialize the idle thread for a cpu | |
49 | * @cpu: The cpu for which the idle thread should be initialized | |
50 | * | |
51 | * Creates the thread if it does not exist. | |
52 | */ | |
3bb5d2ee | 53 | void __init idle_threads_init(void) |
29d5e047 | 54 | { |
3bb5d2ee | 55 | unsigned int cpu; |
29d5e047 | 56 | |
3bb5d2ee SS |
57 | for_each_possible_cpu(cpu) { |
58 | if (cpu != smp_processor_id()) | |
59 | idle_init(cpu); | |
29d5e047 | 60 | } |
29d5e047 | 61 | } |
29d5e047 | 62 | #endif |