Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f9690982b8c2f9a2c65acdc113e758ec356676a3
Commit:     f9690982b8c2f9a2c65acdc113e758ec356676a3
Parent:     2ff2d3d74705d34ab71b21f54634fcf50d57bdd5
Author:     Ingo Molnar <[EMAIL PROTECTED]>
AuthorDate: Tue Feb 13 13:26:22 2007 +0100
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Tue Feb 13 13:26:22 2007 +0100

    [PATCH] i386: improve sched_clock() on i686
    
    Clean up sched_clock() on i686: it will use the TSC if available and falls
    back to jiffies only if the user asked for it to be disabled via notsc or
    the CPU calibration code didnt figure out the right cpu_khz.
    
    This generally makes the scheduler timestamps more finegrained, on all
    hardware.  (the current scheduler is pretty resistant against asynchronous
    sched_clock() values on different CPUs, it will allow at most up to a jiffy
    of jitter.)
    
    Also simplify sched_clock()'s check for TSC availability: propagate the
    desire and ability to use the TSC into the tsc_disable flag, previously
    this flag only indicated whether the notsc option was passed.  This makes
    the rare low-res sched_clock() codepath a single branch off a read-mostly
    flag.
    
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
---
 arch/i386/kernel/tsc.c  |   22 ++++++++++++++--------
 include/asm-i386/bugs.h |    2 +-
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/arch/i386/kernel/tsc.c b/arch/i386/kernel/tsc.c
index 12fef14..46f752a 100644
--- a/arch/i386/kernel/tsc.c
+++ b/arch/i386/kernel/tsc.c
@@ -112,13 +112,10 @@ unsigned long long sched_clock(void)
                return (*custom_sched_clock)();
 
        /*
-        * in the NUMA case we dont use the TSC as they are not
-        * synchronized across all CPUs.
+        * Fall back to jiffies if there's no TSC available:
         */
-#ifndef CONFIG_NUMA
-       if (!cpu_khz || check_tsc_unstable())
-#endif
-               /* no locking but a rare wrong value is not a big deal */
+       if (unlikely(tsc_disable))
+               /* No locking but a rare wrong value is not a big deal: */
                return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
 
        /* read the Time Stamp Counter: */
@@ -198,13 +195,13 @@ EXPORT_SYMBOL(recalibrate_cpu_khz);
 void __init tsc_init(void)
 {
        if (!cpu_has_tsc || tsc_disable)
-               return;
+               goto out_no_tsc;
 
        cpu_khz = calculate_cpu_khz();
        tsc_khz = cpu_khz;
 
        if (!cpu_khz)
-               return;
+               goto out_no_tsc;
 
        printk("Detected %lu.%03lu MHz processor.\n",
                                (unsigned long)cpu_khz / 1000,
@@ -212,6 +209,15 @@ void __init tsc_init(void)
 
        set_cyc2ns_scale(cpu_khz);
        use_tsc_delay();
+       return;
+
+out_no_tsc:
+       /*
+        * Set the tsc_disable flag if there's no TSC support, this
+        * makes it a fast flag for the kernel to see whether it
+        * should be using the TSC.
+        */
+       tsc_disable = 1;
 }
 
 #ifdef CONFIG_CPU_FREQ
diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h
index 38f1aeb..c90c7c4 100644
--- a/include/asm-i386/bugs.h
+++ b/include/asm-i386/bugs.h
@@ -160,7 +160,7 @@ static void __init check_config(void)
  * If we configured ourselves for a TSC, we'd better have one!
  */
 #ifdef CONFIG_X86_TSC
-       if (!cpu_has_tsc)
+       if (!cpu_has_tsc && !tsc_disable)
                panic("Kernel compiled for Pentium+, requires TSC feature!");
 #endif
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to