On Tue, Mar 05, 2013 at 02:27:34PM +0800, John Stultz wrote:I'd maybe add it to the clocksource code rather then the timekeeper. Have a clocksource_nonstop_clock() accessor which returns a pointer to the highest rated clocksource in the clocksource list that has the nonstop flag (updating the pointer at registration time, rather then scanning the list every time).
Yeah, I just realized this when Jason mentioned the counter_32k on
So this might be ok for an initial implementation, as on the
non-stop-tsc hardware, the TSC is the best clocksource available.
One concern long term is that there may be cases where the non-stop
clocksource is not the most performant clocksource on a system. In
that case, we may want to use a non-stop clocksource that is not the
current timekeeping clocksource. So that may require some extra
clocksource core interfaces to access the non-stop clocksource
instead of using the timekeeper's clocksource, also we'll have to be
sure to use something other then cycle_last in that case, since
we'll need to read the nonstop clocksource at suspend, rather then
trusting that forward_now updates cycle_last as is done here.
OMAP.
So for next step, we may add something in timekeeping.c like
static struct clocksource *suspend_time_cs;
read and save its counter righer before entering and after getting
out of suspended state. And create a new struct which includes
all time suspend related flags, counters, pointers, make it as a
member of struct timekeeper. Comments?