]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - kernel/sched/swait.c
Apply preempt_rt patch-4.9-rt1.patch.xz
[zynq/linux.git] / kernel / sched / swait.c
index 82f0dff90030fcda10b7a1597636743104f723dc..ef027ff3250ac34ebfade967060c996144d6d3a7 100644 (file)
@@ -1,5 +1,6 @@
 #include <linux/sched.h>
 #include <linux/swait.h>
+#include <linux/suspend.h>
 
 void __init_swait_queue_head(struct swait_queue_head *q, const char *name,
                             struct lock_class_key *key)
@@ -29,6 +30,25 @@ void swake_up_locked(struct swait_queue_head *q)
 }
 EXPORT_SYMBOL(swake_up_locked);
 
+void swake_up_all_locked(struct swait_queue_head *q)
+{
+       struct swait_queue *curr;
+       int wakes = 0;
+
+       while (!list_empty(&q->task_list)) {
+
+               curr = list_first_entry(&q->task_list, typeof(*curr),
+                                       task_list);
+               wake_up_process(curr->task);
+               list_del_init(&curr->task_list);
+               wakes++;
+       }
+       if (pm_in_action)
+               return;
+       WARN(wakes > 2, "complete_all() with %d waiters\n", wakes);
+}
+EXPORT_SYMBOL(swake_up_all_locked);
+
 void swake_up(struct swait_queue_head *q)
 {
        unsigned long flags;
@@ -54,6 +74,7 @@ void swake_up_all(struct swait_queue_head *q)
        if (!swait_active(q))
                return;
 
+       WARN_ON(irqs_disabled());
        raw_spin_lock_irq(&q->lock);
        list_splice_init(&q->task_list, &tmp);
        while (!list_empty(&tmp)) {