]> err.no Git - linux-2.6/blobdiff - arch/x86/kernel/tsc_64.c
xen: mask unwanted pte bits in __supported_pte_mask
[linux-2.6] / arch / x86 / kernel / tsc_64.c
index 01fc9f0c39e2031e403bbf2174eaeb18d24a483c..1784b8077a125e20bdc4bc38c85feca0ce01260f 100644 (file)
@@ -45,8 +45,8 @@ DEFINE_PER_CPU(unsigned long, cyc2ns);
 
 static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
 {
-       unsigned long flags, prev_scale, *scale;
        unsigned long long tsc_now, ns_now;
+       unsigned long flags, *scale;
 
        local_irq_save(flags);
        sched_clock_idle_sleep_event();
@@ -56,7 +56,6 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
        rdtscll(tsc_now);
        ns_now = __cycles_2_ns(tsc_now);
 
-       prev_scale = *scale;
        if (cpu_khz)
                *scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz;
 
@@ -149,9 +148,7 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
                        mark_tsc_unstable("cpufreq changes");
        }
 
-       preempt_disable();
-       set_cyc2ns_scale(tsc_khz_ref, smp_processor_id());
-       preempt_enable();
+       set_cyc2ns_scale(tsc_khz_ref, freq->cpu);
 
        return 0;
 }
@@ -230,14 +227,14 @@ void __init tsc_calibrate(void)
        /* hpet or pmtimer available ? */
        if (!hpet && !pm1 && !pm2) {
                printk(KERN_INFO "TSC calibrated against PIT\n");
-               return;
+               goto out;
        }
 
        /* Check, whether the sampling was disturbed by an SMI */
        if (tsc1 == ULONG_MAX || tsc2 == ULONG_MAX) {
                printk(KERN_WARNING "TSC calibration disturbed by SMI, "
                       "using PIT calibration result\n");
-               return;
+               goto out;
        }
 
        tsc2 = (tsc2 - tsc1) * 1000000L;
@@ -258,6 +255,7 @@ void __init tsc_calibrate(void)
 
        tsc_khz = tsc2 / tsc1;
 
+out:
        for_each_possible_cpu(cpu)
                set_cyc2ns_scale(tsc_khz, cpu);
 }