[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