Messages in this thread Patch in this message | | | Subject | [patch] Re: x86-tip tsc/tick gripage | From | Mike Galbraith <> | Date | Fri, 28 Apr 2017 09:35:46 +0200 |
| |
On Wed, 2017-04-26 at 13:39 +0200, Mike Galbraith wrote: > On Wed, 2017-04-26 at 12:26 +0200, Peter Zijlstra wrote: > > On Wed, Apr 26, 2017 at 10:57:42AM +0200, Mike Galbraith wrote: > > > > > Both still lose their TSC. > > > > > > [ 11.982468] tsc: Refined TSC clocksource calibration: 2260.999 MHz > > > [ 11.994275] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x20974a4d8bb, max_idle_ns: 440795246623 ns > > > [ 13.064172] clocksource: Switched to clocksource tsc > > > [ 240.247851] clocksource: timekeeping watchdog on CPU23: Marking clocksource 'tsc' as unstable because the skew is too large: > > > [ 240.462501] clocksource: 'tsc' cs_now: 108fe5be09f cs_last: b90a6a0676 mask: ffffffffffffffff > > > [ 240.675057] tsc: Marking TSC unstable due to clocksource watchdog > > > > > > And they didn't use to? We don't typically write to TSC or TSC_ADJUST > > and thus would not cause such behaviour. > > Nope. The DL980 is my RT jitter test box, which I use all the time.
I found evidence of lysdexia at play (hunk 2), below is an RFFS (frozen shark) which makes my DL980 a happy camper with tip.
timer/nohz: Call tick_tmigr_idle() with proper parameter order
Extremely late timer expiration soon leads to the clocksource watchdog killing the TSC clocksource on multisocket boxen. Call tmigr_cpu_idle( ) with proper parameter order, and pass next_local to tmigr_cpu_idle() so it can return what it says it returns.
Signed-off-by: Mike Galbraith <efault@gmx.de> Fixes: ec2206b91d43 timer: Implement the hierarchical pull model --- kernel/time/tick-sched.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
--- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -695,7 +695,7 @@ tick_tmigr_idle(struct tick_sched *ts, u if (next_global >= next_local) next_global = KTIME_MAX; - next_global = tmigr_cpu_idle(next_global); + next_local = tmigr_cpu_idle(next_local); return min_t(u64, next_local, next_global); } @@ -768,7 +768,7 @@ static ktime_t tick_nohz_stop_sched_tick */ delta = next_local - basemono; if (delta > (u64)TICK_NSEC) - next_local = tick_tmigr_idle(ts, next_local, next_global); + next_local = tick_tmigr_idle(ts, next_global, next_local); ts->next_timer = next_local;
| |