]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
timekeeping: Add CLOCK_AUX support for ktime_get_snapshot_id()
authorThomas Gleixner <tglx@kernel.org>
Fri, 29 May 2026 20:00:24 +0000 (22:00 +0200)
committerThomas Gleixner <tglx@kernel.org>
Thu, 4 Jun 2026 09:04:16 +0000 (11:04 +0200)
Now that all users are converted it's possible to enable snapshotting of
CLOCK_AUX time. The underlying clocksource is the same as for all other
CLOCK variants.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Tested-by: Arthur Kiyanovski <akiyano@amazon.com>
Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20260529195557.380601005@kernel.org
kernel/time/timekeeping.c

index a134b1bad923d266429a8d15b1e149c305a1247b..e43aa11dbfd68b6c6a2d4dc65017a8b4eb8af92c 100644 (file)
@@ -67,6 +67,7 @@ static inline bool tk_is_aux(const struct timekeeper *tk)
 {
        return tk->id >= TIMEKEEPER_AUX_FIRST && tk->id <= TIMEKEEPER_AUX_LAST;
 }
+static inline struct tk_data *aux_get_tk_data(clockid_t id);
 #else
 static inline bool tk_get_aux_ts64(unsigned int tkid, struct timespec64 *ts)
 {
@@ -77,6 +78,10 @@ static inline bool tk_is_aux(const struct timekeeper *tk)
 {
        return false;
 }
+static inline struct tk_data *aux_get_tk_data(clockid_t id)
+{
+       return NULL;
+}
 #endif
 
 static inline void tk_update_aux_offs(struct timekeeper *tk, ktime_t offs)
@@ -1218,6 +1223,12 @@ void ktime_get_snapshot_id(clockid_t clock_id, struct system_time_snapshot *syst
                tkd = &tk_core;
                offs = &tk_core.timekeeper.offs_boot;
                break;
+       case CLOCK_AUX ... CLOCK_AUX_LAST:
+               tkd = aux_get_tk_data(clock_id);
+               if (!tkd)
+                       return;
+               offs = &tkd->timekeeper.offs_aux;
+               break;
        default:
                WARN_ON_ONCE(1);
                return;
@@ -1228,6 +1239,10 @@ void ktime_get_snapshot_id(clockid_t clock_id, struct system_time_snapshot *syst
        do {
                seq = read_seqcount_begin(&tkd->seq);
 
+               /* Aux clocks can be invalid */
+               if (!tk->clock_valid)
+                       return;
+
                now = tk_clock_read(&tk->tkr_mono);
                systime_snapshot->cs_id = tk->tkr_mono.clock->id;
                systime_snapshot->cs_was_changed_seq = tk->cs_was_changed_seq;