Thread (51 messages) 51 messages, 11 authors, 2011-06-13
STALE5480d

[patch 07/16] arm: omap: Use clocksource based sched_clock

From: tony@atomide.com (Tony Lindgren)
Date: 2011-05-02 08:10:28

* Thomas Gleixner [off-list ref] [110429 07:16]:
On Fri, 29 Apr 2011, Tony Lindgren wrote:
quoted
* Thomas Gleixner [off-list ref] [110429 05:25]:
quoted
The generic sched_clock implementation returns a jiffies based value
as long as there is no clocksource registered. But the above does not
fail in sched_clock() it fails in read_persistent_clock() which does

        last_cycles = cycles;
        cycles = clocksource_32k.read(&clocksource_32k);

So the following change causes this:

-     .read           = omap_32k_read_dummy,
Ah right.
 
quoted
Which leads to the question why you have a read_persistent_clock() at
all if it always reads 0 via omap_32k_read_dummy ? Or is this meant
just for the resume case? Then the above and the removal of
omap_32k_read_dummy() needs to be undone.
The omap_32k_read_dummy needs to return 0 until the clocks are
enabled and the right read function is selected. The .read gets
then set in omap_init_clocksource_32k.

It would be nice to handle that in a generic way though,
I would assume the same issue exists for other platforms too.
static inline cycles_t clocksource_read_safe(struct clocksource *c)
{
	return c->read ? c->read(c) : 0;
}
That adds testing for it for each read.. So the current setup
is better.
 
For the core timekeeping code that's a non issue as nothing should
register a clocksource with an invalid read function pointer :)
Looks like omap_device code calls read_persistent_clock before
omap_init_clocksource_32k is run. I'll take a look and see if that
is needed when I refresh other omap init_early patches.

Anyways, currently nothing prevents calling read_persistent_clock
before it's initialized and a platform specific hack is needed.
Maybe the default should be clocksource_read_safe that gets
changed by the platform code when initializing?

Regards,

Tony
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help