When I-pipe is active, local_irq_save will still allow hardware
interrupts to occur, potentially disturbing the sensitive TSC
calibration.

Signed-off-by: Jan Kiszka <[email protected]>
---

The kernel applies some sanity checks on the results, but they allow up
to 10% jitter. And this variation of the TSC frequency has been seen
in the field, causing problems when synchronizing with external clocks.

 arch/x86/kernel/tsc.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 23f74eb..42c6c8a 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -409,9 +409,9 @@ unsigned long native_calibrate_tsc(void)
        unsigned long flags, latch, ms, fast_calibrate;
        int hpet = is_hpet_enabled(), i, loopmin;
 
-       local_irq_save(flags);
+       local_irq_save_hw(flags);
        fast_calibrate = quick_pit_calibrate();
-       local_irq_restore(flags);
+       local_irq_restore_hw(flags);
        if (fast_calibrate)
                return fast_calibrate;
 
@@ -454,11 +454,11 @@ unsigned long native_calibrate_tsc(void)
                 * calibration, which will take at least 50ms, and
                 * read the end value.
                 */
-               local_irq_save(flags);
+               local_irq_save_hw(flags);
                tsc1 = tsc_read_refs(&ref1, hpet);
                tsc_pit_khz = pit_calibrate_tsc(latch, ms, loopmin);
                tsc2 = tsc_read_refs(&ref2, hpet);
-               local_irq_restore(flags);
+               local_irq_restore_hw(flags);
 
                /* Pick the lowest PIT TSC calibration so far */
                tsc_pit_min = min(tsc_pit_min, tsc_pit_khz);
-- 
1.7.1

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to