powerpc/64: irq replay remove decrementer overflow check
[linux-2.6-microblaze.git] / arch / powerpc / kernel / time.c
index 74efe46..5f9c323 100644 (file)
@@ -82,6 +82,7 @@ static struct clocksource clocksource_timebase = {
        .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
        .mask         = CLOCKSOURCE_MASK(64),
        .read         = timebase_read,
+       .vdso_clock_mode        = VDSO_CLOCKMODE_ARCHTIMER,
 };
 
 #define DECREMENTER_DEFAULT_MAX 0x7FFFFFFF
@@ -552,14 +553,11 @@ void timer_interrupt(struct pt_regs *regs)
        struct pt_regs *old_regs;
        u64 now;
 
-       /* Some implementations of hotplug will get timer interrupts while
-        * offline, just ignore these and we also need to set
-        * decrementers_next_tb as MAX to make sure __check_irq_replay
-        * don't replay timer interrupt when return, otherwise we'll trap
-        * here infinitely :(
+       /*
+        * Some implementations of hotplug will get timer interrupts while
+        * offline, just ignore these.
         */
        if (unlikely(!cpu_online(smp_processor_id()))) {
-               *next_tb = ~(u64)0;
                set_dec(decrementer_max);
                return;
        }
@@ -831,95 +829,6 @@ static notrace u64 timebase_read(struct clocksource *cs)
        return (u64)get_tb();
 }
 
-
-void update_vsyscall(struct timekeeper *tk)
-{
-       struct timespec64 xt;
-       struct clocksource *clock = tk->tkr_mono.clock;
-       u32 mult = tk->tkr_mono.mult;
-       u32 shift = tk->tkr_mono.shift;
-       u64 cycle_last = tk->tkr_mono.cycle_last;
-       u64 new_tb_to_xs, new_stamp_xsec;
-       u64 frac_sec;
-
-       if (clock != &clocksource_timebase)
-               return;
-
-       xt.tv_sec = tk->xtime_sec;
-       xt.tv_nsec = (long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);
-
-       /* Make userspace gettimeofday spin until we're done. */
-       ++vdso_data->tb_update_count;
-       smp_mb();
-
-       /*
-        * This computes ((2^20 / 1e9) * mult) >> shift as a
-        * 0.64 fixed-point fraction.
-        * The computation in the else clause below won't overflow
-        * (as long as the timebase frequency is >= 1.049 MHz)
-        * but loses precision because we lose the low bits of the constant
-        * in the shift.  Note that 19342813113834067 ~= 2^(20+64) / 1e9.
-        * For a shift of 24 the error is about 0.5e-9, or about 0.5ns
-        * over a second.  (Shift values are usually 22, 23 or 24.)
-        * For high frequency clocks such as the 512MHz timebase clock
-        * on POWER[6789], the mult value is small (e.g. 32768000)
-        * and so we can shift the constant by 16 initially
-        * (295147905179 ~= 2^(20+64-16) / 1e9) and then do the
-        * remaining shifts after the multiplication, which gives a
-        * more accurate result (e.g. with mult = 32768000, shift = 24,
-        * the error is only about 1.2e-12, or 0.7ns over 10 minutes).
-        */
-       if (mult <= 62500000 && clock->shift >= 16)
-               new_tb_to_xs = ((u64) mult * 295147905179ULL) >> (clock->shift - 16);
-       else
-               new_tb_to_xs = (u64) mult * (19342813113834067ULL >> clock->shift);
-
-       /*
-        * Compute the fractional second in units of 2^-32 seconds.
-        * The fractional second is tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift
-        * in nanoseconds, so multiplying that by 2^32 / 1e9 gives
-        * it in units of 2^-32 seconds.
-        * We assume shift <= 32 because clocks_calc_mult_shift()
-        * generates shift values in the range 0 - 32.
-        */
-       frac_sec = tk->tkr_mono.xtime_nsec << (32 - shift);
-       do_div(frac_sec, NSEC_PER_SEC);
-
-       /*
-        * Work out new stamp_xsec value for any legacy users of systemcfg.
-        * stamp_xsec is in units of 2^-20 seconds.
-        */
-       new_stamp_xsec = frac_sec >> 12;
-       new_stamp_xsec += tk->xtime_sec * XSEC_PER_SEC;
-
-       /*
-        * tb_update_count is used to allow the userspace gettimeofday code
-        * to assure itself that it sees a consistent view of the tb_to_xs and
-        * stamp_xsec variables.  It reads the tb_update_count, then reads
-        * tb_to_xs and stamp_xsec and then reads tb_update_count again.  If
-        * the two values of tb_update_count match and are even then the
-        * tb_to_xs and stamp_xsec values are consistent.  If not, then it
-        * loops back and reads them again until this criteria is met.
-        */
-       vdso_data->tb_orig_stamp = cycle_last;
-       vdso_data->stamp_xsec = new_stamp_xsec;
-       vdso_data->tb_to_xs = new_tb_to_xs;
-       vdso_data->wtom_clock_sec = tk->wall_to_monotonic.tv_sec;
-       vdso_data->wtom_clock_nsec = tk->wall_to_monotonic.tv_nsec;
-       vdso_data->stamp_xtime_sec = xt.tv_sec;
-       vdso_data->stamp_xtime_nsec = xt.tv_nsec;
-       vdso_data->stamp_sec_fraction = frac_sec;
-       vdso_data->hrtimer_res = hrtimer_resolution;
-       smp_wmb();
-       ++(vdso_data->tb_update_count);
-}
-
-void update_vsyscall_tz(void)
-{
-       vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
-       vdso_data->tz_dsttime = sys_tz.tz_dsttime;
-}
-
 static void __init clocksource_init(void)
 {
        struct clocksource *clock = &clocksource_timebase;
@@ -1079,7 +988,6 @@ void __init time_init(void)
                sys_tz.tz_dsttime = 0;
        }
 
-       vdso_data->tb_update_count = 0;
        vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
 
        /* initialise and enable the large decrementer (if we have one) */