|
@@ -125,6 +125,75 @@ void getnstimeofday(struct timespec *ts)
|
|
|
|
|
|
EXPORT_SYMBOL(getnstimeofday);
|
|
EXPORT_SYMBOL(getnstimeofday);
|
|
|
|
|
|
|
|
+ktime_t ktime_get(void)
|
|
|
|
+{
|
|
|
|
+ cycle_t cycle_now, cycle_delta;
|
|
|
|
+ unsigned int seq;
|
|
|
|
+ s64 secs, nsecs;
|
|
|
|
+
|
|
|
|
+ WARN_ON(timekeeping_suspended);
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ seq = read_seqbegin(&xtime_lock);
|
|
|
|
+ secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
|
|
|
|
+ nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
|
|
|
|
+
|
|
|
|
+ /* read clocksource: */
|
|
|
|
+ cycle_now = clocksource_read(clock);
|
|
|
|
+
|
|
|
|
+ /* calculate the delta since the last update_wall_time: */
|
|
|
|
+ cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
|
|
|
|
+
|
|
|
|
+ /* convert to nanoseconds: */
|
|
|
|
+ nsecs += cyc2ns(clock, cycle_delta);
|
|
|
|
+
|
|
|
|
+ } while (read_seqretry(&xtime_lock, seq));
|
|
|
|
+ /*
|
|
|
|
+ * Use ktime_set/ktime_add_ns to create a proper ktime on
|
|
|
|
+ * 32-bit architectures without CONFIG_KTIME_SCALAR.
|
|
|
|
+ */
|
|
|
|
+ return ktime_add_ns(ktime_set(secs, 0), nsecs);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(ktime_get);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ktime_get_ts - get the monotonic clock in timespec format
|
|
|
|
+ * @ts: pointer to timespec variable
|
|
|
|
+ *
|
|
|
|
+ * The function calculates the monotonic clock from the realtime
|
|
|
|
+ * clock and the wall_to_monotonic offset and stores the result
|
|
|
|
+ * in normalized timespec format in the variable pointed to by @ts.
|
|
|
|
+ */
|
|
|
|
+void ktime_get_ts(struct timespec *ts)
|
|
|
|
+{
|
|
|
|
+ cycle_t cycle_now, cycle_delta;
|
|
|
|
+ struct timespec tomono;
|
|
|
|
+ unsigned int seq;
|
|
|
|
+ s64 nsecs;
|
|
|
|
+
|
|
|
|
+ WARN_ON(timekeeping_suspended);
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ seq = read_seqbegin(&xtime_lock);
|
|
|
|
+ *ts = xtime;
|
|
|
|
+ tomono = wall_to_monotonic;
|
|
|
|
+
|
|
|
|
+ /* read clocksource: */
|
|
|
|
+ cycle_now = clocksource_read(clock);
|
|
|
|
+
|
|
|
|
+ /* calculate the delta since the last update_wall_time: */
|
|
|
|
+ cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
|
|
|
|
+
|
|
|
|
+ /* convert to nanoseconds: */
|
|
|
|
+ nsecs = cyc2ns(clock, cycle_delta);
|
|
|
|
+
|
|
|
|
+ } while (read_seqretry(&xtime_lock, seq));
|
|
|
|
+
|
|
|
|
+ set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec,
|
|
|
|
+ ts->tv_nsec + tomono.tv_nsec + nsecs);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(ktime_get_ts);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* do_gettimeofday - Returns the time of day in a timeval
|
|
* do_gettimeofday - Returns the time of day in a timeval
|
|
* @tv: pointer to the timeval to be set
|
|
* @tv: pointer to the timeval to be set
|