On Thu, Jul 10, 2025 at 8:23 AM Samuel Zhang <guoqing.zh...@amd.com> wrote: > > dev_pm_ops.thaw() is called in following cases: > * normal case: after hibernation image has been created. > * error case 1: creation of a hibernation image has failed. > * error case 2: restoration from a hibernation image has failed. > > For normal case, it is called mainly for resume storage devices for > saving the hibernation image. Other devices that are not involved > in the image saving do not need to resume the device. But since there's > no api to know which case thaw() is called, device drivers can't > conditionally resume device in thaw(). > > The new pm_hibernate_is_recovering() is such a api to query if thaw() is > called in normal case. > > Signed-off-by: Samuel Zhang <guoqing.zh...@amd.com>
LGTM now, so Acked-by: Rafael J. Wysocki <raf...@kernel.org> > --- > drivers/base/power/main.c | 14 ++++++++++++++ > include/linux/suspend.h | 2 ++ > 2 files changed, 16 insertions(+) > > diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c > index 24ebe7a635a7..c4817b379230 100644 > --- a/drivers/base/power/main.c > +++ b/drivers/base/power/main.c > @@ -66,6 +66,20 @@ static pm_message_t pm_transition; > static DEFINE_MUTEX(async_wip_mtx); > static int async_error; > > +/** > + * pm_hibernate_is_recovering - if recovering from hibernate due to error. > + * > + * Used to query if dev_pm_ops.thaw() is called for normal hibernation case > or > + * recovering from some error. > + * > + * Return: true for error case, false for normal case. > + */ > +bool pm_hibernate_is_recovering(void) > +{ > + return pm_transition.event == PM_EVENT_RECOVER; > +} > +EXPORT_SYMBOL_GPL(pm_hibernate_is_recovering); > + > static const char *pm_verb(int event) > { > switch (event) { > diff --git a/include/linux/suspend.h b/include/linux/suspend.h > index 6a3f92098872..d11a124b7a91 100644 > --- a/include/linux/suspend.h > +++ b/include/linux/suspend.h > @@ -426,6 +426,8 @@ int is_hibernate_resume_dev(dev_t dev); > static inline int is_hibernate_resume_dev(dev_t dev) { return 0; } > #endif > > +bool pm_hibernate_is_recovering(void); > + > /* Hibernation and suspend events */ > #define PM_HIBERNATION_PREPARE 0x0001 /* Going to hibernate */ > #define PM_POST_HIBERNATION 0x0002 /* Hibernation finished */ > -- > 2.43.5 >