lkml.org 
[lkml]   [2015]   [Aug]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [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.



\
 
 \ /
  Last update: 2015-08-21 09:41    [W:1.072 / U:1.332 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site