Diffstat (limited to 'include/linux/suspend.h')
1 files changed, 17 insertions, 2 deletions
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 95040cc33107..91784a4f8608 100644
@@ -357,14 +357,29 @@ extern bool pm_save_wakeup_count(unsigned int count);
static inline void lock_system_sleep(void)
+ current->flags |= PF_FREEZER_SKIP;
static inline void unlock_system_sleep(void)
+ * Don't use freezer_count() because we don't want the call to
+ * try_to_freeze() here.
+ * Reason:
+ * Fundamentally, we just don't need it, because freezing condition
+ * doesn't come into effect until we release the pm_mutex lock,
+ * since the freezer always works with pm_mutex held.
+ * More importantly, in the case of hibernation,
+ * unlock_system_sleep() gets called in snapshot_read() and
+ * snapshot_write() when the freezing condition is still in effect.
+ * Which means, if we use try_to_freeze() here, it would make them
+ * enter the refrigerator, thus causing hibernation to lockup.
+ current->flags &= ~PF_FREEZER_SKIP;
#else /* !CONFIG_PM_SLEEP */