Loading drivers/clocksource/arm_arch_timer.c +1 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,7 @@ static void __init arch_timer_common_init(void) arch_timer_banner(arch_timers_present); arch_counter_register(arch_timers_present); arch_timer_arch_init(); clocksource_select_force(); } static void __init arch_timer_init(struct device_node *np) Loading include/linux/clocksource.h +1 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ extern void clocksource_suspend(void); extern void clocksource_resume(void); extern struct clocksource * __init clocksource_default_clock(void); extern void clocksource_mark_unstable(struct clocksource *cs); extern void clocksource_select_force(void); extern u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask); Loading kernel/time/clocksource.c +33 −15 Original line number Diff line number Diff line Loading @@ -182,7 +182,7 @@ static int finished_booting; #ifdef CONFIG_CLOCKSOURCE_WATCHDOG static void clocksource_watchdog_work(struct work_struct *work); static void clocksource_select(void); static void clocksource_select(bool force); static LIST_HEAD(watchdog_list); static struct clocksource *watchdog; Loading Loading @@ -459,7 +459,7 @@ static int clocksource_watchdog_kthread(void *data) { mutex_lock(&clocksource_mutex); if (__clocksource_watchdog_kthread()) clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading Loading @@ -600,11 +600,12 @@ static u64 clocksource_max_deferment(struct clocksource *cs) #ifndef CONFIG_ARCH_USES_GETTIMEOFFSET static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur) static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur, bool force) { struct clocksource *cs; if (!finished_booting || list_empty(&clocksource_list)) if ((!finished_booting && !force) || list_empty(&clocksource_list)) return NULL; /* Loading @@ -622,13 +623,13 @@ static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur) return NULL; } static void __clocksource_select(bool skipcur) static void __clocksource_select(bool skipcur, bool force) { bool oneshot = tick_oneshot_mode_active(); struct clocksource *best, *cs; /* Find the best suitable clocksource */ best = clocksource_find_best(oneshot, skipcur); best = clocksource_find_best(oneshot, skipcur, force); if (!best) return; Loading Loading @@ -669,23 +670,40 @@ static void __clocksource_select(bool skipcur) * 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 force) { return __clocksource_select(false); return __clocksource_select(false, force); } static void clocksource_select_fallback(void) { return __clocksource_select(true); return __clocksource_select(true, false); } #else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */ static inline void clocksource_select(void) { } static inline void clocksource_select(bool force) { } static inline void clocksource_select_fallback(void) { } #endif /** * clocksource_select_force - Force re-selection of the best clocksource * among registered clocksources * * clocksource_select() can't select the best clocksource before * calling clocksource_done_booting() and since clocksource_select() * should be called with clocksource_mutex held, provide a new API * can be called from other files to select best clockrouce irrespective * of finished_booting flag. */ void clocksource_select_force(void) { mutex_lock(&clocksource_mutex); clocksource_select(true); mutex_unlock(&clocksource_mutex); } /* * clocksource_done_booting - Called near the end of core bootup * Loading @@ -702,7 +720,7 @@ static int __init clocksource_done_booting(void) * Run the watchdog first to eliminate unstable clock sources */ __clocksource_watchdog_kthread(); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading Loading @@ -796,7 +814,7 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); clocksource_enqueue_watchdog(cs); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading @@ -823,7 +841,7 @@ int clocksource_register(struct clocksource *cs) mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); clocksource_enqueue_watchdog(cs); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading @@ -845,7 +863,7 @@ void clocksource_change_rating(struct clocksource *cs, int rating) { mutex_lock(&clocksource_mutex); __clocksource_change_rating(cs, rating); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); } EXPORT_SYMBOL(clocksource_change_rating); Loading Loading @@ -948,7 +966,7 @@ static ssize_t sysfs_override_clocksource(struct device *dev, ret = sysfs_get_uname(buf, override_name, count); if (ret >= 0) clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); Loading Loading
drivers/clocksource/arm_arch_timer.c +1 −0 Original line number Diff line number Diff line Loading @@ -714,6 +714,7 @@ static void __init arch_timer_common_init(void) arch_timer_banner(arch_timers_present); arch_counter_register(arch_timers_present); arch_timer_arch_init(); clocksource_select_force(); } static void __init arch_timer_init(struct device_node *np) Loading
include/linux/clocksource.h +1 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,7 @@ extern void clocksource_suspend(void); extern void clocksource_resume(void); extern struct clocksource * __init clocksource_default_clock(void); extern void clocksource_mark_unstable(struct clocksource *cs); extern void clocksource_select_force(void); extern u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask); Loading
kernel/time/clocksource.c +33 −15 Original line number Diff line number Diff line Loading @@ -182,7 +182,7 @@ static int finished_booting; #ifdef CONFIG_CLOCKSOURCE_WATCHDOG static void clocksource_watchdog_work(struct work_struct *work); static void clocksource_select(void); static void clocksource_select(bool force); static LIST_HEAD(watchdog_list); static struct clocksource *watchdog; Loading Loading @@ -459,7 +459,7 @@ static int clocksource_watchdog_kthread(void *data) { mutex_lock(&clocksource_mutex); if (__clocksource_watchdog_kthread()) clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading Loading @@ -600,11 +600,12 @@ static u64 clocksource_max_deferment(struct clocksource *cs) #ifndef CONFIG_ARCH_USES_GETTIMEOFFSET static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur) static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur, bool force) { struct clocksource *cs; if (!finished_booting || list_empty(&clocksource_list)) if ((!finished_booting && !force) || list_empty(&clocksource_list)) return NULL; /* Loading @@ -622,13 +623,13 @@ static struct clocksource *clocksource_find_best(bool oneshot, bool skipcur) return NULL; } static void __clocksource_select(bool skipcur) static void __clocksource_select(bool skipcur, bool force) { bool oneshot = tick_oneshot_mode_active(); struct clocksource *best, *cs; /* Find the best suitable clocksource */ best = clocksource_find_best(oneshot, skipcur); best = clocksource_find_best(oneshot, skipcur, force); if (!best) return; Loading Loading @@ -669,23 +670,40 @@ static void __clocksource_select(bool skipcur) * 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 force) { return __clocksource_select(false); return __clocksource_select(false, force); } static void clocksource_select_fallback(void) { return __clocksource_select(true); return __clocksource_select(true, false); } #else /* !CONFIG_ARCH_USES_GETTIMEOFFSET */ static inline void clocksource_select(void) { } static inline void clocksource_select(bool force) { } static inline void clocksource_select_fallback(void) { } #endif /** * clocksource_select_force - Force re-selection of the best clocksource * among registered clocksources * * clocksource_select() can't select the best clocksource before * calling clocksource_done_booting() and since clocksource_select() * should be called with clocksource_mutex held, provide a new API * can be called from other files to select best clockrouce irrespective * of finished_booting flag. */ void clocksource_select_force(void) { mutex_lock(&clocksource_mutex); clocksource_select(true); mutex_unlock(&clocksource_mutex); } /* * clocksource_done_booting - Called near the end of core bootup * Loading @@ -702,7 +720,7 @@ static int __init clocksource_done_booting(void) * Run the watchdog first to eliminate unstable clock sources */ __clocksource_watchdog_kthread(); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading Loading @@ -796,7 +814,7 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); clocksource_enqueue_watchdog(cs); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading @@ -823,7 +841,7 @@ int clocksource_register(struct clocksource *cs) mutex_lock(&clocksource_mutex); clocksource_enqueue(cs); clocksource_enqueue_watchdog(cs); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); return 0; } Loading @@ -845,7 +863,7 @@ void clocksource_change_rating(struct clocksource *cs, int rating) { mutex_lock(&clocksource_mutex); __clocksource_change_rating(cs, rating); clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); } EXPORT_SYMBOL(clocksource_change_rating); Loading Loading @@ -948,7 +966,7 @@ static ssize_t sysfs_override_clocksource(struct device *dev, ret = sysfs_get_uname(buf, override_name, count); if (ret >= 0) clocksource_select(); clocksource_select(false); mutex_unlock(&clocksource_mutex); Loading