diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 11 | ||||
-rw-r--r-- | arch/i386/kernel/smpboot.c | 7 | ||||
-rw-r--r-- | arch/x86_64/kernel/smpboot.c | 6 |
3 files changed, 24 insertions, 0 deletions
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 0acfb6a5a220..02a2f39e5e0a 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -729,6 +729,17 @@ void mtrr_ap_init(void) | |||
729 | local_irq_restore(flags); | 729 | local_irq_restore(flags); |
730 | } | 730 | } |
731 | 731 | ||
732 | /** | ||
733 | * Save current fixed-range MTRR state of the BSP | ||
734 | */ | ||
735 | void mtrr_save_state(void) | ||
736 | { | ||
737 | if (smp_processor_id() == 0) | ||
738 | mtrr_save_fixed_ranges(NULL); | ||
739 | else | ||
740 | smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); | ||
741 | } | ||
742 | |||
732 | static int __init mtrr_init_finialize(void) | 743 | static int __init mtrr_init_finialize(void) |
733 | { | 744 | { |
734 | if (!mtrr_if) | 745 | if (!mtrr_if) |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index 7c1dbef399cd..f14d93351a82 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -58,6 +58,7 @@ | |||
58 | #include <mach_wakecpu.h> | 58 | #include <mach_wakecpu.h> |
59 | #include <smpboot_hooks.h> | 59 | #include <smpboot_hooks.h> |
60 | #include <asm/vmi.h> | 60 | #include <asm/vmi.h> |
61 | #include <asm/mtrr.h> | ||
61 | 62 | ||
62 | /* Set if we find a B stepping CPU */ | 63 | /* Set if we find a B stepping CPU */ |
63 | static int __devinitdata smp_b_stepping; | 64 | static int __devinitdata smp_b_stepping; |
@@ -815,6 +816,12 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu) | |||
815 | unsigned short nmi_high = 0, nmi_low = 0; | 816 | unsigned short nmi_high = 0, nmi_low = 0; |
816 | 817 | ||
817 | /* | 818 | /* |
819 | * Save current MTRR state in case it was changed since early boot | ||
820 | * (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: | ||
821 | */ | ||
822 | mtrr_save_state(); | ||
823 | |||
824 | /* | ||
818 | * We can't use kernel_thread since we must avoid to | 825 | * We can't use kernel_thread since we must avoid to |
819 | * reschedule the child. | 826 | * reschedule the child. |
820 | */ | 827 | */ |
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index 14724be48bec..ddc392bee243 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -944,6 +944,12 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
944 | return -ENOSYS; | 944 | return -ENOSYS; |
945 | } | 945 | } |
946 | 946 | ||
947 | /* | ||
948 | * Save current MTRR state in case it was changed since early boot | ||
949 | * (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: | ||
950 | */ | ||
951 | mtrr_save_state(); | ||
952 | |||
947 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; | 953 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
948 | /* Boot it! */ | 954 | /* Boot it! */ |
949 | err = do_boot_cpu(cpu, apicid); | 955 | err = do_boot_cpu(cpu, apicid); |