From: Li S. <sha...@in...> - 2005-04-12 05:33:15
|
Hi, These patches (together with 5 patches followed this one) are updated suspend/resume SMP patches. The patches fixed some bugs and do clean up as suggested. Now they work for both suspend-to-ram and suspend-to-disk. Patches are against 2.6.12-rc2-mm3. Thanks, Shaohua --- Make SEP init per-cpu, so it is hotplug safed. Signed-off-by: Li Shaohua<sha...@in...> --- linux-2.6.11-root/arch/i386/kernel/smpboot.c | 6 ++++++ linux-2.6.11-root/arch/i386/kernel/sysenter.c | 12 +++++++----- linux-2.6.11-root/arch/i386/mach-voyager/voyager_smp.c | 4 ++++ linux-2.6.11-root/arch/i386/power/cpu.c | 4 +--- linux-2.6.11-root/include/asm-i386/smp.h | 3 +++ 5 files changed, 21 insertions(+), 8 deletions(-) diff -puN arch/i386/kernel/smpboot.c~sep_init_cleanup arch/i386/kernel/smpboot.c --- linux-2.6.11/arch/i386/kernel/smpboot.c~sep_init_cleanup 2005-04-12 10:36:00.164171464 +0800 +++ linux-2.6.11-root/arch/i386/kernel/smpboot.c 2005-04-12 10:36:00.174169944 +0800 @@ -443,6 +443,9 @@ static void __init start_secondary(void * the local TLBs too. */ local_flush_tlb(); + + /* Note: this must be done before __cpu_up finish */ + enable_sep_cpu(); cpu_set(smp_processor_id(), cpu_online_map); /* We can take interrupts now: we're officially "up". */ @@ -920,6 +923,9 @@ static void __init smp_boot_cpus(unsigne cpus_clear(cpu_core_map[0]); cpu_set(0, cpu_core_map[0]); + sysenter_setup(); + enable_sep_cpu(); + /* * If we couldn't find an SMP configuration at boot time, * get out of here now! diff -puN arch/i386/kernel/sysenter.c~sep_init_cleanup arch/i386/kernel/sysenter.c --- linux-2.6.11/arch/i386/kernel/sysenter.c~sep_init_cleanup 2005-04-12 10:36:00.165171312 +0800 +++ linux-2.6.11-root/arch/i386/kernel/sysenter.c 2005-04-12 10:36:00.174169944 +0800 @@ -21,11 +21,16 @@ extern asmlinkage void sysenter_entry(void); -void enable_sep_cpu(void *info) +void enable_sep_cpu(void) { int cpu = get_cpu(); struct tss_struct *tss = &per_cpu(init_tss, cpu); + if (!boot_cpu_has(X86_FEATURE_SEP)) { + put_cpu(); + return; + } + tss->ss1 = __KERNEL_CS; tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss; wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); @@ -41,7 +46,7 @@ void enable_sep_cpu(void *info) extern const char vsyscall_int80_start, vsyscall_int80_end; extern const char vsyscall_sysenter_start, vsyscall_sysenter_end; -static int __init sysenter_setup(void) +int __init sysenter_setup(void) { void *page = (void *)get_zeroed_page(GFP_ATOMIC); @@ -58,8 +63,5 @@ static int __init sysenter_setup(void) &vsyscall_sysenter_start, &vsyscall_sysenter_end - &vsyscall_sysenter_start); - on_each_cpu(enable_sep_cpu, NULL, 1, 1); return 0; } - -__initcall(sysenter_setup); diff -puN arch/i386/mach-voyager/voyager_smp.c~sep_init_cleanup arch/i386/mach-voyager/voyager_smp.c --- linux-2.6.11/arch/i386/mach-voyager/voyager_smp.c~sep_init_cleanup 2005-04-12 10:36:00.167171008 +0800 +++ linux-2.6.11-root/arch/i386/mach-voyager/voyager_smp.c 2005-04-12 10:36:00.175169792 +0800 @@ -499,6 +499,7 @@ start_secondary(void *unused) while (!cpu_isset(cpuid, smp_commenced_mask)) rep_nop(); local_irq_enable(); + enable_sep_cpu(); local_flush_tlb(); @@ -696,6 +697,9 @@ smp_boot_cpus(void) printk("CPU%d: ", boot_cpu_id); print_cpu_info(&cpu_data[boot_cpu_id]); + sysenter_setup(); + enable_sep_cpu(); + if(is_cpu_quad()) { /* booting on a Quad CPU */ printk("VOYAGER SMP: Boot CPU is Quad\n"); diff -puN arch/i386/power/cpu.c~sep_init_cleanup arch/i386/power/cpu.c --- linux-2.6.11/arch/i386/power/cpu.c~sep_init_cleanup 2005-04-12 10:36:00.168170856 +0800 +++ linux-2.6.11-root/arch/i386/power/cpu.c 2005-04-12 10:36:00.175169792 +0800 @@ -33,8 +33,6 @@ unsigned long saved_context_esp, saved_c unsigned long saved_context_esi, saved_context_edi; unsigned long saved_context_eflags; -extern void enable_sep_cpu(void *); - void __save_processor_state(struct saved_context *ctxt) { kernel_fpu_begin(); @@ -136,7 +134,7 @@ void __restore_processor_state(struct sa * sysenter MSRs */ if (boot_cpu_has(X86_FEATURE_SEP)) - enable_sep_cpu(NULL); + enable_sep_cpu(); fix_processor_context(); do_fpu_end(); diff -puN include/asm-i386/smp.h~sep_init_cleanup include/asm-i386/smp.h --- linux-2.6.11/include/asm-i386/smp.h~sep_init_cleanup 2005-04-12 10:36:00.170170552 +0800 +++ linux-2.6.11-root/include/asm-i386/smp.h 2005-04-12 10:36:00.176169640 +0800 @@ -37,6 +37,9 @@ extern int smp_num_siblings; extern cpumask_t cpu_sibling_map[]; extern cpumask_t cpu_core_map[]; +extern int sysenter_setup(void); +extern void enable_sep_cpu(void); + extern void smp_flush_tlb(void); extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); extern void smp_invalidate_rcv(void); /* Process an NMI */ _ |
From: Zwane M. <zw...@ar...> - 2005-04-12 12:05:42
|
Hello Shaohua, On Tue, 12 Apr 2005, Li Shaohua wrote: > These patches (together with 5 patches followed this one) are updated > suspend/resume SMP patches. The patches fixed some bugs and do clean up > as suggested. Now they work for both suspend-to-ram and suspend-to-disk. > Patches are against 2.6.12-rc2-mm3. These patches look good and i think we should go ahead with them. I've also cross checked with physical hotplug cpu patches for ES7xxx from Natalie (added to Cc) and it does indeed look like a lot of the code will work for her too, but i'd appreciate it if she also does a double check. Obviously this won't work for other upcoming users of hotplug cpu like Xen (Ryan added to Cc) but i think we can abstract things later on to cover other special users. Thanks Shaohua, Zwane |
From: Benoit B. <bbo...@gm...> - 2005-04-30 12:07:05
|
On 4/12/05, Li Shaohua <sha...@in...> wrote: > Hi, > These patches (together with 5 patches followed this one) are updated > suspend/resume SMP patches. The patches fixed some bugs and do clean up > as suggested. Now they work for both suspend-to-ram and suspend-to-disk. > Patches are against 2.6.12-rc2-mm3. >=20 > Thanks, > Shaohua >=20 > --- > Make SEP init per-cpu, so it is hotplug safed. >=20 > Signed-off-by: Li Shaohua<sha...@in...> >=20 > --- > +++ linux-2.6.11-root/arch/i386/power/cpu.c 2005-04-12 10:36:00.17516= 9792 +0800 > @@ -33,8 +33,6 @@ unsigned long saved_context_esp, saved_c > unsigned long saved_context_esi, saved_context_edi; > unsigned long saved_context_eflags; >=20 > -extern void enable_sep_cpu(void *); > - > void __save_processor_state(struct saved_context *ctxt) > { > kernel_fpu_begin(); > diff -puN include/asm-i386/smp.h~sep_init_cleanup include/asm-i386/smp.h > --- linux-2.6.11/include/asm-i386/smp.h~sep_init_cleanup 2005-04-1= 2 10:36:00.170170552 +0800 > +++ linux-2.6.11-root/include/asm-i386/smp.h 2005-04-12 10:36:00.17616= 9640 +0800 > @@ -37,6 +37,9 @@ extern int smp_num_siblings; > extern cpumask_t cpu_sibling_map[]; > extern cpumask_t cpu_core_map[]; >=20 > +extern int sysenter_setup(void); > +extern void enable_sep_cpu(void); > + > extern void smp_flush_tlb(void); > extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs)= ; > extern void smp_invalidate_rcv(void); /* Process an NMI */ > _ This change adds a warning when CONFIG_SMP is not set: arch/i386/power/cpu.c: In function '__restore_processor_state': arch/i386/power/cpu.c:137: warning: implicit declaration of function 'enable_sep_cpu' Maybe those functions should be defined somewhere else. regards, Benoit |