[PATCH] habanalabs: Small refactoring of cs_do_release()
From: Oded Gabbay
Date: Wed Nov 04 2020 - 09:09:42 EST
From: Tomer Tayar <ttayar@xxxxxxxxx>
Slightly refactor the cs_do_release() function, to reduce nesting level
and to ease the handling of future CS types.
Signed-off-by: Tomer Tayar <ttayar@xxxxxxxxx>
Reviewed-by: Oded Gabbay <ogabbay@xxxxxxxxxx>
Signed-off-by: Oded Gabbay <ogabbay@xxxxxxxxxx>
---
.../habanalabs/common/command_submission.c | 99 +++++++++----------
1 file changed, 49 insertions(+), 50 deletions(-)
diff --git a/drivers/misc/habanalabs/common/command_submission.c b/drivers/misc/habanalabs/common/command_submission.c
index 3e6f4e5ef7ec..18cd20eec4c5 100644
--- a/drivers/misc/habanalabs/common/command_submission.c
+++ b/drivers/misc/habanalabs/common/command_submission.c
@@ -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,69 +298,69 @@ 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) {
- hdev->asic_funcs->hw_queues_lock(hdev);
+ 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);
- hdev->cs_active_cnt--;
- if (!hdev->cs_active_cnt) {
- struct hl_device_idle_busy_ts *ts;
+ goto out;
+ }
- ts = &hdev->idle_busy_ts_arr[hdev->idle_busy_ts_idx++];
- ts->busy_to_idle_ts = ktime_get();
+ hdev->asic_funcs->hw_queues_lock(hdev);
- if (hdev->idle_busy_ts_idx == HL_IDLE_BUSY_TS_ARR_SIZE)
- hdev->idle_busy_ts_idx = 0;
- } else if (hdev->cs_active_cnt < 0) {
- dev_crit(hdev->dev, "CS active cnt %d is negative\n",
- hdev->cs_active_cnt);
- }
+ hdev->cs_active_cnt--;
+ if (!hdev->cs_active_cnt) {
+ struct hl_device_idle_busy_ts *ts;
- hdev->asic_funcs->hw_queues_unlock(hdev);
+ ts = &hdev->idle_busy_ts_arr[hdev->idle_busy_ts_idx++];
+ ts->busy_to_idle_ts = ktime_get();
- hl_int_hw_queue_update_ci(cs);
+ if (hdev->idle_busy_ts_idx == HL_IDLE_BUSY_TS_ARR_SIZE)
+ hdev->idle_busy_ts_idx = 0;
+ } else if (hdev->cs_active_cnt < 0) {
+ dev_crit(hdev->dev, "CS active cnt %d is negative\n",
+ hdev->cs_active_cnt);
+ }
- spin_lock(&hdev->hw_queues_mirror_lock);
- /* remove CS from hw_queues mirror list */
- list_del_init(&cs->mirror_node);
- spin_unlock(&hdev->hw_queues_mirror_lock);
+ hdev->asic_funcs->hw_queues_unlock(hdev);
- /*
- * 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)) {
- struct hl_cs *next;
+ /* Need to update CI for internal queues */
+ hl_int_hw_queue_update_ci(cs);
- if (cs->tdr_active)
- cancel_delayed_work_sync(&cs->work_tdr);
+ spin_lock(&hdev->hw_queues_mirror_lock);
+ /* remove CS from hw_queues mirror list */
+ list_del_init(&cs->mirror_node);
+ spin_unlock(&hdev->hw_queues_mirror_lock);
- spin_lock(&hdev->hw_queues_mirror_lock);
+ /* 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) {
+ struct hl_cs *next;
- /* queue TDR for next CS */
- next = list_first_entry_or_null(
- &hdev->hw_queues_mirror_list,
- struct hl_cs, mirror_node);
+ if (cs->tdr_active)
+ cancel_delayed_work_sync(&cs->work_tdr);
- if ((next) && (!next->tdr_active)) {
- next->tdr_active = true;
- schedule_delayed_work(&next->work_tdr,
- hdev->timeout_jiffies);
- }
+ spin_lock(&hdev->hw_queues_mirror_lock);
+
+ /* queue TDR for next CS */
+ next = list_first_entry_or_null(&hdev->hw_queues_mirror_list,
+ struct hl_cs, mirror_node);
- spin_unlock(&hdev->hw_queues_mirror_lock);
+ if (next && !next->tdr_active) {
+ next->tdr_active = true;
+ schedule_delayed_work(&next->work_tdr,
+ hdev->timeout_jiffies);
}
- } 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);
+
+ spin_unlock(&hdev->hw_queues_mirror_lock);
}
- /*
- * 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);
--
2.17.1