Commit 9a4e44a4 authored by Koby Elbaz's avatar Koby Elbaz Committed by Oded Gabbay
Browse files

accel/habanalabs: refactor abort of completions and waits



Aborting CS completions should be in command_submission.c but aborting
waiting for user interrupts should be in device.c.

This separation is also for adding more abort operations in the future.

Signed-off-by: default avatarKoby Elbaz <kelbaz@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent ad8bfd36
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1139,11 +1139,10 @@ static void force_complete_cs(struct hl_device *hdev)
	spin_unlock(&hdev->cs_mirror_lock);
}

void hl_abort_waitings_for_completion(struct hl_device *hdev)
void hl_abort_waiting_for_cs_completions(struct hl_device *hdev)
{
	force_complete_cs(hdev);
	force_complete_multi_cs(hdev);
	hl_release_pending_user_interrupts(hdev);
}

static void job_wq_completion(struct work_struct *work)
+12 −5
Original line number Diff line number Diff line
@@ -1157,6 +1157,16 @@ static void take_release_locks(struct hl_device *hdev)
	mutex_unlock(&hdev->fpriv_ctrl_list_lock);
}

static void hl_abort_waiting_for_completions(struct hl_device *hdev)
{
	hl_abort_waiting_for_cs_completions(hdev);

	/* Release all pending user interrupts, each pending user interrupt
	 * holds a reference to a user context.
	 */
	hl_release_pending_user_interrupts(hdev);
}

static void cleanup_resources(struct hl_device *hdev, bool hard_reset, bool fw_reset,
				bool skip_wq_flush)
{
@@ -1176,10 +1186,7 @@ static void cleanup_resources(struct hl_device *hdev, bool hard_reset, bool fw_r
	/* flush the MMU prefetch workqueue */
	flush_workqueue(hdev->prefetch_wq);

	/* Release all pending user interrupts, each pending user interrupt
	 * holds a reference to user context
	 */
	hl_release_pending_user_interrupts(hdev);
	hl_abort_waiting_for_completions(hdev);
}

/*
@@ -1921,7 +1928,7 @@ int hl_device_cond_reset(struct hl_device *hdev, u32 flags, u64 event_mask)

	hl_ctx_put(ctx);

	hl_abort_waitings_for_completion(hdev);
	hl_abort_waiting_for_completions(hdev);

	return 0;

+1 −1
Original line number Diff line number Diff line
@@ -3934,7 +3934,7 @@ void hl_dec_fini(struct hl_device *hdev);
void hl_dec_ctx_fini(struct hl_ctx *ctx);

void hl_release_pending_user_interrupts(struct hl_device *hdev);
void hl_abort_waitings_for_completion(struct hl_device *hdev);
void hl_abort_waiting_for_cs_completions(struct hl_device *hdev);
int hl_cs_signal_sob_wraparound_handler(struct hl_device *hdev, u32 q_idx,
			struct hl_hw_sob **hw_sob, u32 count, bool encaps_sig);