If the current clocksource can be accessed safely after timekeeping is suspended then there is no reason to suspend the NMI safe timekeepers. Signed-off-by: Thomas Gleixner --- include/linux/clocksource.h | 3 ++- kernel/time/timekeeping.c | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -119,7 +119,8 @@ struct clocksource { #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 #define CLOCK_SOURCE_UNSTABLE 0x40 #define CLOCK_SOURCE_SUSPEND_NONSTOP 0x80 -#define CLOCK_SOURCE_RESELECT 0x100 +#define CLOCK_SOURCE_SUSPEND_ACCESS_OK 0x100 +#define CLOCK_SOURCE_RESELECT 0x200 /* simplify initialization of mask field */ #define CLOCKSOURCE_MASK(bits) GENMASK_ULL((bits) - 1, 0) --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -545,6 +545,9 @@ static void halt_fast_timekeeper(struct static struct tk_read_base tkr_dummy; struct tk_read_base *tkr = &tk->tkr_mono; + if (tkr->clock->flags & CLOCK_SOURCE_SUSPEND_ACCESS_OK) + return; + memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); cycles_at_suspend = tk_clock_read(tkr); tkr_dummy.clock = &dummy_clock;