[PATCH 01/14] accel/ivpu: Separate DB ID and CMDQ ID allocations from CMDQ allocation
Jacek Lawrynowicz
jacek.lawrynowicz at linux.intel.com
Thu Jan 9 08:22:17 UTC 2025
This will allows -> This will allow
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz at linux.intel.com>
On 1/7/2025 6:32 PM, Maciej Falkowski wrote:
> From: Karol Wachowski <karol.wachowski at intel.com>
>
> Move doorbell ID and command queue ID XArray allocations from command
> queue memory allocation function. This will allows IDs allocations to be
> done without the need for actual memory allocation.
>
> Signed-off-by: Karol Wachowski <karol.wachowski at intel.com>
> Signed-off-by: Maciej Falkowski <maciej.falkowski at linux.intel.com>
> ---
> drivers/accel/ivpu/ivpu_job.c | 88 +++++++++++++++++++++++++----------
> 1 file changed, 64 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/accel/ivpu/ivpu_job.c b/drivers/accel/ivpu/ivpu_job.c
> index 7149312f16e1..98e53cb38ecd 100644
> --- a/drivers/accel/ivpu/ivpu_job.c
> +++ b/drivers/accel/ivpu/ivpu_job.c
> @@ -83,23 +83,9 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv)
> if (!cmdq)
> return NULL;
>
> - ret = xa_alloc_cyclic(&vdev->db_xa, &cmdq->db_id, NULL, vdev->db_limit, &vdev->db_next,
> - GFP_KERNEL);
> - if (ret < 0) {
> - ivpu_err(vdev, "Failed to allocate doorbell id: %d\n", ret);
> - goto err_free_cmdq;
> - }
> -
> - ret = xa_alloc_cyclic(&file_priv->cmdq_xa, &cmdq->id, cmdq, file_priv->cmdq_limit,
> - &file_priv->cmdq_id_next, GFP_KERNEL);
> - if (ret < 0) {
> - ivpu_err(vdev, "Failed to allocate command queue id: %d\n", ret);
> - goto err_erase_db_xa;
> - }
> -
> cmdq->mem = ivpu_bo_create_global(vdev, SZ_4K, DRM_IVPU_BO_WC | DRM_IVPU_BO_MAPPABLE);
> if (!cmdq->mem)
> - goto err_erase_cmdq_xa;
> + goto err_free_cmdq;
>
> ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq);
> if (ret)
> @@ -107,10 +93,6 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv)
>
> return cmdq;
>
> -err_erase_cmdq_xa:
> - xa_erase(&file_priv->cmdq_xa, cmdq->id);
> -err_erase_db_xa:
> - xa_erase(&vdev->db_xa, cmdq->db_id);
> err_free_cmdq:
> kfree(cmdq);
> return NULL;
> @@ -233,30 +215,88 @@ static int ivpu_cmdq_fini(struct ivpu_file_priv *file_priv, struct ivpu_cmdq *cm
> return 0;
> }
>
> +static int ivpu_db_id_alloc(struct ivpu_device *vdev, u32 *db_id)
> +{
> + int ret;
> + u32 id;
> +
> + ret = xa_alloc_cyclic(&vdev->db_xa, &id, NULL, vdev->db_limit, &vdev->db_next, GFP_KERNEL);
> + if (ret < 0)
> + return ret;
> +
> + *db_id = id;
> + return 0;
> +}
> +
> +static int ivpu_cmdq_id_alloc(struct ivpu_file_priv *file_priv, u32 *cmdq_id)
> +{
> + int ret;
> + u32 id;
> +
> + ret = xa_alloc_cyclic(&file_priv->cmdq_xa, &id, NULL, file_priv->cmdq_limit,
> + &file_priv->cmdq_id_next, GFP_KERNEL);
> + if (ret < 0)
> + return ret;
> +
> + *cmdq_id = id;
> + return 0;
> +}
> +
> static struct ivpu_cmdq *ivpu_cmdq_acquire(struct ivpu_file_priv *file_priv, u8 priority)
> {
> + struct ivpu_device *vdev = file_priv->vdev;
> struct ivpu_cmdq *cmdq;
> - unsigned long cmdq_id;
> + unsigned long id;
> int ret;
>
> lockdep_assert_held(&file_priv->lock);
>
> - xa_for_each(&file_priv->cmdq_xa, cmdq_id, cmdq)
> + xa_for_each(&file_priv->cmdq_xa, id, cmdq)
> if (cmdq->priority == priority)
> break;
>
> if (!cmdq) {
> cmdq = ivpu_cmdq_alloc(file_priv);
> - if (!cmdq)
> + if (!cmdq) {
> + ivpu_err(vdev, "Failed to allocate command queue\n");
> return NULL;
> + }
> +
> + ret = ivpu_db_id_alloc(vdev, &cmdq->db_id);
> + if (ret) {
> + ivpu_err(file_priv->vdev, "Failed to allocate doorbell ID: %d\n", ret);
> + goto err_free_cmdq;
> + }
> +
> + ret = ivpu_cmdq_id_alloc(file_priv, &cmdq->id);
> + if (ret) {
> + ivpu_err(vdev, "Failed to allocate command queue ID: %d\n", ret);
> + goto err_erase_db_id;
> + }
> +
> cmdq->priority = priority;
> + ret = xa_err(xa_store(&file_priv->cmdq_xa, cmdq->id, cmdq, GFP_KERNEL));
> + if (ret) {
> + ivpu_err(vdev, "Failed to store command queue in cmdq_xa: %d\n", ret);
> + goto err_erase_cmdq_id;
> + }
> }
>
> ret = ivpu_cmdq_init(file_priv, cmdq, priority);
> - if (ret)
> - return NULL;
> + if (ret) {
> + ivpu_err(vdev, "Failed to initialize command queue: %d\n", ret);
> + goto err_free_cmdq;
> + }
>
> return cmdq;
> +
> +err_erase_cmdq_id:
> + xa_erase(&file_priv->cmdq_xa, cmdq->id);
> +err_erase_db_id:
> + xa_erase(&vdev->db_xa, cmdq->db_id);
> +err_free_cmdq:
> + ivpu_cmdq_free(file_priv, cmdq);
> + return NULL;
> }
>
> void ivpu_cmdq_release_all_locked(struct ivpu_file_priv *file_priv)
More information about the dri-devel
mailing list