|
@@ -553,6 +553,26 @@ static u64 clocksource_max_deferment(struct clocksource *cs)
|
|
|
|
|
|
#ifndef CONFIG_ARCH_USES_GETTIMEOFFSET
|
|
|
|
|
|
+static struct clocksource *clocksource_find_best(bool oneshot)
|
|
|
+{
|
|
|
+ struct clocksource *cs;
|
|
|
+
|
|
|
+ if (!finished_booting || list_empty(&clocksource_list))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We pick the clocksource with the highest rating. If oneshot
|
|
|
+ * mode is active, we pick the highres valid clocksource with
|
|
|
+ * the best rating.
|
|
|
+ */
|
|
|
+ list_for_each_entry(cs, &clocksource_list, list) {
|
|
|
+ if (oneshot && !(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES))
|
|
|
+ continue;
|
|
|
+ return cs;
|
|
|
+ }
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* clocksource_select - Select the best clocksource available
|
|
|
*
|
|
@@ -563,12 +583,14 @@ static u64 clocksource_max_deferment(struct clocksource *cs)
|
|
|
*/
|
|
|
static void clocksource_select(void)
|
|
|
{
|
|
|
+ bool oneshot = tick_oneshot_mode_active();
|
|
|
struct clocksource *best, *cs;
|
|
|
|
|
|
- if (!finished_booting || list_empty(&clocksource_list))
|
|
|
+ /* Find the best suitable clocksource */
|
|
|
+ best = clocksource_find_best(oneshot);
|
|
|
+ if (!best)
|
|
|
return;
|
|
|
- /* First clocksource on the list has the best rating. */
|
|
|
- best = list_first_entry(&clocksource_list, struct clocksource, list);
|
|
|
+
|
|
|
/* Check for the override clocksource. */
|
|
|
list_for_each_entry(cs, &clocksource_list, list) {
|
|
|
if (strcmp(cs->name, override_name) != 0)
|
|
@@ -578,8 +600,7 @@ static void clocksource_select(void)
|
|
|
* capable clocksource if the tick code is in oneshot
|
|
|
* mode (highres or nohz)
|
|
|
*/
|
|
|
- if (!(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES) &&
|
|
|
- tick_oneshot_mode_active()) {
|
|
|
+ if (!(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES) && oneshot) {
|
|
|
/* Override clocksource cannot be used. */
|
|
|
printk(KERN_WARNING "Override clocksource %s is not "
|
|
|
"HRT compatible. Cannot switch while in "
|