[Public]

> -----Original Message-----
> From: Alex Deucher <alexdeuc...@gmail.com>
> Sent: Saturday, May 31, 2025 5:32 AM
> To: Liang, Prike <prike.li...@amd.com>
> Cc: amd-gfx@lists.freedesktop.org; Deucher, Alexander
> <alexander.deuc...@amd.com>; Koenig, Christian <christian.koe...@amd.com>;
> Lazar, Lijo <lijo.la...@amd.com>
> Subject: Re: [PATCH 1/9] drm/amdgpu: validate userq input args
>
> On Fri, May 30, 2025 at 4:05 AM Prike Liang <prike.li...@amd.com> wrote:
> >
> > This will help on validating the userq input args, and rejecting for
> > the invalidate userq request at the IOCTLs first place.
> >
> > Signed-off-by: Prike Liang <prike.li...@amd.com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c  | 80
> > +++++++++++++++-------  drivers/gpu/drm/amd/amdgpu/mes_userqueue.c |
> > 7 --
> >  2 files changed, 55 insertions(+), 32 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> > index 295e7186e156..f67969312c39 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
> > @@ -359,27 +359,10 @@ amdgpu_userq_create(struct drm_file *filp, union
> drm_amdgpu_userq *args)
> >                 (args->in.flags &
> AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK) >>
> >                 AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_SHIFT;
> >
> > -       /* Usermode queues are only supported for GFX IP as of now */
> > -       if (args->in.ip_type != AMDGPU_HW_IP_GFX &&
> > -           args->in.ip_type != AMDGPU_HW_IP_DMA &&
> > -           args->in.ip_type != AMDGPU_HW_IP_COMPUTE) {
> > -               drm_file_err(uq_mgr->file, "Usermode queue doesn't support 
> > IP
> type %u\n",
> > -                            args->in.ip_type);
> > -               return -EINVAL;
> > -       }
> > -
> >         r = amdgpu_userq_priority_permit(filp, priority);
> >         if (r)
> >                 return r;
> >
> > -       if ((args->in.flags &
> AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE) &&
> > -           (args->in.ip_type != AMDGPU_HW_IP_GFX) &&
> > -           (args->in.ip_type != AMDGPU_HW_IP_COMPUTE) &&
> > -           !amdgpu_is_tmz(adev)) {
> > -               drm_file_err(uq_mgr->file, "Secure only supported on 
> > GFX/Compute
> queues\n");
> > -               return -EINVAL;
> > -       }
> > -
> >         r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
> >         if (r < 0) {
> >                 drm_file_err(uq_mgr->file, "pm_runtime_get_sync()
> > failed for userqueue create\n"); @@ -485,22 +468,44 @@
> amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
> >         return r;
> >  }
> >
> > -int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
> > -                      struct drm_file *filp)
> > +static int amdgpu_userq_input_args_validate(struct drm_device *dev,
> > +                                       union drm_amdgpu_userq *args,
> > +                                       struct drm_file *filp)
> >  {
> > -       union drm_amdgpu_userq *args = data;
> > -       int r;
> > +       struct amdgpu_device *adev = drm_to_adev(dev);
> >
> >         switch (args->in.op) {
> >         case AMDGPU_USERQ_OP_CREATE:
> >                 if (args->in.flags &
> ~(AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK |
> >
> AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE))
> >                         return -EINVAL;
> > -               r = amdgpu_userq_create(filp, args);
> > -               if (r)
> > -                       drm_file_err(filp, "Failed to create usermode 
> > queue\n");
> > -               break;
> > +               /* Usermode queues are only supported for GFX IP as of now 
> > */
> > +               if (args->in.ip_type != AMDGPU_HW_IP_GFX &&
> > +                   args->in.ip_type != AMDGPU_HW_IP_DMA &&
> > +                   args->in.ip_type != AMDGPU_HW_IP_COMPUTE) {
> > +                       drm_file_err(filp, "Usermode queue doesn't support 
> > IP type %u\n",
> > +                                    args->in.ip_type);
> > +                       return -EINVAL;
> > +               }
> > +
> > +               if ((args->in.flags &
> AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE) &&
> > +                   (args->in.ip_type != AMDGPU_HW_IP_GFX) &&
> > +                   (args->in.ip_type != AMDGPU_HW_IP_COMPUTE) &&
> > +                   !amdgpu_is_tmz(adev)) {
> > +                       drm_file_err(filp, "Secure only supported on 
> > GFX/Compute
> queues\n");
> > +                       return -EINVAL;
> > +               }
> >
> > +               if (args->in.queue_va == AMDGPU_BO_INVALID_OFFSET ||
> > +                               args->in.queue_size == 0) {
> > +                       drm_file_err(filp, "invalidate userq queue va or 
> > size\n");
> > +                       return -EINVAL;
> > +               }
> > +               if (!args->in.wptr_va || !args->in.rptr_va) {
> > +                       drm_file_err(filp, "invalidate userq queue rptr or 
> > wptr\n");
> > +                       return -EINVAL;
> > +               }
> > +               break;
> >         case AMDGPU_USERQ_OP_FREE:
> >                 if (args->in.ip_type ||
> >                     args->in.doorbell_handle || @@ -514,6 +519,31 @@
> > int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
> >                     args->in.mqd ||
> >                     args->in.mqd_size)
> >                         return -EINVAL;
> > +               break;
> > +       default:
> > +               return -EINVAL;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +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_input_args_validate(dev, args, filp) < 0)
> > +               return -EINVAL;
> > +
> > +       switch (args->in.op) {
> > +       case AMDGPU_USERQ_OP_CREATE:
> > +               r = amdgpu_userq_create(filp, args);
> > +               if (r)
> > +                       drm_file_err(filp, "Failed to create usermode 
> > queue\n");
> > +               break;
> > +
> > +       case AMDGPU_USERQ_OP_FREE:
> >                 r = amdgpu_userq_destroy(filp, args->in.queue_id);
> >                 if (r)
> >                         drm_file_err(filp, "Failed to destroy usermode
> > queue\n"); diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> > b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> > index d6f50b13e2ba..1457fb49a794 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> > @@ -215,13 +215,6 @@ static int mes_userq_mqd_create(struct
> amdgpu_userq_mgr *uq_mgr,
> >                 return -ENOMEM;
> >         }
> >
> > -       if (!mqd_user->wptr_va || !mqd_user->rptr_va ||
> > -           !mqd_user->queue_va || mqd_user->queue_size == 0) {
> > -               DRM_ERROR("Invalid MQD parameters for userqueue\n");
> > -               r = -EINVAL;
> > -               goto free_props;
> > -       }
>
> I would keep this check here as this is MES specific at this point.
OK, previously I just want to validate the userq input parameters at the useq 
IOCTL early time to avoid allocating unnecessary resource.

> Alex
>
> > -
> >         r = amdgpu_userq_create_object(uq_mgr, &queue->mqd, mqd_hw_default-
> >mqd_size);
> >         if (r) {
> >                 DRM_ERROR("Failed to create MQD object for
> > userqueue\n");
> > --
> > 2.34.1
> >

Reply via email to