]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - kernel/freezer.c
Merge branch 'for-3.11' of git://linux-nfs.org/~bfields/linux
[karo-tx-linux.git] / kernel / freezer.c
index c38893b0efbaa39d770b11546dba9e97ec53ff51..8b2afc1c9df0c698eccd86664d25c33ed647fea7 100644 (file)
@@ -110,6 +110,18 @@ bool freeze_task(struct task_struct *p)
 {
        unsigned long flags;
 
+       /*
+        * This check can race with freezer_do_not_count, but worst case that
+        * will result in an extra wakeup being sent to the task.  It does not
+        * race with freezer_count(), the barriers in freezer_count() and
+        * freezer_should_skip() ensure that either freezer_count() sees
+        * freezing == true in try_to_freeze() and freezes, or
+        * freezer_should_skip() sees !PF_FREEZE_SKIP and freezes the task
+        * normally.
+        */
+       if (freezer_should_skip(p))
+               return false;
+
        spin_lock_irqsave(&freezer_lock, flags);
        if (!freezing(p) || frozen(p)) {
                spin_unlock_irqrestore(&freezer_lock, flags);