aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2013-04-25 16:31:44 -0400
committerThomas Gleixner <tglx@linutronix.de>2013-05-16 05:09:14 -0400
commitba919d1caa2e624eb8c6cae1f2ce0a253e697d45 (patch)
tree3f1ca3d84720e41093cd6723ff4a92122ecfec2e /kernel
parent5d33b883aed81c6fbcd09c6f7c3619eee850a7e2 (diff)
clocksource: Let timekeeping_notify return success/error
timekeeping_notify() can fail due cs->enable() failure. Though the caller does not notice and happily keeps the wrong clocksource as the current one. Let the caller know about failure, so the current clocksource will be shown correctly in sysfs. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: John Stultz <john.stultz@linaro.org> Cc: Magnus Damm <magnus.damm@gmail.com> Link: http://lkml.kernel.org/r/20130425143435.696321912@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/time/clocksource.c6
-rw-r--r--kernel/time/timekeeping.c5
2 files changed, 6 insertions, 5 deletions
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index dda5c7130d93..1923a340bd91 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -611,10 +611,10 @@ static void clocksource_select(void)
611 best = cs; 611 best = cs;
612 break; 612 break;
613 } 613 }
614 if (curr_clocksource != best) { 614
615 printk(KERN_INFO "Switching to clocksource %s\n", best->name); 615 if (curr_clocksource != best && !timekeeping_notify(best)) {
616 pr_info("Switched to clocksource %s\n", best->name);
616 curr_clocksource = best; 617 curr_clocksource = best;
617 timekeeping_notify(curr_clocksource);
618 } 618 }
619} 619}
620 620
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 98cd470bbe49..da6e10c7a378 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -648,14 +648,15 @@ static int change_clocksource(void *data)
648 * This function is called from clocksource.c after a new, better clock 648 * This function is called from clocksource.c after a new, better clock
649 * source has been registered. The caller holds the clocksource_mutex. 649 * source has been registered. The caller holds the clocksource_mutex.
650 */ 650 */
651void timekeeping_notify(struct clocksource *clock) 651int timekeeping_notify(struct clocksource *clock)
652{ 652{
653 struct timekeeper *tk = &timekeeper; 653 struct timekeeper *tk = &timekeeper;
654 654
655 if (tk->clock == clock) 655 if (tk->clock == clock)
656 return; 656 return 0;
657 stop_machine(change_clocksource, clock, NULL); 657 stop_machine(change_clocksource, clock, NULL);
658 tick_clock_notify(); 658 tick_clock_notify();
659 return tk->clock == clock ? 0 : -1;
659} 660}
660 661
661/** 662/**