]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
x86/tsc: Prevent result truncation on 32bit
authorChuanhua Lei <chuanhua.lei@linux.intel.com>
Thu, 6 Sep 2018 10:03:23 +0000 (18:03 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 15 Sep 2018 07:47:01 +0000 (09:47 +0200)
commitdd458c42c28a36f76df001f5643ef8323ce9b28f
treeecabf57c622bb63f2f55bdc3ff000b4019ea4648
parent009a091aae1c538f54bd7bdd1c3dc82def2845d7
x86/tsc: Prevent result truncation on 32bit

commit 17f6bac2249356c795339e03a0742cd79be3cab8 upstream.

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 ]

[ tglx: Backport to stable. Due to massive code changes is the upstream
   commit not applicable anymore. The issue has gone unnoticed in
   kernels pre 4.19 because the bogus LPJ value gets fixed up in a
   later stage of early boot, but it still might cause subtle and hard
   to debug issues between these two points. ]

Fixes: cf7a63ef4e02 ("x86/tsc: Calibrate tsc only once")
Signed-off-by: Chuanhua Lei <chuanhua.lei@linux.intel.com>
Signed-off-by: Thomas 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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kernel/tsc.c