Commit 9b6fc5dc879bc90f765db0e95eefcf123d0d06dd
Committed by
Rafael J. Wysocki
1 parent
33e638b907
Exists in
master
and in
6 other branches
PM / Sleep: Make [un]lock_system_sleep() generic
The [un]lock_system_sleep() APIs were originally introduced to mutually exclude memory hotplug and hibernation. Directly using mutex_lock(&pm_mutex) to achieve mutual exclusion with suspend or hibernation code can lead to freezing failures. However, the APIs [un]lock_system_sleep() can be safely used to achieve the same, without causing freezing failures. So, since it would be beneficial to modify all the existing users of mutex_lock(&pm_mutex) (in all parts of the kernel), so that they use these safe APIs intead, make these APIs generic by removing the restriction that they work only when CONFIG_HIBERNATE_CALLBACKS is set. Moreover, that restriction didn't buy us anything anyway. Suggested-by: Tejun Heo <tj@kernel.org> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Showing 1 changed file with 16 additions and 20 deletions Side-by-side Diff
include/linux/suspend.h
... | ... | @@ -332,6 +332,8 @@ |
332 | 332 | #define PM_RESTORE_PREPARE 0x0005 /* Going to restore a saved image */ |
333 | 333 | #define PM_POST_RESTORE 0x0006 /* Restore failed */ |
334 | 334 | |
335 | +extern struct mutex pm_mutex; | |
336 | + | |
335 | 337 | #ifdef CONFIG_PM_SLEEP |
336 | 338 | void save_processor_state(void); |
337 | 339 | void restore_processor_state(void); |
... | ... | @@ -352,6 +354,19 @@ |
352 | 354 | extern bool pm_wakeup_pending(void); |
353 | 355 | extern bool pm_get_wakeup_count(unsigned int *count); |
354 | 356 | extern bool pm_save_wakeup_count(unsigned int count); |
357 | + | |
358 | +static inline void lock_system_sleep(void) | |
359 | +{ | |
360 | + freezer_do_not_count(); | |
361 | + mutex_lock(&pm_mutex); | |
362 | +} | |
363 | + | |
364 | +static inline void unlock_system_sleep(void) | |
365 | +{ | |
366 | + mutex_unlock(&pm_mutex); | |
367 | + freezer_count(); | |
368 | +} | |
369 | + | |
355 | 370 | #else /* !CONFIG_PM_SLEEP */ |
356 | 371 | |
357 | 372 | static inline int register_pm_notifier(struct notifier_block *nb) |
358 | 373 | |
359 | 374 | |
... | ... | @@ -367,30 +382,11 @@ |
367 | 382 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) |
368 | 383 | |
369 | 384 | static inline bool pm_wakeup_pending(void) { return false; } |
370 | -#endif /* !CONFIG_PM_SLEEP */ | |
371 | 385 | |
372 | -extern struct mutex pm_mutex; | |
373 | - | |
374 | -#ifndef CONFIG_HIBERNATE_CALLBACKS | |
375 | 386 | static inline void lock_system_sleep(void) {} |
376 | 387 | static inline void unlock_system_sleep(void) {} |
377 | 388 | |
378 | -#else | |
379 | - | |
380 | -/* Let some subsystems like memory hotadd exclude hibernation */ | |
381 | - | |
382 | -static inline void lock_system_sleep(void) | |
383 | -{ | |
384 | - freezer_do_not_count(); | |
385 | - mutex_lock(&pm_mutex); | |
386 | -} | |
387 | - | |
388 | -static inline void unlock_system_sleep(void) | |
389 | -{ | |
390 | - mutex_unlock(&pm_mutex); | |
391 | - freezer_count(); | |
392 | -} | |
393 | -#endif | |
389 | +#endif /* !CONFIG_PM_SLEEP */ | |
394 | 390 | |
395 | 391 | #ifdef CONFIG_ARCH_SAVE_PAGE_KEYS |
396 | 392 | /* |