On Tuesday, December 06, 2011, Srivatsa S. Bhat wrote: > 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. > > v2: Rebased on top of the patchset posted at: > https://lkml.org/lkml/2011/12/6/334 > > Suggested-by: Tejun Heo <tj@xxxxxxxxxx> > Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> All patches in this series applied to linux-pm/linux-next. Thanks, Rafael > --- > > include/linux/suspend.h | 36 ++++++++++++++++-------------------- > 1 files changed, 16 insertions(+), 20 deletions(-) > > diff --git a/include/linux/suspend.h b/include/linux/suspend.h > index 906d62c..95040cc 100644 > --- a/include/linux/suspend.h > +++ b/include/linux/suspend.h > @@ -332,6 +332,8 @@ static inline bool system_entering_hibernation(void) { return false; } > #define PM_RESTORE_PREPARE 0x0005 /* Going to restore a saved image */ > #define PM_POST_RESTORE 0x0006 /* Restore failed */ > > +extern struct mutex pm_mutex; > + > #ifdef CONFIG_PM_SLEEP > void save_processor_state(void); > void restore_processor_state(void); > @@ -352,6 +354,19 @@ extern bool events_check_enabled; > extern bool pm_wakeup_pending(void); > extern bool pm_get_wakeup_count(unsigned int *count); > extern bool pm_save_wakeup_count(unsigned int count); > + > +static inline void lock_system_sleep(void) > +{ > + freezer_do_not_count(); > + mutex_lock(&pm_mutex); > +} > + > +static inline void unlock_system_sleep(void) > +{ > + mutex_unlock(&pm_mutex); > + freezer_count(); > +} > + > #else /* !CONFIG_PM_SLEEP */ > > static inline int register_pm_notifier(struct notifier_block *nb) > @@ -367,30 +382,11 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) > #define pm_notifier(fn, pri) do { (void)(fn); } while (0) > > static inline bool pm_wakeup_pending(void) { return false; } > -#endif /* !CONFIG_PM_SLEEP */ > - > -extern struct mutex pm_mutex; > > -#ifndef CONFIG_HIBERNATE_CALLBACKS > static inline void lock_system_sleep(void) {} > static inline void unlock_system_sleep(void) {} > > -#else > - > -/* Let some subsystems like memory hotadd exclude hibernation */ > - > -static inline void lock_system_sleep(void) > -{ > - freezer_do_not_count(); > - mutex_lock(&pm_mutex); > -} > - > -static inline void unlock_system_sleep(void) > -{ > - mutex_unlock(&pm_mutex); > - freezer_count(); > -} > -#endif > +#endif /* !CONFIG_PM_SLEEP */ > > #ifdef CONFIG_ARCH_SAVE_PAGE_KEYS > /* > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html