[Public]

Should we validate support for the specific target queue type, rather than 
allowing the userq IOCTL to proceed as long as any one queue type is valid?

Regards,
      Prike

> -----Original Message-----
> From: Alex Deucher <[email protected]>
> Sent: Friday, January 9, 2026 9:58 PM
> To: [email protected]
> Cc: Koenig, Christian <[email protected]>; Liang, Prike
> <[email protected]>; Deucher, Alexander <[email protected]>
> Subject: [PATCH] drm/amdgpu: make sure userqs are enabled in userq IOCTLs
>
> These IOCTLs shouldn't be called when userqs are not enabled.  Make sure they 
> are
> enabled before executing the IOCTLs.
>
> Signed-off-by: Alex Deucher <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c       | 16 ++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h       |  1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c |  6 ++++++
>  3 files changed, 23 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> index 98110f543307d..256ceca6d429b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> @@ -888,12 +888,28 @@ static int amdgpu_userq_input_args_validate(struct
> drm_device *dev,
>       return 0;
>  }
>
> +bool amdgpu_userq_enabled(struct drm_device *dev) {
> +     struct amdgpu_device *adev = drm_to_adev(dev);
> +     int i;
> +
> +     for (i = 0; i < AMDGPU_HW_IP_NUM; i++) {
> +             if (adev->userq_funcs[i])
> +                     return true;
> +     }
> +
> +     return false;
> +}
> +
>  int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
>                      struct drm_file *filp)
>  {
>       union drm_amdgpu_userq *args = data;
>       int r;
>
> +     if (!amdgpu_userq_enabled(dev))
> +             return -ENOTSUPP;
> +
>       if (amdgpu_userq_input_args_validate(dev, args, filp) < 0)
>               return -EINVAL;
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> index 7a5ec17704567..468b65d953b0d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
> @@ -136,6 +136,7 @@ uint64_t amdgpu_userq_get_doorbell_index(struct
> amdgpu_userq_mgr *uq_mgr,
>                                            struct drm_file *filp);
>
>  u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev);
> +bool amdgpu_userq_enabled(struct drm_device *dev);
>
>  int amdgpu_userq_suspend(struct amdgpu_device *adev);  int
> amdgpu_userq_resume(struct amdgpu_device *adev); diff --git
> a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> index 1a23e7709dea9..d6fc65803a309 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
> @@ -493,6 +493,9 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void
> *data,
>       struct drm_exec exec;
>       u64 wptr;
>
> +     if (!amdgpu_userq_enabled(dev))
> +             return -ENOTSUPP;
> +
>       num_syncobj_handles = args->num_syncobj_handles;
>       syncobj_handles = memdup_user(u64_to_user_ptr(args->syncobj_handles),
>                                     size_mul(sizeof(u32), 
> num_syncobj_handles));
> @@ -680,6 +683,9 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void
> *data,
>       int r, i, rentry, wentry, cnt;
>       struct drm_exec exec;
>
> +     if (!amdgpu_userq_enabled(dev))
> +             return -ENOTSUPP;
> +
>       num_read_bo_handles = wait_info->num_bo_read_handles;
>       bo_handles_read = memdup_user(u64_to_user_ptr(wait_info-
> >bo_read_handles),
>                                     size_mul(sizeof(u32), 
> num_read_bo_handles));
> --
> 2.52.0

Reply via email to