Commit 9b6fc5dc879bc90f765db0e95eefcf123d0d06dd

Authored by Srivatsa S. Bhat
Committed by Rafael J. Wysocki
1 parent 33e638b907

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 /*