|
@@ -52,39 +52,29 @@ bool __refrigerator(bool check_kthr_stop)
|
|
|
/* Hmm, should we be allowed to suspend when there are realtime
|
|
|
processes around? */
|
|
|
bool was_frozen = false;
|
|
|
- long save;
|
|
|
+ long save = current->state;
|
|
|
|
|
|
- /*
|
|
|
- * No point in checking freezing() again - the caller already did.
|
|
|
- * Proceed to enter FROZEN.
|
|
|
- */
|
|
|
- spin_lock_irq(&freezer_lock);
|
|
|
-repeat:
|
|
|
- current->flags |= PF_FROZEN;
|
|
|
- spin_unlock_irq(&freezer_lock);
|
|
|
-
|
|
|
- save = current->state;
|
|
|
pr_debug("%s entered refrigerator\n", current->comm);
|
|
|
|
|
|
- spin_lock_irq(¤t->sighand->siglock);
|
|
|
- recalc_sigpending(); /* We sent fake signal, clean it up */
|
|
|
- spin_unlock_irq(¤t->sighand->siglock);
|
|
|
-
|
|
|
for (;;) {
|
|
|
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
|
+
|
|
|
+ spin_lock_irq(&freezer_lock);
|
|
|
+ current->flags |= PF_FROZEN;
|
|
|
if (!freezing(current) ||
|
|
|
(check_kthr_stop && kthread_should_stop()))
|
|
|
+ current->flags &= ~PF_FROZEN;
|
|
|
+ spin_unlock_irq(&freezer_lock);
|
|
|
+
|
|
|
+ if (!(current->flags & PF_FROZEN))
|
|
|
break;
|
|
|
was_frozen = true;
|
|
|
schedule();
|
|
|
}
|
|
|
|
|
|
- /* leave FROZEN */
|
|
|
- spin_lock_irq(&freezer_lock);
|
|
|
- if (freezing(current))
|
|
|
- goto repeat;
|
|
|
- current->flags &= ~PF_FROZEN;
|
|
|
- spin_unlock_irq(&freezer_lock);
|
|
|
+ spin_lock_irq(¤t->sighand->siglock);
|
|
|
+ recalc_sigpending(); /* We sent fake signal, clean it up */
|
|
|
+ spin_unlock_irq(¤t->sighand->siglock);
|
|
|
|
|
|
pr_debug("%s left refrigerator\n", current->comm);
|
|
|
|