|
@@ -259,6 +259,17 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
|
|
|
clocks_calc_mult_shift(&data->cyc2ns_mul, &data->cyc2ns_shift, cpu_khz,
|
|
|
NSEC_PER_MSEC, 0);
|
|
|
|
|
|
+ /*
|
|
|
+ * cyc2ns_shift is exported via arch_perf_update_userpage() where it is
|
|
|
+ * not expected to be greater than 31 due to the original published
|
|
|
+ * conversion algorithm shifting a 32-bit value (now specifies a 64-bit
|
|
|
+ * value) - refer perf_event_mmap_page documentation in perf_event.h.
|
|
|
+ */
|
|
|
+ if (data->cyc2ns_shift == 32) {
|
|
|
+ data->cyc2ns_shift = 31;
|
|
|
+ data->cyc2ns_mul >>= 1;
|
|
|
+ }
|
|
|
+
|
|
|
data->cyc2ns_offset = ns_now -
|
|
|
mul_u64_u32_shr(tsc_now, data->cyc2ns_mul, data->cyc2ns_shift);
|
|
|
|