|
@@ -676,6 +676,36 @@ time64_t ktime_get_seconds(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(ktime_get_seconds);
|
|
|
|
|
|
+/**
|
|
|
+ * ktime_get_real_seconds - Get the seconds portion of CLOCK_REALTIME
|
|
|
+ *
|
|
|
+ * Returns the wall clock seconds since 1970. This replaces the
|
|
|
+ * get_seconds() interface which is not y2038 safe on 32bit systems.
|
|
|
+ *
|
|
|
+ * For 64bit systems the fast access to tk->xtime_sec is preserved. On
|
|
|
+ * 32bit systems the access must be protected with the sequence
|
|
|
+ * counter to provide "atomic" access to the 64bit tk->xtime_sec
|
|
|
+ * value.
|
|
|
+ */
|
|
|
+time64_t ktime_get_real_seconds(void)
|
|
|
+{
|
|
|
+ struct timekeeper *tk = &tk_core.timekeeper;
|
|
|
+ time64_t seconds;
|
|
|
+ unsigned int seq;
|
|
|
+
|
|
|
+ if (IS_ENABLED(CONFIG_64BIT))
|
|
|
+ return tk->xtime_sec;
|
|
|
+
|
|
|
+ do {
|
|
|
+ seq = read_seqcount_begin(&tk_core.seq);
|
|
|
+ seconds = tk->xtime_sec;
|
|
|
+
|
|
|
+ } while (read_seqcount_retry(&tk_core.seq, seq));
|
|
|
+
|
|
|
+ return seconds;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(ktime_get_real_seconds);
|
|
|
+
|
|
|
#ifdef CONFIG_NTP_PPS
|
|
|
|
|
|
/**
|