drm/amdgpu: fix pm notifier handling
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 1 May 2025 17:46:46 +0000 (13:46 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 7 May 2025 21:43:18 +0000 (17:43 -0400)
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
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

index a2997ededd0e707744747678e9588f0fd7adcf88..5d47c36c828034cc1416a6ab648cd1227d1e2844 100644 (file)
@@ -4976,28 +4976,20 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev)
  * @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;
        }
 
index 8e45f18ad4702d349c19cb66419a47b277d447dc..7f437aea3d06e6b48ce23b908784736580e3ec69 100644 (file)
@@ -2644,13 +2644,8 @@ static int amdgpu_pmops_freeze(struct device *dev)
 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)
@@ -2663,9 +2658,6 @@ static int amdgpu_pmops_poweroff(struct device *dev)
 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);
 }