diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/suspend.h | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 95040cc33107..91784a4f8608 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -357,14 +357,29 @@ extern bool pm_save_wakeup_count(unsigned int count); | |||
| 357 | 357 | ||
| 358 | static inline void lock_system_sleep(void) | 358 | static inline void lock_system_sleep(void) |
| 359 | { | 359 | { |
| 360 | freezer_do_not_count(); | 360 | current->flags |= PF_FREEZER_SKIP; |
| 361 | mutex_lock(&pm_mutex); | 361 | mutex_lock(&pm_mutex); |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | static inline void unlock_system_sleep(void) | 364 | static inline void unlock_system_sleep(void) |
| 365 | { | 365 | { |
| 366 | /* | ||
| 367 | * Don't use freezer_count() because we don't want the call to | ||
| 368 | * try_to_freeze() here. | ||
| 369 | * | ||
| 370 | * Reason: | ||
| 371 | * Fundamentally, we just don't need it, because freezing condition | ||
| 372 | * doesn't come into effect until we release the pm_mutex lock, | ||
| 373 | * since the freezer always works with pm_mutex held. | ||
| 374 | * | ||
| 375 | * More importantly, in the case of hibernation, | ||
| 376 | * unlock_system_sleep() gets called in snapshot_read() and | ||
| 377 | * snapshot_write() when the freezing condition is still in effect. | ||
| 378 | * Which means, if we use try_to_freeze() here, it would make them | ||
| 379 | * enter the refrigerator, thus causing hibernation to lockup. | ||
| 380 | */ | ||
| 381 | current->flags &= ~PF_FREEZER_SKIP; | ||
| 366 | mutex_unlock(&pm_mutex); | 382 | mutex_unlock(&pm_mutex); |
| 367 | freezer_count(); | ||
| 368 | } | 383 | } |
| 369 | 384 | ||
| 370 | #else /* !CONFIG_PM_SLEEP */ | 385 | #else /* !CONFIG_PM_SLEEP */ |
