x86/tsc: Add option to disable tsc clocksource watchdog

Clocksource watchdog has been found responsible for generating latency
spikes (in the 10-20 us range) when woken up to check for TSC stability.

Add an option to disable it at boot.

Signed-off-by: Juri Lelli <juri.lelli@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: bigeasy@linutronix.de
Cc: linux-rt-users@vger.kernel.org
Cc: peterz@infradead.org
Cc: bristot@redhat.com
Cc: williams@redhat.com
Link: https://lkml.kernel.org/r/20190307120913.13168-1-juri.lelli@redhat.com
This commit is contained in:
Juri Lelli 2019-03-07 13:09:13 +01:00 committed by Thomas Gleixner
parent 9e98c678c2
commit 0f0b7e1cc7
2 changed files with 8 additions and 1 deletions

View file

@ -4703,6 +4703,10 @@
[x86] unstable: mark the TSC clocksource as unstable, this [x86] unstable: mark the TSC clocksource as unstable, this
marks the TSC unconditionally unstable at bootup and marks the TSC unconditionally unstable at bootup and
avoids any further wobbles once the TSC watchdog notices. avoids any further wobbles once the TSC watchdog notices.
[x86] nowatchdog: disable clocksource watchdog. Used
in situations with strict latency requirements (where
interruptions from clocksource watchdog are not
acceptable).
turbografx.map[2|3]= [HW,JOY] turbografx.map[2|3]= [HW,JOY]
TurboGraFX parallel port interface TurboGraFX parallel port interface

View file

@ -283,6 +283,7 @@ int __init notsc_setup(char *str)
__setup("notsc", notsc_setup); __setup("notsc", notsc_setup);
static int no_sched_irq_time; static int no_sched_irq_time;
static int no_tsc_watchdog;
static int __init tsc_setup(char *str) static int __init tsc_setup(char *str)
{ {
@ -292,6 +293,8 @@ static int __init tsc_setup(char *str)
no_sched_irq_time = 1; no_sched_irq_time = 1;
if (!strcmp(str, "unstable")) if (!strcmp(str, "unstable"))
mark_tsc_unstable("boot parameter"); mark_tsc_unstable("boot parameter");
if (!strcmp(str, "nowatchdog"))
no_tsc_watchdog = 1;
return 1; return 1;
} }
@ -1349,7 +1352,7 @@ static int __init init_tsc_clocksource(void)
if (tsc_unstable) if (tsc_unstable)
goto unreg; goto unreg;
if (tsc_clocksource_reliable) if (tsc_clocksource_reliable || no_tsc_watchdog)
clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY; clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC_S3)) if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC_S3))