]> 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 7202b98aac4f2f53516e421ef935545538e5466a..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);
 
        /*
@@ -639,7 +643,7 @@ static struct sysdev_driver mtrr_sysdev_driver = {
  * initialized (i.e. before smp_init()).
  * 
  */
-void mtrr_bp_init(void)
+void __init mtrr_bp_init(void)
 {
        init_ifs();