mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
timekeeping: Add percpu counter for tracking floor swap events
The mgtime_floor value is a global variable for tracking the latest fine-grained timestamp handed out. Because it's a global, track the number of times that a new floor value is assigned. Add a new percpu counter to the timekeeping code to track the number of floor swap events that have occurred. A later patch will add a debugfs file to display this counter alongside other stats involving multigrain timestamps. Signed-off-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Randy Dunlap <rdunlap@infradead.org> # documentation bits Link: https://lore.kernel.org/all/20241002-mgtime-v10-2-d1c4717f5284@kernel.org Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
ee3283c608
commit
2a15385742
@ -48,6 +48,7 @@ extern void ktime_get_coarse_real_ts64(struct timespec64 *ts);
|
||||
/* Multigrain timestamp interfaces */
|
||||
extern void ktime_get_coarse_real_ts64_mg(struct timespec64 *ts);
|
||||
extern void ktime_get_real_ts64_mg(struct timespec64 *ts);
|
||||
extern unsigned long timekeeping_get_mg_floor_swaps(void);
|
||||
|
||||
void getboottime64(struct timespec64 *ts);
|
||||
|
||||
|
@ -2487,6 +2487,7 @@ void ktime_get_real_ts64_mg(struct timespec64 *ts)
|
||||
if (atomic64_try_cmpxchg(&mg_floor, &old, mono)) {
|
||||
ts->tv_nsec = 0;
|
||||
timespec64_add_ns(ts, nsecs);
|
||||
timekeeping_inc_mg_floor_swaps();
|
||||
} else {
|
||||
/*
|
||||
* Another task changed mg_floor since "old" was fetched.
|
||||
|
@ -17,6 +17,9 @@
|
||||
|
||||
#define NUM_BINS 32
|
||||
|
||||
/* Incremented every time mg_floor is updated */
|
||||
DEFINE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps);
|
||||
|
||||
static unsigned int sleep_time_bin[NUM_BINS] = {0};
|
||||
|
||||
static int tk_debug_sleep_time_show(struct seq_file *s, void *data)
|
||||
@ -53,3 +56,13 @@ void tk_debug_account_sleep_time(const struct timespec64 *t)
|
||||
(s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC);
|
||||
}
|
||||
|
||||
unsigned long timekeeping_get_mg_floor_swaps(void)
|
||||
{
|
||||
unsigned long sum = 0;
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
sum += data_race(per_cpu(timekeeping_mg_floor_swaps, cpu));
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
@ -10,9 +10,24 @@
|
||||
* timekeeping debug functions
|
||||
*/
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
DECLARE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps);
|
||||
|
||||
static inline void timekeeping_inc_mg_floor_swaps(void)
|
||||
{
|
||||
this_cpu_inc(timekeeping_mg_floor_swaps);
|
||||
}
|
||||
|
||||
extern void tk_debug_account_sleep_time(const struct timespec64 *t);
|
||||
|
||||
#else
|
||||
|
||||
#define tk_debug_account_sleep_time(x)
|
||||
|
||||
static inline void timekeeping_inc_mg_floor_swaps(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE
|
||||
|
Loading…
Reference in New Issue
Block a user