From 16f497a87ddfb74802858f8d1e55016a2f96c062 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sat, 15 Aug 2009 13:20:42 +0200 Subject: [PATCH] --- yaml --- r: 163071 b: refs/heads/master c: 6ea41d252f35465a2308a4038a323b6b07de06f6 h: refs/heads/master i: 163069: b2af9372eaa31940924485e46ff9e4afb9c319fd 163067: ba7e50fb31f8957119c4b9b8dccbea7984b7552d 163063: 84ca924b3a2bc33710a7b882adbc5e72856ab22f 163055: 8adfb71af758583b366f25df47de962f2428f96b 163039: 3452d3018998e8326463289142ead641ba9c18b5 163007: 21b9d1ba1c6bd76ee630481364e2cce7651510c4 162943: 60cebe31ca483d908af12d45ec221da96ab9a2cd 162815: 78e05b1b98d8389846332ab559dacdf02bbac17c v: v3 --- [refs] | 2 +- trunk/kernel/time/clocksource.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index ba737c535372..f23513ea576f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 23970e389e9cee43c4b41023935e1417271708b2 +refs/heads/master: 6ea41d252f35465a2308a4038a323b6b07de06f6 diff --git a/trunk/kernel/time/clocksource.c b/trunk/kernel/time/clocksource.c index a1657b5fdeb9..02dc22d888fe 100644 --- a/trunk/kernel/time/clocksource.c +++ b/trunk/kernel/time/clocksource.c @@ -307,16 +307,23 @@ static void clocksource_watchdog_work(struct work_struct *work) { struct clocksource *cs, *tmp; unsigned long flags; + LIST_HEAD(unstable); spin_lock_irqsave(&watchdog_lock, flags); list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) if (cs->flags & CLOCK_SOURCE_UNSTABLE) { list_del_init(&cs->wd_list); - clocksource_change_rating(cs, 0); + list_add(&cs->wd_list, &unstable); } /* Check if the watchdog timer needs to be stopped. */ clocksource_stop_watchdog(); - spin_unlock(&watchdog_lock); + spin_unlock_irqrestore(&watchdog_lock, flags); + + /* Needs to be done outside of watchdog lock */ + list_for_each_entry_safe(cs, tmp, &unstable, wd_list) { + list_del_init(&cs->wd_list); + clocksource_change_rating(cs, 0); + } } #else /* CONFIG_CLOCKSOURCE_WATCHDOG */