diff options
Diffstat (limited to 'kernel/smp.c')
| -rw-r--r-- | kernel/smp.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/smp.c b/kernel/smp.c index 2f8b10ecf759..d0ae5b24875e 100644 --- a/kernel/smp.c +++ b/kernel/smp.c | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
| 14 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
| 15 | 15 | ||
| 16 | #include "smpboot.h" | ||
| 17 | |||
| 16 | #ifdef CONFIG_USE_GENERIC_SMP_HELPERS | 18 | #ifdef CONFIG_USE_GENERIC_SMP_HELPERS |
| 17 | static struct { | 19 | static struct { |
| 18 | struct list_head queue; | 20 | struct list_head queue; |
| @@ -669,6 +671,8 @@ void __init smp_init(void) | |||
| 669 | { | 671 | { |
| 670 | unsigned int cpu; | 672 | unsigned int cpu; |
| 671 | 673 | ||
| 674 | idle_threads_init(); | ||
| 675 | |||
| 672 | /* FIXME: This should be done in userspace --RR */ | 676 | /* FIXME: This should be done in userspace --RR */ |
| 673 | for_each_present_cpu(cpu) { | 677 | for_each_present_cpu(cpu) { |
| 674 | if (num_online_cpus() >= setup_max_cpus) | 678 | if (num_online_cpus() >= setup_max_cpus) |
| @@ -791,3 +795,26 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), | |||
| 791 | } | 795 | } |
| 792 | } | 796 | } |
| 793 | EXPORT_SYMBOL(on_each_cpu_cond); | 797 | EXPORT_SYMBOL(on_each_cpu_cond); |
| 798 | |||
| 799 | static void do_nothing(void *unused) | ||
| 800 | { | ||
| 801 | } | ||
| 802 | |||
| 803 | /** | ||
| 804 | * kick_all_cpus_sync - Force all cpus out of idle | ||
| 805 | * | ||
| 806 | * Used to synchronize the update of pm_idle function pointer. It's | ||
| 807 | * called after the pointer is updated and returns after the dummy | ||
| 808 | * callback function has been executed on all cpus. The execution of | ||
| 809 | * the function can only happen on the remote cpus after they have | ||
| 810 | * left the idle function which had been called via pm_idle function | ||
| 811 | * pointer. So it's guaranteed that nothing uses the previous pointer | ||
| 812 | * anymore. | ||
| 813 | */ | ||
| 814 | void kick_all_cpus_sync(void) | ||
| 815 | { | ||
| 816 | /* Make sure the change is visible before we kick the cpus */ | ||
| 817 | smp_mb(); | ||
| 818 | smp_call_function(do_nothing, NULL, 1); | ||
| 819 | } | ||
| 820 | EXPORT_SYMBOL_GPL(kick_all_cpus_sync); | ||
