+static void clocksource_settimeofday(struct clocksource *cs,
+ struct timespec *ts)
+{
+ u64 new_xsec;
+
+#ifdef CONFIG_PPC_ISERIES
+ if (firmware_has_feature(FW_FEATURE_ISERIES) && first_settimeofday) {
+ iSeries_tb_recal();
+ first_settimeofday = 0;
+ }
+#endif
+
+ /* Make userspace gettimeofday spin until we're done. */
+ ++vdso_data->tb_update_count;
+ smp_mb();
+
+ /* In case of a large backwards jump in time with NTP, we want the
+ * clock to be updated as soon as the PLL is again in lock.
+ */
+ last_rtc_update = xtime.tv_sec - 658;
+
+ new_xsec = xtime.tv_nsec;
+ if (new_xsec != 0) {
+ new_xsec *= XSEC_PER_SEC;
+ do_div(new_xsec, NSEC_PER_SEC);
+ }
+
+ new_xsec += (u64)xtime.tv_sec * XSEC_PER_SEC;
+
+ vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
+ vdso_data->tz_dsttime = sys_tz.tz_dsttime;
+
+ update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
+}
It does look too large to run from interrupt context,
but it also looks
like it could get cleaned out more ..
+void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
+{
+ timer_recalc_offset(tb_last_jiffy);
+ timer_check_rtc();
+}
Hmm .. This doesn't look like it's taking into account that the time has
changed ..
Your time has effectively incremented by one jiffie .. The
vdso_data doesn't appear to be updated ..