]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/base/power/wakeup.c
PM / Sleep: Fix possible infinite loop during wakeup source destruction
[mv-sheeva.git] / drivers / base / power / wakeup.c
index 6e591a8a49da1aa873e1ae61197abde0008c9575..d279f462d62430d225a123489fd19824f669b4b4 100644 (file)
@@ -74,22 +74,17 @@ EXPORT_SYMBOL_GPL(wakeup_source_create);
 /**
  * wakeup_source_destroy - Destroy a struct wakeup_source object.
  * @ws: Wakeup source to destroy.
+ *
+ * Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never
+ * be run in parallel with this function for the same wakeup source object.
  */
 void wakeup_source_destroy(struct wakeup_source *ws)
 {
        if (!ws)
                return;
 
-       spin_lock_irq(&ws->lock);
-       while (ws->active) {
-               spin_unlock_irq(&ws->lock);
-
-               schedule_timeout_interruptible(msecs_to_jiffies(TIMEOUT));
-
-               spin_lock_irq(&ws->lock);
-       }
-       spin_unlock_irq(&ws->lock);
-
+       del_timer_sync(&ws->timer);
+       __pm_relax(ws);
        kfree(ws->name);
        kfree(ws);
 }