From b69721d1af317f491ae7090d338d82528745612a Mon Sep 17 00:00:00 2001 From: Mike Galbraith Date: Wed, 29 May 2013 13:52:13 +0200 Subject: [PATCH] x86/mce: fix mce timer interval Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/3.12/patches-3.12.6-rt9.tar.xz Seems mce timer fire at the wrong frequency in -rt kernels since roughly forever due to 32 bit overflow. 3.8-rt is also missing a multiplier. Add missing us -> ns conversion and 32 bit overflow prevention. Cc: stable-rt@vger.kernel.org Signed-off-by: Mike Galbraith [bigeasy: use ULL instead of u64 cast] Signed-off-by: Sebastian Andrzej Siewior --- arch/x86/kernel/cpu/mcheck/mce.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -1303,7 +1303,8 @@ static enum hrtimer_restart mce_timer_fn __this_cpu_write(mce_next_interval, iv); /* Might have become 0 after CMCI storm subsided */ if (iv) { - hrtimer_forward_now(timer, ns_to_ktime(jiffies_to_usecs(iv))); + hrtimer_forward_now(timer, ns_to_ktime( + jiffies_to_usecs(iv) * 1000ULL)); return HRTIMER_RESTART; } return HRTIMER_NORESTART; @@ -1331,7 +1332,7 @@ void mce_timer_kick(unsigned long interv } } else { hrtimer_start_range_ns(t, - ns_to_ktime(jiffies_to_usecs(interval) * 1000), + ns_to_ktime(jiffies_to_usecs(interval) * 1000ULL), 0, HRTIMER_MODE_REL_PINNED); } if (interval < iv) @@ -1653,7 +1654,7 @@ static void mce_start_timer(unsigned int if (mca_cfg.ignore_ce || !iv) return; - hrtimer_start_range_ns(t, ns_to_ktime(jiffies_to_usecs(iv) * 1000), + hrtimer_start_range_ns(t, ns_to_ktime(jiffies_to_usecs(iv) * 1000ULL), 0, HRTIMER_MODE_REL_PINNED); }