[PATCH 3/4] drm/amdkfd: Allocate SDMA queue on specif engine

Alex Deucher alexdeucher at gmail.com
Tue Nov 13 19:59:26 UTC 2018


On Tue, Nov 13, 2018 at 2:11 PM Oak Zeng <ozeng at amd.com> wrote:
>
> From: Oak Zeng <Oak.Zeng at amd.com>
>
> Change-Id: I32e0304cdf6ceeed12ea8d0af62f44e1ab20bffb
> Signed-off-by: Oak Zeng <Oak.Zeng at amd.com>
> Reviewd-by: Felix Kuehling <Felix.Kuehling at amd.com>

Typo: Reviewed-by
Also, in the patch title, "specific"
With those fixed:
Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_chardev.c           | 26 +++++++++++++------
>  .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c  | 30 +++++++++++++++++++---
>  2 files changed, 44 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> index 5f4062b..37b02ea 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
> @@ -143,7 +143,8 @@ static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p,
>         return 0;
>  }
>
> -static int set_queue_properties_from_user(struct queue_properties *q_properties,
> +static int set_queue_properties_from_user(struct kfd_dev *dev,
> +                               struct queue_properties *q_properties,
>                                 struct kfd_ioctl_create_queue_args *args)
>  {
>         if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) {
> @@ -213,12 +214,21 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,
>         q_properties->ctx_save_restore_area_size = args->ctx_save_restore_size;
>         q_properties->ctl_stack_size = args->ctl_stack_size;
>         if (args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE ||
> -               args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL)
> +               args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL) {
>                 q_properties->type = KFD_QUEUE_TYPE_COMPUTE;
> -       else if (args->queue_type == KFD_IOC_QUEUE_TYPE_SDMA)
> +       } else if (args->queue_type == KFD_IOC_QUEUE_TYPE_SDMA) {
> +               q_properties->sdma_engine_id =
> +                       dev->device_info->num_sdma_engines;
>                 q_properties->type = KFD_QUEUE_TYPE_SDMA;
> -       else
> +       } else if (args->queue_type >= KFD_IOC_QUEUE_TYPE_SDMA_ENGINE(0) &&
> +               args->queue_type < KFD_IOC_QUEUE_TYPE_SDMA_ENGINE(
> +               dev->device_info->num_sdma_engines)) {
> +               q_properties->sdma_engine_id =
> +                       args->queue_type - KFD_IOC_QUEUE_TYPE_SDMA_ENGINE(0);
> +               q_properties->type = KFD_QUEUE_TYPE_SDMA;
> +       } else {
>                 return -ENOTSUPP;
> +       }
>
>         if (args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL)
>                 q_properties->format = KFD_QUEUE_FORMAT_AQL;
> @@ -265,10 +275,6 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
>
>         pr_debug("Creating queue ioctl\n");
>
> -       err = set_queue_properties_from_user(&q_properties, args);
> -       if (err)
> -               return err;
> -
>         pr_debug("Looking for gpu id 0x%x\n", args->gpu_id);
>         dev = kfd_device_by_id(args->gpu_id);
>         if (!dev) {
> @@ -276,6 +282,10 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
>                 return -EINVAL;
>         }
>
> +       err = set_queue_properties_from_user(dev, &q_properties, args);
> +       if (err)
> +               return err;
> +
>         mutex_lock(&p->mutex);
>
>         pdd = kfd_bind_process_to_device(dev, p);
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> index 7bf4bca..bc8f955 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> @@ -916,14 +916,34 @@ static int stop_nocpsch(struct device_queue_manager *dqm)
>  }
>
>  static int allocate_sdma_queue(struct device_queue_manager *dqm,
> +                               unsigned int sdma_engine_id,
>                                 unsigned int *sdma_queue_id)
>  {
> -       int bit;
> +       int bit = -1;
>
>         if (dqm->sdma_bitmap == 0)
>                 return -ENOMEM;
>
> -       bit = __ffs64(dqm->sdma_bitmap);
> +       /* If sdma_engine_id is valid,
> +        * allocate queue on specific engine
> +        */
> +       if (sdma_engine_id < get_num_sdma_engines(dqm)) {
> +               unsigned int i;
> +
> +               for (i = sdma_engine_id; i < get_num_sdma_queues(dqm);
> +                       i += get_num_sdma_engines(dqm)) {
> +                       if (dqm->sdma_bitmap & (1<<i)) {
> +                               bit = i;
> +                               break;
> +                       }
> +               }
> +               if (bit == -1)
> +                       return -EBUSY;
> +       /* Otherwise allocate from any engine */
> +       } else {
> +               bit = __ffs64(dqm->sdma_bitmap);
> +       }
> +
>         dqm->sdma_bitmap &= ~(1ULL << bit);
>         *sdma_queue_id = bit;
>
> @@ -949,7 +969,8 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
>         if (!mqd_mgr)
>                 return -ENOMEM;
>
> -       retval = allocate_sdma_queue(dqm, &q->sdma_id);
> +       retval = allocate_sdma_queue(dqm, q->properties.sdma_engine_id,
> +                                       &q->sdma_id);
>         if (retval)
>                 return retval;
>
> @@ -1168,7 +1189,8 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
>         }
>
>         if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
> -               retval = allocate_sdma_queue(dqm, &q->sdma_id);
> +               retval = allocate_sdma_queue(dqm, q->properties.sdma_engine_id,
> +                                               &q->sdma_id);
>                 if (retval)
>                         goto out_unlock;
>                 q->properties.sdma_queue_id =
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list