mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +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 */
|
/* Multigrain timestamp interfaces */
|
||||||
extern void ktime_get_coarse_real_ts64_mg(struct timespec64 *ts);
|
extern void ktime_get_coarse_real_ts64_mg(struct timespec64 *ts);
|
||||||
extern void ktime_get_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);
|
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)) {
|
if (atomic64_try_cmpxchg(&mg_floor, &old, mono)) {
|
||||||
ts->tv_nsec = 0;
|
ts->tv_nsec = 0;
|
||||||
timespec64_add_ns(ts, nsecs);
|
timespec64_add_ns(ts, nsecs);
|
||||||
|
timekeeping_inc_mg_floor_swaps();
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Another task changed mg_floor since "old" was fetched.
|
* Another task changed mg_floor since "old" was fetched.
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
#define NUM_BINS 32
|
#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 unsigned int sleep_time_bin[NUM_BINS] = {0};
|
||||||
|
|
||||||
static int tk_debug_sleep_time_show(struct seq_file *s, void *data)
|
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);
|
(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
|
* timekeeping debug functions
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#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);
|
extern void tk_debug_account_sleep_time(const struct timespec64 *t);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define tk_debug_account_sleep_time(x)
|
#define tk_debug_account_sleep_time(x)
|
||||||
|
|
||||||
|
static inline void timekeeping_inc_mg_floor_swaps(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE
|
#ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE
|
||||||
|
Loading…
Reference in New Issue
Block a user