Commit 08eb99ce authored by Karol Wachowski's avatar Karol Wachowski Committed by Jacek Lawrynowicz
Browse files

accel/ivpu: Do not fail on cmdq if failed to allocate preemption buffers



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: default avatarKarol Wachowski <karol.wachowski@intel.com>
Reviewed-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-26-jacek.lawrynowicz@linux.intel.com


Signed-off-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
parent 1bc92a51
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -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,9 +70,9 @@ 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);
	if (cmdq->primary_preempt_buf)
		ivpu_bo_free(cmdq->primary_preempt_buf);
	if (cmdq->secondary_preempt_buf)
		ivpu_bo_free(cmdq->secondary_preempt_buf);
}

@@ -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)))) {
		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);
			entry->secondary_preempt_buf_size =
				ivpu_bo_size(cmdq->secondary_preempt_buf);
		}
	}

	wmb(); /* Ensure that tail is updated after filling entry */