[PATCH 2/2] drm/amdgpu: fix pm notifier handling
Mario Limonciello
mario.limonciello at amd.com
Mon May 5 21:48:49 UTC 2025
On 5/5/2025 10:30 AM, Alex Deucher wrote:
> 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 at amd.com>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
Until we can get movement on the RFC for the extra eviction step this is
fine for now. I hope we can get that soon though.
For both:
Reviewed-by: Mario Limonciello <mario.limonciello at 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(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 368004b716ba8..5d25db16cb4b8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -4979,28 +4979,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;
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 8baeaa5d5b119..e0ca9405719e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -2643,13 +2643,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)
> @@ -2662,9 +2657,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);
> }
More information about the amd-gfx
mailing list