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.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to