clocksource: Allow clocksource select to skip current clocksource
Preparatory patch for clocksource unbind support. Split out code from clocksource_select and modify it, so it skips the current clocksource on request and tries to find a fallback clocksource. Convert all existing users. No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: John Stultz <john.stultz@linaro.org> Cc: Magnus Damm <magnus.damm@gmail.com> Link: http://lkml.kernel.org/r/20130425143435.834965397@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Родитель
09ac369c82
Коммит
f5a2e34375
|
@ -553,7 +553,7 @@ static u64 clocksource_max_deferment(struct clocksource *cs)
|
|||
|
||||
#ifndef CONFIG_ARCH_USES_GETTIMEOFFSET
|
||||
|
||||
static struct clocksource *clocksource_find_best(bool oneshot)
|
||||
static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur)
|
||||
{
|
||||
struct clocksource *cs;
|
||||
|
||||
|
@ -566,6 +566,8 @@ static struct clocksource *clocksource_find_best(bool oneshot)
|
|||
* the best rating.
|
||||
*/
|
||||
list_for_each_entry(cs, &clocksource_list, list) {
|
||||
if (skipcur && cs == curr_clocksource)
|
||||
continue;
|
||||
if (oneshot && !(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES))
|
||||
continue;
|
||||
return cs;
|
||||
|
@ -573,26 +575,20 @@ static struct clocksource *clocksource_find_best(bool oneshot)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* clocksource_select - Select the best clocksource available
|
||||
*
|
||||
* Private function. Must hold clocksource_mutex when called.
|
||||
*
|
||||
* Select the clocksource with the best rating, or the clocksource,
|
||||
* which is selected by userspace override.
|
||||
*/
|
||||
static void clocksource_select(void)
|
||||
static void __clocksource_select(bool skipcur)
|
||||
{
|
||||
bool oneshot = tick_oneshot_mode_active();
|
||||
struct clocksource *best, *cs;
|
||||
|
||||
/* Find the best suitable clocksource */
|
||||
best = clocksource_find_best(oneshot);
|
||||
best = clocksource_find_best(oneshot, skipcur);
|
||||
if (!best)
|
||||
return;
|
||||
|
||||
/* Check for the override clocksource. */
|
||||
list_for_each_entry(cs, &clocksource_list, list) {
|
||||
if (skipcur && cs == curr_clocksource)
|
||||
continue;
|
||||
if (strcmp(cs->name, override_name) != 0)
|
||||
continue;
|
||||
/*
|
||||
|
@ -618,6 +614,19 @@ static void clocksource_select(void)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* clocksource_select - Select the best clocksource available
|
||||
*
|
||||
* Private function. Must hold clocksource_mutex when called.
|
||||
*
|
||||
* Select the clocksource with the best rating, or the clocksource,
|
||||
* which is selected by userspace override.
|
||||
*/
|
||||
static void clocksource_select(void)
|
||||
{
|
||||
return __clocksource_select(false);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */
|
||||
|
||||
static inline void clocksource_select(void) { }
|
||||
|
|
Загрузка…
Ссылка в новой задаче