x86/alternatives changes for v2.6.38
Subsystems (2)
Linus,
Please pull the latest x86-alternatives-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git x86-alternatives-for-linus
out-of-topic modifications in x86-alternatives-for-linus:
---------------------------------------------------------kernel/cpu.c # 3fb82d5: x86, suspend: Avoid unnecessary s
Thanks,
Ingo
------------------>
Suresh Siddha (1):
x86, suspend: Avoid unnecessary smp alternatives switch during suspend/resume
arch/x86/include/asm/alternative.h | 1 + arch/x86/kernel/alternative.c | 3 ++- arch/x86/kernel/smpboot.c | 14 ++++++++++++++ kernel/cpu.c | 11 +++++++++++ 4 files changed, 28 insertions(+), 1 deletions(-)
arch/x86/include/asm/alternative.h +1 -0
@@ -66,6 +66,7 @@ extern void alternatives_smp_module_add(struct module *mod, char *name,extern void alternatives_smp_module_del (struct module *mod);extern void alternatives_smp_switch (int smp);extern int alternatives_text_reserved (void *start,void *end); +extern bool skip_smp_alternatives;#else static inline void alternatives_smp_module_add(struct module *mod, char *name, void *locks, void *locks_end,
arch/x86/kernel/alternative.c +2 -1
@@ -353,6 +353,7 @@ void __init_or_module alternatives_smp_module_del(struct module *mod)mutex_unlock (&smp_alt); } +bool skip_smp_alternatives;void alternatives_smp_switch (int smp) {struct smp_alt_module *mod;
@@ -368,7 +369,7 @@ void alternatives_smp_switch(int smp)printk ("lockdep: fixing up alternatives.\n" );#endif -if (noreplace_smp || smp_alt_once) +if (noreplace_smp || smp_alt_once || skip_smp_alternatives)return ;BUG_ON (!smp && (num_online_cpus () >1 ));
arch/x86/kernel/smpboot.c +14 -0
@@ -1166,6 +1166,20 @@ out:preempt_enable (); } +void arch_disable_nonboot_cpus_begin (void ) +{ +/* +* Avoid the smp alternatives switch during the disable_nonboot_cpus(). +* In the suspend path, we will be back in the SMP mode shortly anyways. +*/ + skip_smp_alternatives = true; +} + +void arch_disable_nonboot_cpus_end (void ) +{ + skip_smp_alternatives = false; +} +void arch_enable_nonboot_cpus_begin (void ) {set_mtrr_aps_delayed_init ();
kernel/cpu.c +11 -0
@@ -386,6 +386,14 @@ out:#ifdef CONFIG_PM_SLEEP_SMP static cpumask_var_t frozen_cpus; +void __weak arch_disable_nonboot_cpus_begin (void ) +{ +} + +void __weak arch_disable_nonboot_cpus_end (void ) +{ +} +int disable_nonboot_cpus (void ) {int cpu, first_cpu, error =0 ;
@@ -397,6 +405,7 @@ int disable_nonboot_cpus(void)* with the userspace trying to use the CPU hotplug at the same time */ cpumask_clear (frozen_cpus); +arch_disable_nonboot_cpus_begin ();printk ("Disabling non-boot CPUs ...\n" );for_each_online_cpu (cpu) {
@@ -412,6 +421,8 @@ int disable_nonboot_cpus(void) } } +arch_disable_nonboot_cpus_end (); +if (!error) {BUG_ON (num_online_cpus () >1 );/* Make sure the CPUs won't be enabled by someone else */