88 lines
3.1 KiB
Diff
88 lines
3.1 KiB
Diff
From e9ee1b0a41166033eda14d11823826b79ce5131b Mon Sep 17 00:00:00 2001
|
|
From: Alex Deucher <alexander.deucher@amd.com>
|
|
Date: Thu, 1 May 2025 13:46:46 -0400
|
|
Subject: drm/amdgpu: fix pm notifier handling
|
|
|
|
Set the s3/s0ix and s4 flags in the pm notifier so that we can skip
|
|
the resource evictions properly in pm prepare based on whether
|
|
we are suspending or hibernating. Drop the eviction as processes
|
|
are not frozen at this time, we we can end up getting stuck trying
|
|
to evict VRAM while applications continue to submit work which
|
|
causes the buffers to get pulled back into VRAM.
|
|
|
|
v2: Move suspend flags out of pm notifier (Mario)
|
|
|
|
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4178
|
|
Fixes: 2965e6355dcd ("drm/amd: Add Suspend/Hibernate notification callback support")
|
|
Cc: Mario Limonciello <mario.limonciello@amd.com>
|
|
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
|
---
|
|
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 18 +++++-------------
|
|
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 10 +---------
|
|
2 files changed, 6 insertions(+), 22 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
@@ -4819,28 +4819,20 @@ static int amdgpu_device_evict_resources
|
|
* @data: data
|
|
*
|
|
* This function is called when the system is about to suspend or hibernate.
|
|
- * It is used to evict resources from the device before the system goes to
|
|
- * sleep while there is still access to swap.
|
|
+ * It is used to set the appropriate flags so that eviction can be optimized
|
|
+ * in the pm prepare callback.
|
|
*/
|
|
static int amdgpu_device_pm_notifier(struct notifier_block *nb, unsigned long mode,
|
|
void *data)
|
|
{
|
|
struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, pm_nb);
|
|
- int r;
|
|
|
|
switch (mode) {
|
|
case PM_HIBERNATION_PREPARE:
|
|
adev->in_s4 = true;
|
|
- fallthrough;
|
|
- case PM_SUSPEND_PREPARE:
|
|
- r = amdgpu_device_evict_resources(adev);
|
|
- /*
|
|
- * This is considered non-fatal at this time because
|
|
- * amdgpu_device_prepare() will also fatally evict resources.
|
|
- * See https://gitlab.freedesktop.org/drm/amd/-/issues/3781
|
|
- */
|
|
- if (r)
|
|
- drm_warn(adev_to_drm(adev), "Failed to evict resources, freeze active processes if problems occur: %d\n", r);
|
|
+ break;
|
|
+ case PM_POST_HIBERNATION:
|
|
+ adev->in_s4 = false;
|
|
break;
|
|
}
|
|
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
|
|
@@ -2592,13 +2592,8 @@ static int amdgpu_pmops_freeze(struct de
|
|
static int amdgpu_pmops_thaw(struct device *dev)
|
|
{
|
|
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
|
- struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
|
- int r;
|
|
|
|
- r = amdgpu_device_resume(drm_dev, true);
|
|
- adev->in_s4 = false;
|
|
-
|
|
- return r;
|
|
+ return amdgpu_device_resume(drm_dev, true);
|
|
}
|
|
|
|
static int amdgpu_pmops_poweroff(struct device *dev)
|
|
@@ -2611,9 +2606,6 @@ static int amdgpu_pmops_poweroff(struct
|
|
static int amdgpu_pmops_restore(struct device *dev)
|
|
{
|
|
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
|
- struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
|
-
|
|
- adev->in_s4 = false;
|
|
|
|
return amdgpu_device_resume(drm_dev, true);
|
|
}
|