Commit 17f6bac2 authored by Chuanhua Lei's avatar Chuanhua Lei Committed by Thomas Gleixner

x86/tsc: Prevent result truncation on 32bit

Loops per jiffy is calculated by multiplying tsc_khz with 1e3 and then
dividing it by HZ.

Both tsc_khz and the temporary variable holding the multiplication result
are of type unsigned long, so on 32bit the result is truncated to the lower
32bit.

Use u64 as type for the temporary variable and cast tsc_khz to it before
multiplying.

[ tglx: Massaged changelog and removed pointless braces ]

Fixes: cf7a63ef ("x86/tsc: Calibrate tsc only once")
Signed-off-by: default avatarChuanhua Lei <chuanhua.lei@linux.intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: yixin.zhu@linux.intel.com
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Tatashin <pasha.tatashin@microsoft.com>
Cc: Rajvi Jingar <rajvi.jingar@intel.com>
Cc: Dou Liyang <douly.fnst@cn.fujitsu.com>
Link: https://lkml.kernel.org/r/1536228203-18701-1-git-send-email-chuanhua.lei@linux.intel.com
parent 4331f4d5
...@@ -1415,7 +1415,7 @@ static bool __init determine_cpu_tsc_frequencies(bool early) ...@@ -1415,7 +1415,7 @@ static bool __init determine_cpu_tsc_frequencies(bool early)
static unsigned long __init get_loops_per_jiffy(void) static unsigned long __init get_loops_per_jiffy(void)
{ {
unsigned long lpj = tsc_khz * KHZ; u64 lpj = (u64)tsc_khz * KHZ;
do_div(lpj, HZ); do_div(lpj, HZ);
return lpj; return lpj;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment