From: Andrew Morton Cc: Shaohua Li Cc: Pavel Machek Signed-off-by: Andrew Morton --- arch/i386/kernel/acpi/sleep.c | 3 +++ arch/i386/mm/init.c | 11 ++++++++++- arch/x86_64/kernel/acpi/sleep.c | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff -puN arch/i386/kernel/acpi/sleep.c~dont-use-flush_tlb_all-in-suspend-time-tidy arch/i386/kernel/acpi/sleep.c --- devel/arch/i386/kernel/acpi/sleep.c~dont-use-flush_tlb_all-in-suspend-time-tidy 2006-04-30 00:03:39.000000000 -0700 +++ devel-akpm/arch/i386/kernel/acpi/sleep.c 2006-04-30 00:03:39.000000000 -0700 @@ -8,6 +8,8 @@ #include #include #include +#include + #include #include @@ -29,6 +31,7 @@ static void init_low_mapping(pgd_t * pgd set_pgd(pgd, *(pgd + USER_PTRS_PER_PGD)); pgd_ofs++, pgd++; } + WARN_ON(num_online_cpus() != 1); local_flush_tlb(); } diff -puN arch/i386/mm/init.c~dont-use-flush_tlb_all-in-suspend-time-tidy arch/i386/mm/init.c --- devel/arch/i386/mm/init.c~dont-use-flush_tlb_all-in-suspend-time-tidy 2006-04-30 00:03:39.000000000 -0700 +++ devel-akpm/arch/i386/mm/init.c 2006-04-30 00:04:09.000000000 -0700 @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -420,7 +421,15 @@ void zap_low_mappings (void) #else set_pgd(swapper_pg_dir+i, __pgd(0)); #endif - if (cpus_weight(cpu_online_map) == 1) + /* + * We can be called at suspend/resume time, with local interrupts + * disabled. But flush_tlb_all() requires that local interrupts be + * enabled. + * + * Happily, the APs are not yet started, so we can use local_flush_tlb() + * in that case + */ + if (num_online_cpus() == 1) local_flush_tlb(); else flush_tlb_all(); diff -puN arch/x86_64/kernel/acpi/sleep.c~dont-use-flush_tlb_all-in-suspend-time-tidy arch/x86_64/kernel/acpi/sleep.c --- devel/arch/x86_64/kernel/acpi/sleep.c~dont-use-flush_tlb_all-in-suspend-time-tidy 2006-04-30 00:03:39.000000000 -0700 +++ devel-akpm/arch/x86_64/kernel/acpi/sleep.c 2006-04-30 00:03:39.000000000 -0700 @@ -35,6 +35,8 @@ #include #include #include +#include + #include #include #include @@ -66,6 +68,7 @@ static void init_low_mapping(void) pgd_t *slot0 = pgd_offset(current->mm, 0UL); low_ptr = *slot0; set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET)); + WARN_ON(num_online_cpus() != 1); local_flush_tlb(); } _