mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git
synced 2026-04-03 23:38:12 -04:00
timekeeping: Provide time getters for auxiliary clocks
Provide interfaces similar to the ktime_get*() family which provide access to the auxiliary clocks. These interfaces have a boolean return value, which indicates whether the accessed clock is valid or not. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: John Stultz <jstultz@google.com> Link: https://lore.kernel.org/all/20250625183757.868342628@linutronix.de
This commit is contained in:
@@ -37,6 +37,11 @@ static inline int clockid_to_fd(const clockid_t clk)
|
||||
return ~(clk >> 3);
|
||||
}
|
||||
|
||||
static inline bool clockid_aux_valid(clockid_t id)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_POSIX_AUX_CLOCKS) && id >= CLOCK_AUX && id <= CLOCK_AUX_LAST;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_POSIX_TIMERS
|
||||
|
||||
#include <linux/signal_types.h>
|
||||
|
||||
@@ -263,6 +263,17 @@ extern bool timekeeping_rtc_skipresume(void);
|
||||
|
||||
extern void timekeeping_inject_sleeptime64(const struct timespec64 *delta);
|
||||
|
||||
/*
|
||||
* Auxiliary clock interfaces
|
||||
*/
|
||||
#ifdef CONFIG_POSIX_AUX_CLOCKS
|
||||
extern bool ktime_get_aux(clockid_t id, ktime_t *kt);
|
||||
extern bool ktime_get_aux_ts64(clockid_t id, struct timespec64 *kt);
|
||||
#else
|
||||
static inline bool ktime_get_aux(clockid_t id, ktime_t *kt) { return false; }
|
||||
static inline bool ktime_get_aux_ts64(clockid_t id, struct timespec64 *kt) { return false; }
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct system_time_snapshot - simultaneous raw/real time capture with
|
||||
* counter value
|
||||
|
||||
@@ -2664,6 +2664,18 @@ EXPORT_SYMBOL(hardpps);
|
||||
*/
|
||||
static unsigned long aux_timekeepers;
|
||||
|
||||
static inline unsigned int clockid_to_tkid(unsigned int id)
|
||||
{
|
||||
return TIMEKEEPER_AUX_FIRST + id - CLOCK_AUX;
|
||||
}
|
||||
|
||||
static inline struct tk_data *aux_get_tk_data(clockid_t id)
|
||||
{
|
||||
if (!clockid_aux_valid(id))
|
||||
return NULL;
|
||||
return &timekeeper_data[clockid_to_tkid(id)];
|
||||
}
|
||||
|
||||
/* Invoked from timekeeping after a clocksource change */
|
||||
static void tk_aux_update_clocksource(void)
|
||||
{
|
||||
@@ -2684,6 +2696,59 @@ static void tk_aux_update_clocksource(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ktime_get_aux - Get time for a AUX clock
|
||||
* @id: ID of the clock to read (CLOCK_AUX...)
|
||||
* @kt: Pointer to ktime_t to store the time stamp
|
||||
*
|
||||
* Returns: True if the timestamp is valid, false otherwise
|
||||
*/
|
||||
bool ktime_get_aux(clockid_t id, ktime_t *kt)
|
||||
{
|
||||
struct tk_data *aux_tkd = aux_get_tk_data(id);
|
||||
struct timekeeper *aux_tk;
|
||||
unsigned int seq;
|
||||
ktime_t base;
|
||||
u64 nsecs;
|
||||
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
if (!aux_tkd)
|
||||
return false;
|
||||
|
||||
aux_tk = &aux_tkd->timekeeper;
|
||||
do {
|
||||
seq = read_seqcount_begin(&aux_tkd->seq);
|
||||
if (!aux_tk->clock_valid)
|
||||
return false;
|
||||
|
||||
base = ktime_add(aux_tk->tkr_mono.base, aux_tk->offs_aux);
|
||||
nsecs = timekeeping_get_ns(&aux_tk->tkr_mono);
|
||||
} while (read_seqcount_retry(&aux_tkd->seq, seq));
|
||||
|
||||
*kt = ktime_add_ns(base, nsecs);
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ktime_get_aux);
|
||||
|
||||
/**
|
||||
* ktime_get_aux_ts64 - Get time for a AUX clock
|
||||
* @id: ID of the clock to read (CLOCK_AUX...)
|
||||
* @ts: Pointer to timespec64 to store the time stamp
|
||||
*
|
||||
* Returns: True if the timestamp is valid, false otherwise
|
||||
*/
|
||||
bool ktime_get_aux_ts64(clockid_t id, struct timespec64 *ts)
|
||||
{
|
||||
ktime_t now;
|
||||
|
||||
if (!ktime_get_aux(id, &now))
|
||||
return false;
|
||||
*ts = ktime_to_timespec64(now);
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ktime_get_aux_ts64);
|
||||
|
||||
static __init void tk_aux_setup(void)
|
||||
{
|
||||
for (int i = TIMEKEEPER_AUX_FIRST; i <= TIMEKEEPER_AUX_LAST; i++)
|
||||
|
||||
Reference in New Issue
Block a user