|
@@ -423,30 +423,6 @@ void udelay(unsigned long usecs)
|
|
|
}
|
|
|
EXPORT_SYMBOL(udelay);
|
|
|
|
|
|
-static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
|
|
- u64 new_tb_to_xs)
|
|
|
-{
|
|
|
- /*
|
|
|
- * 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.
|
|
|
- * We expect the caller to have done the first increment of
|
|
|
- * vdso_data->tb_update_count already.
|
|
|
- */
|
|
|
- vdso_data->tb_orig_stamp = new_tb_stamp;
|
|
|
- vdso_data->stamp_xsec = new_stamp_xsec;
|
|
|
- vdso_data->tb_to_xs = new_tb_to_xs;
|
|
|
- vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
|
|
- vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
|
|
- vdso_data->stamp_xtime = xtime;
|
|
|
- smp_wmb();
|
|
|
- ++(vdso_data->tb_update_count);
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_SMP
|
|
|
unsigned long profile_pc(struct pt_regs *regs)
|
|
|
{
|
|
@@ -876,7 +852,7 @@ static cycle_t timebase_read(struct clocksource *cs)
|
|
|
void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
|
|
u32 mult)
|
|
|
{
|
|
|
- u64 t2x, stamp_xsec;
|
|
|
+ u64 new_tb_to_xs, new_stamp_xsec;
|
|
|
|
|
|
if (clock != &clocksource_timebase)
|
|
|
return;
|
|
@@ -887,11 +863,30 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
|
|
|
|
|
/* XXX this assumes clock->shift == 22 */
|
|
|
/* 4611686018 ~= 2^(20+64-22) / 1e9 */
|
|
|
- t2x = (u64) mult * 4611686018ULL;
|
|
|
- stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
|
|
|
- do_div(stamp_xsec, 1000000000);
|
|
|
- stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
|
|
|
- update_gtod(clock->cycle_last, stamp_xsec, t2x);
|
|
|
+ new_tb_to_xs = (u64) mult * 4611686018ULL;
|
|
|
+ new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
|
|
|
+ do_div(new_stamp_xsec, 1000000000);
|
|
|
+ new_stamp_xsec += (u64) xtime.tv_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.
|
|
|
+ * We expect the caller to have done the first increment of
|
|
|
+ * vdso_data->tb_update_count already.
|
|
|
+ */
|
|
|
+ vdso_data->tb_orig_stamp = clock->cycle_last;
|
|
|
+ vdso_data->stamp_xsec = new_stamp_xsec;
|
|
|
+ vdso_data->tb_to_xs = new_tb_to_xs;
|
|
|
+ vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
|
|
+ vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
|
|
+ vdso_data->stamp_xtime = xtime;
|
|
|
+ smp_wmb();
|
|
|
+ ++(vdso_data->tb_update_count);
|
|
|
}
|
|
|
|
|
|
void update_vsyscall_tz(void)
|