|
@@ -208,6 +208,7 @@ notrace static inline u64 vgetsns(int *mode)
|
|
|
/* Code size doesn't matter (vdso is 4k anyway) and this is faster. */
|
|
|
notrace static int __always_inline do_realtime(struct timespec *ts)
|
|
|
{
|
|
|
+ struct vgtod_ts *base = >od->basetime[CLOCK_REALTIME];
|
|
|
unsigned int seq;
|
|
|
u64 ns;
|
|
|
int mode;
|
|
@@ -215,8 +216,8 @@ notrace static int __always_inline do_realtime(struct timespec *ts)
|
|
|
do {
|
|
|
seq = gtod_read_begin(gtod);
|
|
|
mode = gtod->vclock_mode;
|
|
|
- ts->tv_sec = gtod->wall_time_sec;
|
|
|
- ns = gtod->wall_time_snsec;
|
|
|
+ ts->tv_sec = base->sec;
|
|
|
+ ns = base->nsec;
|
|
|
ns += vgetsns(&mode);
|
|
|
ns >>= gtod->shift;
|
|
|
} while (unlikely(gtod_read_retry(gtod, seq)));
|
|
@@ -229,6 +230,7 @@ notrace static int __always_inline do_realtime(struct timespec *ts)
|
|
|
|
|
|
notrace static int __always_inline do_monotonic(struct timespec *ts)
|
|
|
{
|
|
|
+ struct vgtod_ts *base = >od->basetime[CLOCK_MONOTONIC];
|
|
|
unsigned int seq;
|
|
|
u64 ns;
|
|
|
int mode;
|
|
@@ -236,8 +238,8 @@ notrace static int __always_inline do_monotonic(struct timespec *ts)
|
|
|
do {
|
|
|
seq = gtod_read_begin(gtod);
|
|
|
mode = gtod->vclock_mode;
|
|
|
- ts->tv_sec = gtod->monotonic_time_sec;
|
|
|
- ns = gtod->monotonic_time_snsec;
|
|
|
+ ts->tv_sec = base->sec;
|
|
|
+ ns = base->nsec;
|
|
|
ns += vgetsns(&mode);
|
|
|
ns >>= gtod->shift;
|
|
|
} while (unlikely(gtod_read_retry(gtod, seq)));
|
|
@@ -250,21 +252,25 @@ notrace static int __always_inline do_monotonic(struct timespec *ts)
|
|
|
|
|
|
notrace static void do_realtime_coarse(struct timespec *ts)
|
|
|
{
|
|
|
+ struct vgtod_ts *base = >od->basetime[CLOCK_REALTIME_COARSE];
|
|
|
unsigned int seq;
|
|
|
+
|
|
|
do {
|
|
|
seq = gtod_read_begin(gtod);
|
|
|
- ts->tv_sec = gtod->wall_time_coarse_sec;
|
|
|
- ts->tv_nsec = gtod->wall_time_coarse_nsec;
|
|
|
+ ts->tv_sec = base->sec;
|
|
|
+ ts->tv_nsec = base->nsec;
|
|
|
} while (unlikely(gtod_read_retry(gtod, seq)));
|
|
|
}
|
|
|
|
|
|
notrace static void do_monotonic_coarse(struct timespec *ts)
|
|
|
{
|
|
|
+ struct vgtod_ts *base = >od->basetime[CLOCK_MONOTONIC_COARSE];
|
|
|
unsigned int seq;
|
|
|
+
|
|
|
do {
|
|
|
seq = gtod_read_begin(gtod);
|
|
|
- ts->tv_sec = gtod->monotonic_time_coarse_sec;
|
|
|
- ts->tv_nsec = gtod->monotonic_time_coarse_nsec;
|
|
|
+ ts->tv_sec = base->sec;
|
|
|
+ ts->tv_nsec = base->nsec;
|
|
|
} while (unlikely(gtod_read_retry(gtod, seq)));
|
|
|
}
|
|
|
|
|
@@ -320,7 +326,7 @@ int gettimeofday(struct timeval *, struct timezone *)
|
|
|
notrace time_t __vdso_time(time_t *t)
|
|
|
{
|
|
|
/* This is atomic on x86 so we don't need any locks. */
|
|
|
- time_t result = READ_ONCE(gtod->wall_time_sec);
|
|
|
+ time_t result = READ_ONCE(gtod->basetime[CLOCK_REALTIME].sec);
|
|
|
|
|
|
if (t)
|
|
|
*t = result;
|