On 6/12/26 07:52, Srinivasan Shanmugam wrote:
> Signal GPU_RESET EVENTFD subscriptions from the GPU recovery path.
> 
> The GPU recovery flow already determines when a device reset has
> completed successfully. Use that point to wake up matching EVENTFD
> subscribers.
> 
> GPU_RESET is a device-scoped event, so no queue object is used.  All
> processes that subscribed to GPU_RESET on the device are notified.
> 
> EVENTFD remains notification-only.
> 
> Cc: Alex Deucher <[email protected]>
> Cc: Christian König <[email protected]>
> Signed-off-by: Srinivasan Shanmugam <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 30 +++++++++++++++++++++-
>  1 file changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index e46cdd6ecd42..8f28716912c7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -5694,6 +5694,32 @@ static int amdgpu_device_asic_reset(struct 
> amdgpu_device *adev,
>       return r;
>  }
>  
> +/*
> + * Signal GPU_RESET EVENTFD subscriptions for all open DRM files.
> + *
> + * GPU reset is a device-wide event rather than being associated with a
> + * specific user queue. Notify every process that subscribed to the
> + * GPU_RESET event on this device.
> + */
> +static void amdgpu_device_eventfd_signal_gpu_reset(struct amdgpu_device 
> *adev)
> +{
> +     struct drm_device *ddev = adev_to_drm(adev);
> +     struct drm_file *file;
> +
> +     mutex_lock(&ddev->filelist_mutex);

Please double check what other locks can be held under the ddev->filelist_mutex.

@Vitaly do we have ddev->filelist_mutex in our lockdep handling already? I 
don't think so, if no could we add it?

Thanks in advance,
Christian.

> +
> +     list_for_each_entry(file, &ddev->filelist, lhead) {
> +             struct amdgpu_fpriv *fpriv = file->driver_priv;
> +
> +             if (fpriv)
> +                     amdgpu_eventfd_signal(&fpriv->eventfd_mgr,
> +                                           DRM_AMDGPU_EVENT_TYPE_GPU_RESET,
> +                                           NULL);
> +     }
> +
> +     mutex_unlock(&ddev->filelist_mutex);
> +}
> +
>  static int amdgpu_device_sched_resume(struct list_head *device_list,
>                             struct amdgpu_reset_context *reset_context,
>                             bool   job_signaled)
> @@ -5738,6 +5764,9 @@ static int amdgpu_device_sched_resume(struct list_head 
> *device_list,
>               } else {
>                       dev_info(tmp_adev->dev, "GPU reset(%d) succeeded!\n",
>                                atomic_read(&tmp_adev->gpu_reset_counter));
> +
> +                     amdgpu_device_eventfd_signal_gpu_reset(tmp_adev);
> +
>                       if (amdgpu_acpi_smart_shift_update(tmp_adev,
>                                                          AMDGPU_SS_DEV_D0))
>                               dev_warn(tmp_adev->dev,
> @@ -5775,7 +5804,6 @@ static void amdgpu_device_gpu_resume(struct 
> amdgpu_device *adev,
>       }
>  }
>  
> -
>  /**
>   * amdgpu_device_gpu_recover - reset the asic and recover scheduler
>   *

Reply via email to