[PATCH v2] ARM: sched_clock: allow sched_clock to be selected at runtime
Marc Zyngier
marc.zyngier at arm.com
Tue Aug 30 09:56:25 EDT 2011
On 16/08/11 01:00, Nicolas Pitre wrote:
Hi Nicolas,
> On Thu, 11 Aug 2011, Marc Zyngier wrote:
>
>> sched_clock() is yet another blocker on the road to the single
>> image. This patch implements an idea by Russell King:
>>
>> http://www.spinics.net/lists/linux-omap/msg49561.html
>>
>> Instead of asking the platform to implement both sched_clock()
>> itself and the rollover callback, simply register a read()
>> function, and let the ARM code care about sched_clock() itself,
>> the conversion to ns and the rollover. sched_clock() uses
>> this read() function as an indirection to the platform code.
>>
>> This allow some simplifications and possibly some footprint gain
>> when multiple platforms are compiled in. Among the drawbacks,
>> the removal of the *_fixed_sched_clock optimization which could
>> negatively impact some platforms (sa1100, tegra, versatile
>> and omap).
>>
>> Tested on 11MPCore, OMAP4 and Tegra.
>
> [...]
>
>> +unsigned long long notrace sched_clock(void)
>> +{
>> + if (read_sched_clock) {
>> + u32 cyc = read_sched_clock();
>> + return cyc_to_sched_clock(&cd, cyc, sched_clock_mask);
>> + }
>> +
>> + return (unsigned long long)(jiffies - INITIAL_JIFFIES)
>> + * (NSEC_PER_SEC / HZ);
>> +}
>
> This bothers me that this function has to include a conditional which
> will _always_ be evaluated as true except during early boot. Why not
> simply initializing read_sched_clock with a jiffy_shed_clock function
> instead, and let it be overriden during boot? This way the actual
> sched_clock() code will be more straight forward.
Good point. I'll send an updated patch in a minute.
> Of course there is the race where read_sched_clock might be updated
> before or after the corresponding clock data/mask are updated leading to
> funky results if you are lucky enough to call sched_clock() during that
> exact wrong moment. But either we don't care (switching from a jiffy to
> a hardware clock base is going to cause quite a glitch already anyway),
> or simply disabling IRQs during initialization should prevent the race
> (presuming no other CPUs are running at that point).
I've added a check that interrupts are disabled at that point (which
should always be true anyway).
Thanks for reviewing,
M.
--
Jazz is not dead. It just smells funny...
More information about the linux-arm-kernel
mailing list