Commit ea6ee260 authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay
Browse files

habanalabs: Small refactoring of cs_do_release()



Slightly refactor the cs_do_release() function, to reduce nesting level
and to ease the handling of future CS types.

Signed-off-by: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 6de3d769
Loading
Loading
Loading
Loading
+49 −50
Original line number Diff line number Diff line
@@ -281,8 +281,7 @@ static void free_job(struct hl_device *hdev, struct hl_cs_job *job)

static void cs_do_release(struct kref *ref)
{
	struct hl_cs *cs = container_of(ref, struct hl_cs,
						refcount);
	struct hl_cs *cs = container_of(ref, struct hl_cs, refcount);
	struct hl_device *hdev = cs->ctx->hdev;
	struct hl_cs_job *job, *tmp;

@@ -299,8 +298,16 @@ static void cs_do_release(struct kref *ref)
	list_for_each_entry_safe(job, tmp, &cs->job_list, cs_node)
		free_job(hdev, job);

	/* We also need to update CI for internal queues */
	if (cs->submitted) {
	if (!cs->submitted) {
		/* In case the wait for signal CS was submitted, the put occurs
		 * in init_signal_wait_cs() right before hanging on the PQ.
		 */
		if (cs->type == CS_TYPE_WAIT)
			hl_fence_put(cs->signal_fence);

		goto out;
	}

	hdev->asic_funcs->hw_queues_lock(hdev);

	hdev->cs_active_cnt--;
@@ -319,6 +326,7 @@ static void cs_do_release(struct kref *ref)

	hdev->asic_funcs->hw_queues_unlock(hdev);

	/* Need to update CI for internal queues */
	hl_int_hw_queue_update_ci(cs);

	spin_lock(&hdev->hw_queues_mirror_lock);
@@ -326,12 +334,11 @@ static void cs_do_release(struct kref *ref)
	list_del_init(&cs->mirror_node);
	spin_unlock(&hdev->hw_queues_mirror_lock);

		/*
		 * Don't cancel TDR in case this CS was timedout because we
		 * might be running from the TDR context
	/* Don't cancel TDR in case this CS was timedout because we might be
	 * running from the TDR context
	 */
		if ((!cs->timedout) &&
			(hdev->timeout_jiffies != MAX_SCHEDULE_TIMEOUT)) {
	if (!cs->timedout &&
			hdev->timeout_jiffies != MAX_SCHEDULE_TIMEOUT) {
		struct hl_cs *next;

		if (cs->tdr_active)
@@ -340,11 +347,10 @@ static void cs_do_release(struct kref *ref)
		spin_lock(&hdev->hw_queues_mirror_lock);

		/* queue TDR for next CS */
			next = list_first_entry_or_null(
					&hdev->hw_queues_mirror_list,
		next = list_first_entry_or_null(&hdev->hw_queues_mirror_list,
						struct hl_cs, mirror_node);

			if ((next) && (!next->tdr_active)) {
		if (next && !next->tdr_active) {
			next->tdr_active = true;
			schedule_delayed_work(&next->work_tdr,
						hdev->timeout_jiffies);
@@ -352,16 +358,9 @@ static void cs_do_release(struct kref *ref)

		spin_unlock(&hdev->hw_queues_mirror_lock);
	}
	} else if (cs->type == CS_TYPE_WAIT) {
		/*
		 * In case the wait for signal CS was submitted, the put occurs
		 * in init_signal_wait_cs() right before hanging on the PQ.
		 */
		hl_fence_put(cs->signal_fence);
	}

	/*
	 * Must be called before hl_ctx_put because inside we use ctx to get
out:
	/* Must be called before hl_ctx_put because inside we use ctx to get
	 * the device
	 */
	hl_debugfs_remove_cs(cs);