]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/x86/kernel/tsc.c
Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mv-sheeva.git] / arch / x86 / kernel / tsc.c
index 3e1c057e98fe039325eed2056d8960fa52f023c4..6e1a368d21d4d9214feda8eb6fcabe9c043708e1 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/delay.h>
 #include <linux/clocksource.h>
 #include <linux/percpu.h>
+#include <linux/timex.h>
 
 #include <asm/hpet.h>
 #include <asm/timer.h>
@@ -589,22 +590,26 @@ EXPORT_SYMBOL(recalibrate_cpu_khz);
  */
 
 DEFINE_PER_CPU(unsigned long, cyc2ns);
+DEFINE_PER_CPU(unsigned long long, cyc2ns_offset);
 
 static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
 {
-       unsigned long long tsc_now, ns_now;
+       unsigned long long tsc_now, ns_now, *offset;
        unsigned long flags, *scale;
 
        local_irq_save(flags);
        sched_clock_idle_sleep_event();
 
        scale = &per_cpu(cyc2ns, cpu);
+       offset = &per_cpu(cyc2ns_offset, cpu);
 
        rdtscll(tsc_now);
        ns_now = __cycles_2_ns(tsc_now);
 
-       if (cpu_khz)
+       if (cpu_khz) {
                *scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz;
+               *offset = ns_now - (tsc_now * *scale >> CYC2NS_SCALE_FACTOR);
+       }
 
        sched_clock_idle_wakeup_event(0);
        local_irq_restore(flags);
@@ -631,17 +636,15 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
                                void *data)
 {
        struct cpufreq_freqs *freq = data;
-       unsigned long *lpj, dummy;
+       unsigned long *lpj;
 
        if (cpu_has(&cpu_data(freq->cpu), X86_FEATURE_CONSTANT_TSC))
                return 0;
 
-       lpj = &dummy;
-       if (!(freq->flags & CPUFREQ_CONST_LOOPS))
+       lpj = &boot_cpu_data.loops_per_jiffy;
 #ifdef CONFIG_SMP
+       if (!(freq->flags & CPUFREQ_CONST_LOOPS))
                lpj = &cpu_data(freq->cpu).loops_per_jiffy;
-#else
-       lpj = &boot_cpu_data.loops_per_jiffy;
 #endif
 
        if (!ref_freq) {