]> err.no Git - linux-2.6/blobdiff - arch/i386/kernel/cpu/mtrr/main.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[linux-2.6] / arch / i386 / kernel / cpu / mtrr / main.c
index 0acfb6a5a220839deeba89f0f1766cf703c94332..c48b6fea5ab4edd5fb53133fc03de2309f2e80af 100644 (file)
@@ -229,6 +229,8 @@ static void set_mtrr(unsigned int reg, unsigned long base,
        data.smp_size = size;
        data.smp_type = type;
        atomic_set(&data.count, num_booting_cpus() - 1);
+       /* make sure data.count is visible before unleashing other CPUs */
+       smp_wmb();
        atomic_set(&data.gate,0);
 
        /*  Start the ball rolling on other CPUs  */
@@ -242,6 +244,7 @@ static void set_mtrr(unsigned int reg, unsigned long base,
 
        /* ok, reset count and toggle gate */
        atomic_set(&data.count, num_booting_cpus() - 1);
+       smp_wmb();
        atomic_set(&data.gate,1);
 
        /* do our MTRR business */
@@ -260,6 +263,7 @@ static void set_mtrr(unsigned int reg, unsigned long base,
                cpu_relax();
 
        atomic_set(&data.count, num_booting_cpus() - 1);
+       smp_wmb();
        atomic_set(&data.gate,0);
 
        /*
@@ -729,6 +733,20 @@ void mtrr_ap_init(void)
        local_irq_restore(flags);
 }
 
+/**
+ * Save current fixed-range MTRR state of the BSP
+ */
+void mtrr_save_state(void)
+{
+       int cpu = get_cpu();
+
+       if (cpu == 0)
+               mtrr_save_fixed_ranges(NULL);
+       else
+               smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1);
+       put_cpu();
+}
+
 static int __init mtrr_init_finialize(void)
 {
        if (!mtrr_if)