accel/ivpu: Do not fail on cmdq if failed to allocate preemption buffers
authorKarol Wachowski <karol.wachowski@intel.com>
Mon, 30 Sep 2024 19:53:16 +0000 (21:53 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Fri, 11 Oct 2024 10:44:39 +0000 (12:44 +0200)
Allow to proceed with job command queue creation even if preemption
buffers failed to be allocated, print warning that preemption on such
command queue will be disabled.

Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-26-jacek.lawrynowicz@linux.intel.com
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
drivers/accel/ivpu/ivpu_job.c

index dc5cf7d..48272bc 100644 (file)
@@ -60,6 +60,7 @@ static int ivpu_preemption_buffers_create(struct ivpu_device *vdev,
 
 err_free_primary:
        ivpu_bo_free(cmdq->primary_preempt_buf);
+       cmdq->primary_preempt_buf = NULL;
        return -ENOMEM;
 }
 
@@ -69,10 +70,10 @@ static void ivpu_preemption_buffers_free(struct ivpu_device *vdev,
        if (vdev->fw->sched_mode != VPU_SCHEDULING_MODE_HW)
                return;
 
-       drm_WARN_ON(&vdev->drm, !cmdq->primary_preempt_buf);
-       drm_WARN_ON(&vdev->drm, !cmdq->secondary_preempt_buf);
-       ivpu_bo_free(cmdq->primary_preempt_buf);
-       ivpu_bo_free(cmdq->secondary_preempt_buf);
+       if (cmdq->primary_preempt_buf)
+               ivpu_bo_free(cmdq->primary_preempt_buf);
+       if (cmdq->secondary_preempt_buf)
+               ivpu_bo_free(cmdq->secondary_preempt_buf);
 }
 
 static int ivpu_id_alloc(struct xarray *xa, u32 *id, void *entry, struct xa_limit *limit,
@@ -120,12 +121,10 @@ static struct ivpu_cmdq *ivpu_cmdq_alloc(struct ivpu_file_priv *file_priv)
 
        ret = ivpu_preemption_buffers_create(vdev, file_priv, cmdq);
        if (ret)
-               goto err_free_cmdq_mem;
+               ivpu_warn(vdev, "Failed to allocate preemption buffers, preemption limited\n");
 
        return cmdq;
 
-err_free_cmdq_mem:
-       ivpu_bo_free(cmdq->mem);
 err_erase_xa:
        xa_erase(&vdev->db_xa, cmdq->db_id);
 err_free_cmdq:
@@ -388,10 +387,16 @@ static int ivpu_cmdq_push_job(struct ivpu_cmdq *cmdq, struct ivpu_job *job)
 
        if (vdev->fw->sched_mode == VPU_SCHEDULING_MODE_HW &&
            (unlikely(!(ivpu_test_mode & IVPU_TEST_MODE_PREEMPTION_DISABLE)))) {
-               entry->primary_preempt_buf_addr = cmdq->primary_preempt_buf->vpu_addr;
-               entry->primary_preempt_buf_size = ivpu_bo_size(cmdq->primary_preempt_buf);
-               entry->secondary_preempt_buf_addr = cmdq->secondary_preempt_buf->vpu_addr;
-               entry->secondary_preempt_buf_size = ivpu_bo_size(cmdq->secondary_preempt_buf);
+               if (cmdq->primary_preempt_buf) {
+                       entry->primary_preempt_buf_addr = cmdq->primary_preempt_buf->vpu_addr;
+                       entry->primary_preempt_buf_size = ivpu_bo_size(cmdq->primary_preempt_buf);
+               }
+
+               if (cmdq->secondary_preempt_buf) {
+                       entry->secondary_preempt_buf_addr = cmdq->secondary_preempt_buf->vpu_addr;
+                       entry->secondary_preempt_buf_size =
+                               ivpu_bo_size(cmdq->secondary_preempt_buf);
+               }
        }
 
        wmb(); /* Ensure that tail is updated after filling entry */