Messages in this thread | | | Date | Fri, 21 Aug 2015 09:46:57 +0300 | From | Adrian Hunter <> | Subject | Re: [PATCH V2] perf: x86: Improve accuracy of perf/sched clock |
| |
On 20/08/15 22:31, Thomas Gleixner wrote: > On Wed, 29 Jul 2015, Adrian Hunter wrote: >> @@ -239,6 +239,8 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) >> unsigned long long tsc_now, ns_now; >> struct cyc2ns_data *data; >> unsigned long flags; >> + u64 mult; >> + u32 shft = 32; >> >> local_irq_save(flags); >> sched_clock_idle_sleep_event(); >> @@ -256,12 +258,17 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) >> * time function is continuous; see the comment near struct >> * cyc2ns_data. >> */ >> - data->cyc2ns_mul = >> - DIV_ROUND_CLOSEST(NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR, >> - cpu_khz); >> - data->cyc2ns_shift = CYC2NS_SCALE_FACTOR; >> + mult = (u64)NSEC_PER_MSEC << 32; >> + mult += cpu_khz / 2; >> + do_div(mult, cpu_khz); >> + while (mult > U32_MAX) { >> + mult >>= 1; >> + shft -= 1; >> + } > > This is an open coded variant of clocks_calc_mult_shift(). Can we > please use that one?
Sure. clocks_calc_mult_shift() does a division on each shift which is a bit slower (avoids a 1-bit rounding error but that will never be more than 1 in 2^32 in this case), and the 'maxsec' functionality is not needed because mul_u64_u32_shr() is used to avoid 64-bit overflow.
I will send V3.
| |