Re: [PATCH v3 4/5] clocksource: Enable clocksource_cyc2ns() to coverbig cycles

From: H. Peter Anvin
Date: Wed Mar 06 2013 - 16:20:22 EST


On 03/06/2013 01:15 PM, Thomas Gleixner wrote:
> On Wed, 6 Mar 2013, H. Peter Anvin wrote:
>
>> On 03/06/2013 06:09 AM, Thomas Gleixner wrote:
>>>
>>> This breaks everything which does not have a 64/32bit divide
>>> instruction. And you can't replace it with do_div() as that would
>>> impose massive overhead on those architectures in the fast path.
>>>
>>
>> Could we do the same kind of scaling-by-multiplication that we do in
>> kernel/time.c for this?
>
> Not sure what you are referring to. kernel/time.c contains a lot of stuff :)
>

This stuff, specifically the third clause (which incidentally could be
extended to the fourth clause without much trouble... I have
experimented with it already.)

It uses a N*N->2N multiply and a shift to do overflowless scaling; it is
±1 LSB in the upper half of the value range with can be remedied with an
additional 2N add.

-hpa

/*
* Convert jiffies to milliseconds and back.
*
* Avoid unnecessary multiplications/divisions in the
* two most common HZ cases:
*/
unsigned int jiffies_to_msecs(const unsigned long j)
{
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
return (MSEC_PER_SEC / HZ) * j;
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
#else
# if BITS_PER_LONG == 32
return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32; <---
# else
return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
# endif
#endif
}

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