|
@@ -389,28 +389,17 @@ static void clocksource_enqueue_watchdog(struct clocksource *cs)
|
|
|
|
|
|
static void clocksource_dequeue_watchdog(struct clocksource *cs)
|
|
|
{
|
|
|
- struct clocksource *tmp;
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&watchdog_lock, flags);
|
|
|
- if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) {
|
|
|
- /* cs is a watched clocksource. */
|
|
|
- list_del_init(&cs->wd_list);
|
|
|
- } else if (cs == watchdog) {
|
|
|
- /* Reset watchdog cycles */
|
|
|
- clocksource_reset_watchdog();
|
|
|
- /* Current watchdog is removed. Find an alternative. */
|
|
|
- watchdog = NULL;
|
|
|
- list_for_each_entry(tmp, &clocksource_list, list) {
|
|
|
- if (tmp == cs || tmp->flags & CLOCK_SOURCE_MUST_VERIFY)
|
|
|
- continue;
|
|
|
- if (!watchdog || tmp->rating > watchdog->rating)
|
|
|
- watchdog = tmp;
|
|
|
+ if (cs != watchdog) {
|
|
|
+ if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) {
|
|
|
+ /* cs is a watched clocksource. */
|
|
|
+ list_del_init(&cs->wd_list);
|
|
|
+ /* Check if the watchdog timer needs to be stopped. */
|
|
|
+ clocksource_stop_watchdog();
|
|
|
}
|
|
|
}
|
|
|
- cs->flags &= ~CLOCK_SOURCE_WATCHDOG;
|
|
|
- /* Check if the watchdog timer needs to be stopped. */
|
|
|
- clocksource_stop_watchdog();
|
|
|
spin_unlock_irqrestore(&watchdog_lock, flags);
|
|
|
}
|
|
|
|
|
@@ -841,13 +830,15 @@ static int clocksource_unbind(struct clocksource *cs)
|
|
|
* clocksource_unregister - remove a registered clocksource
|
|
|
* @cs: clocksource to be unregistered
|
|
|
*/
|
|
|
-void clocksource_unregister(struct clocksource *cs)
|
|
|
+int clocksource_unregister(struct clocksource *cs)
|
|
|
{
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
mutex_lock(&clocksource_mutex);
|
|
|
- clocksource_dequeue_watchdog(cs);
|
|
|
- list_del(&cs->list);
|
|
|
- clocksource_select();
|
|
|
+ if (!list_empty(&cs->list))
|
|
|
+ ret = clocksource_unbind(cs);
|
|
|
mutex_unlock(&clocksource_mutex);
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL(clocksource_unregister);
|
|
|
|