* [PATCH v3 0/3] Fixes for hybrid sleep
@ 2025-09-25 18:51 Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 1/3] PM: hibernate: Fix hybrid-sleep Mario Limonciello (AMD)
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Mario Limonciello (AMD) @ 2025-09-25 18:51 UTC (permalink / raw)
To: Rafael J . Wysocki
Cc: Samuel Zhang, open list:RADEON and AMDGPU DRM DRIVERS,
open list:HIBERNATION (aka Software Suspend, aka swsusp),
Mario Limonciello
From: Mario Limonciello <mario.limonciello@amd.com>
Ionut Nechita reported recently a hibernate failure, but in debugging
the issue it's actually not a hibernate failure; but a hybrid sleep
failure.
Multiple changes related to the change of when swap is disabled in
the suspend sequence contribute to the failure. See the individual
patches for details.
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/4573
As it touches two subsystems it either needs to go through linux-pm
or drm. Patch 3 has an Ack from Alex, this should merge through
linux-pm.
---
v3:
* Push all calls for gfp mask changes into power_down()
Mario Limonciello (AMD) (3):
PM: hibernate: Fix hybrid-sleep
PM: hibernate: Add pm_hibernation_mode_is_suspend()
drm/amd: Fix hybrid sleep
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +-
include/linux/suspend.h | 2 ++
kernel/power/hibernate.c | 14 ++++++++++++++
3 files changed, 17 insertions(+), 1 deletion(-)
--
2.51.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/3] PM: hibernate: Fix hybrid-sleep
2025-09-25 18:51 [PATCH v3 0/3] Fixes for hybrid sleep Mario Limonciello (AMD)
@ 2025-09-25 18:51 ` Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 2/3] PM: hibernate: Add pm_hibernation_mode_is_suspend() Mario Limonciello (AMD)
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Mario Limonciello (AMD) @ 2025-09-25 18:51 UTC (permalink / raw)
To: Rafael J . Wysocki
Cc: Samuel Zhang, open list:RADEON and AMDGPU DRM DRIVERS,
open list:HIBERNATION (aka Software Suspend, aka swsusp),
Mario Limonciello (AMD), Ionut Nechita, Kenneth Crudup,
Alex Deucher
Hybrid sleep will hibernate the system followed by running through
the suspend routine. Since both the hibernate and the suspend routine
will call pm_restrict_gfp_mask(), pm_restore_gfp_mask() must be called
before starting the suspend sequence.
Add an explicit call to pm_restore_gfp_mask() to power_down() before
the suspend sequence starts. Add an extra call for pm_restrict_gfp_mask()
when exiting suspend so that the pm_restore_gfp_mask() call in hibernate()
is balanced.
Reported-by: Ionut Nechita <ionut_n2001@yahoo.com>
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4573
Tested-by: Ionut Nechita <ionut_n2001@yahoo.com>
Fixes: 12ffc3b1513eb ("PM: Restrict swap use to later in the suspend sequence")
Tested-by: Kenneth Crudup <kenny@panix.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
kernel/power/hibernate.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 2f66ab453823..3c6b110ee9b0 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -695,12 +695,15 @@ static void power_down(void)
#ifdef CONFIG_SUSPEND
if (hibernation_mode == HIBERNATION_SUSPEND) {
+ pm_restore_gfp_mask();
error = suspend_devices_and_enter(mem_sleep_current);
if (error) {
hibernation_mode = hibernation_ops ?
HIBERNATION_PLATFORM :
HIBERNATION_SHUTDOWN;
} else {
+ pm_restrict_gfp_mask();
+
/* Restore swap signature. */
error = swsusp_unmark();
if (error)
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/3] PM: hibernate: Add pm_hibernation_mode_is_suspend()
2025-09-25 18:51 [PATCH v3 0/3] Fixes for hybrid sleep Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 1/3] PM: hibernate: Fix hybrid-sleep Mario Limonciello (AMD)
@ 2025-09-25 18:51 ` Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 3/3] drm/amd: Fix hybrid sleep Mario Limonciello (AMD)
2025-09-25 19:42 ` [PATCH v3 0/3] Fixes for " Rafael J. Wysocki
3 siblings, 0 replies; 5+ messages in thread
From: Mario Limonciello (AMD) @ 2025-09-25 18:51 UTC (permalink / raw)
To: Rafael J . Wysocki
Cc: Samuel Zhang, open list:RADEON and AMDGPU DRM DRIVERS,
open list:HIBERNATION (aka Software Suspend, aka swsusp),
Mario Limonciello (AMD), Ionut Nechita, Kenneth Crudup,
Alex Deucher
Some drivers have different flows for hibernation and suspend. If
the driver opportunistically will skip thaw() then it needs a hint
to know what is happening after the hibernate.
Introduce a new symbol pm_hibernation_mode_is_suspend() that drivers
can call to determine if suspending the system for this purpose.
Tested-by: Ionut Nechita <ionut_n2001@yahoo.com>
Tested-by: Kenneth Crudup <kenny@panix.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
include/linux/suspend.h | 2 ++
kernel/power/hibernate.c | 11 +++++++++++
2 files changed, 13 insertions(+)
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 317ae31e89b3..0664c685f0b2 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -276,6 +276,7 @@ extern void arch_suspend_enable_irqs(void);
extern int pm_suspend(suspend_state_t state);
extern bool sync_on_suspend_enabled;
+bool pm_hibernation_mode_is_suspend(void);
#else /* !CONFIG_SUSPEND */
#define suspend_valid_only_mem NULL
@@ -288,6 +289,7 @@ static inline bool pm_suspend_via_firmware(void) { return false; }
static inline bool pm_resume_via_firmware(void) { return false; }
static inline bool pm_suspend_no_platform(void) { return false; }
static inline bool pm_suspend_default_s2idle(void) { return false; }
+static inline bool pm_hibernation_mode_is_suspend(void) { return false; }
static inline void suspend_set_ops(const struct platform_suspend_ops *ops) {}
static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; }
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 3c6b110ee9b0..989d76a911de 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -80,6 +80,17 @@ static const struct platform_hibernation_ops *hibernation_ops;
static atomic_t hibernate_atomic = ATOMIC_INIT(1);
+#ifdef CONFIG_SUSPEND
+/**
+ * pm_hibernation_mode_is_suspend - Check if hibernation has been set to suspend
+ */
+bool pm_hibernation_mode_is_suspend(void)
+{
+ return hibernation_mode == HIBERNATION_SUSPEND;
+}
+EXPORT_SYMBOL_GPL(pm_hibernation_mode_is_suspend);
+#endif
+
bool hibernate_acquire(void)
{
return atomic_add_unless(&hibernate_atomic, -1, 0);
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/3] drm/amd: Fix hybrid sleep
2025-09-25 18:51 [PATCH v3 0/3] Fixes for hybrid sleep Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 1/3] PM: hibernate: Fix hybrid-sleep Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 2/3] PM: hibernate: Add pm_hibernation_mode_is_suspend() Mario Limonciello (AMD)
@ 2025-09-25 18:51 ` Mario Limonciello (AMD)
2025-09-25 19:42 ` [PATCH v3 0/3] Fixes for " Rafael J. Wysocki
3 siblings, 0 replies; 5+ messages in thread
From: Mario Limonciello (AMD) @ 2025-09-25 18:51 UTC (permalink / raw)
To: Rafael J . Wysocki
Cc: Samuel Zhang, open list:RADEON and AMDGPU DRM DRIVERS,
open list:HIBERNATION (aka Software Suspend, aka swsusp),
Mario Limonciello (AMD), Ionut Nechita, Alex Deucher,
Kenneth Crudup
[Why]
commit 530694f54dd5e ("drm/amdgpu: do not resume device in thaw for
normal hibernation") optimized the flow for systems that are going
into S4 where the power would be turned off. Basically the thaw()
callback wouldn't resume the device if the hibernation image was
successfully created since the system would be powered off.
This however isn't the correct flow for a system entering into
s0i3 after the hibernation image is created. Some of the amdgpu
callbacks have different behavior depending upon the intended
state of the suspend.
[How]
Use pm_hibernation_mode_is_suspend() as an input to decide whether
to run resume during thaw() callback.
Reported-by: Ionut Nechita <ionut_n2001@yahoo.com>
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4573
Tested-by: Ionut Nechita <ionut_n2001@yahoo.com>
Fixes: 530694f54dd5e ("drm/amdgpu: do not resume device in thaw for normal hibernation")
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Tested-by: Kenneth Crudup <kenny@panix.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 395c6be901ce..dcea66aadfa3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -2665,7 +2665,7 @@ static int amdgpu_pmops_thaw(struct device *dev)
struct drm_device *drm_dev = dev_get_drvdata(dev);
/* do not resume device if it's normal hibernation */
- if (!pm_hibernate_is_recovering())
+ if (!pm_hibernate_is_recovering() && !pm_hibernation_mode_is_suspend())
return 0;
return amdgpu_device_resume(drm_dev, true);
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 0/3] Fixes for hybrid sleep
2025-09-25 18:51 [PATCH v3 0/3] Fixes for hybrid sleep Mario Limonciello (AMD)
` (2 preceding siblings ...)
2025-09-25 18:51 ` [PATCH v3 3/3] drm/amd: Fix hybrid sleep Mario Limonciello (AMD)
@ 2025-09-25 19:42 ` Rafael J. Wysocki
3 siblings, 0 replies; 5+ messages in thread
From: Rafael J. Wysocki @ 2025-09-25 19:42 UTC (permalink / raw)
To: Mario Limonciello (AMD)
Cc: Rafael J . Wysocki, Samuel Zhang,
open list:RADEON and AMDGPU DRM DRIVERS,
open list:HIBERNATION (aka Software Suspend, aka swsusp),
Mario Limonciello
On Thu, Sep 25, 2025 at 8:51 PM Mario Limonciello (AMD)
<superm1@kernel.org> wrote:
>
> From: Mario Limonciello <mario.limonciello@amd.com>
>
> Ionut Nechita reported recently a hibernate failure, but in debugging
> the issue it's actually not a hibernate failure; but a hybrid sleep
> failure.
>
> Multiple changes related to the change of when swap is disabled in
> the suspend sequence contribute to the failure. See the individual
> patches for details.
>
> Link: https://gitlab.freedesktop.org/drm/amd/-/issues/4573
>
> As it touches two subsystems it either needs to go through linux-pm
> or drm. Patch 3 has an Ack from Alex, this should merge through
> linux-pm.
> ---
> v3:
> * Push all calls for gfp mask changes into power_down()
> Mario Limonciello (AMD) (3):
> PM: hibernate: Fix hybrid-sleep
> PM: hibernate: Add pm_hibernation_mode_is_suspend()
> drm/amd: Fix hybrid sleep
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +-
> include/linux/suspend.h | 2 ++
> kernel/power/hibernate.c | 14 ++++++++++++++
> 3 files changed, 17 insertions(+), 1 deletion(-)
>
> --
All applied as 6.18 material, thanks!
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-09-25 19:43 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-25 18:51 [PATCH v3 0/3] Fixes for hybrid sleep Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 1/3] PM: hibernate: Fix hybrid-sleep Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 2/3] PM: hibernate: Add pm_hibernation_mode_is_suspend() Mario Limonciello (AMD)
2025-09-25 18:51 ` [PATCH v3 3/3] drm/amd: Fix hybrid sleep Mario Limonciello (AMD)
2025-09-25 19:42 ` [PATCH v3 0/3] Fixes for " Rafael J. Wysocki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox