These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / kernel / power / suspend.c
index db920b1..393bc34 100644 (file)
@@ -35,6 +35,9 @@
 const char *pm_labels[] = { "mem", "standby", "freeze", NULL };
 const char *pm_states[PM_SUSPEND_MAX];
 
+unsigned int pm_suspend_global_flags;
+EXPORT_SYMBOL_GPL(pm_suspend_global_flags);
+
 static const struct platform_suspend_ops *suspend_ops;
 static const struct platform_freeze_ops *freeze_ops;
 static DECLARE_WAIT_QUEUE_HEAD(suspend_freeze_wait_head);
@@ -368,6 +371,8 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
                        trace_suspend_resume(TPS("machine_suspend"),
                                state, false);
                        events_check_enabled = false;
+               } else if (*wakeup) {
+                       error = -EBUSY;
                }
                syscore_resume();
        }
@@ -472,7 +477,7 @@ static int enter_state(suspend_state_t state)
        if (state == PM_SUSPEND_FREEZE) {
 #ifdef CONFIG_PM_DEBUG
                if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) {
-                       pr_warning("PM: Unsupported test mode for freeze state,"
+                       pr_warning("PM: Unsupported test mode for suspend to idle,"
                                   "please choose none/freezer/devices/platform.\n");
                        return -EAGAIN;
                }
@@ -486,13 +491,16 @@ static int enter_state(suspend_state_t state)
        if (state == PM_SUSPEND_FREEZE)
                freeze_begin();
 
+#ifndef CONFIG_SUSPEND_SKIP_SYNC
        trace_suspend_resume(TPS("sync_filesystems"), 0, true);
        printk(KERN_INFO "PM: Syncing filesystems ... ");
        sys_sync();
        printk("done.\n");
        trace_suspend_resume(TPS("sync_filesystems"), 0, false);
+#endif
 
-       pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
+       pr_debug("PM: Preparing system for sleep (%s)\n", pm_states[state]);
+       pm_suspend_clear_flags();
        error = suspend_prepare(state);
        if (error)
                goto Unlock;
@@ -501,7 +509,7 @@ static int enter_state(suspend_state_t state)
                goto Finish;
 
        trace_suspend_resume(TPS("suspend_enter"), state, false);
-       pr_debug("PM: Entering %s sleep\n", pm_states[state]);
+       pr_debug("PM: Suspending system (%s)\n", pm_states[state]);
        pm_restrict_gfp_mask();
        error = suspend_devices_and_enter(state);
        pm_restore_gfp_mask();
@@ -514,6 +522,8 @@ static int enter_state(suspend_state_t state)
        return error;
 }
 
+bool pm_in_action;
+
 /**
  * pm_suspend - Externally visible function for suspending the system.
  * @state: System sleep state to enter.
@@ -528,6 +538,8 @@ int pm_suspend(suspend_state_t state)
        if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
                return -EINVAL;
 
+       pm_in_action = true;
+
        error = enter_state(state);
        if (error) {
                suspend_stats.fail++;
@@ -535,6 +547,7 @@ int pm_suspend(suspend_state_t state)
        } else {
                suspend_stats.success++;
        }
+       pm_in_action = false;
        return error;
 }
 EXPORT_SYMBOL(pm_suspend);