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

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
...@@ -281,8 +281,7 @@ static void free_job(struct hl_device *hdev, struct hl_cs_job *job) ...@@ -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) static void cs_do_release(struct kref *ref)
{ {
struct hl_cs *cs = container_of(ref, struct hl_cs, struct hl_cs *cs = container_of(ref, struct hl_cs, refcount);
refcount);
struct hl_device *hdev = cs->ctx->hdev; struct hl_device *hdev = cs->ctx->hdev;
struct hl_cs_job *job, *tmp; struct hl_cs_job *job, *tmp;
...@@ -299,69 +298,69 @@ static void cs_do_release(struct kref *ref) ...@@ -299,69 +298,69 @@ static void cs_do_release(struct kref *ref)
list_for_each_entry_safe(job, tmp, &cs->job_list, cs_node) list_for_each_entry_safe(job, tmp, &cs->job_list, cs_node)
free_job(hdev, job); 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
hdev->asic_funcs->hw_queues_lock(hdev); * 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--; goto out;
if (!hdev->cs_active_cnt) { }
struct hl_device_idle_busy_ts *ts;
ts = &hdev->idle_busy_ts_arr[hdev->idle_busy_ts_idx++]; hdev->asic_funcs->hw_queues_lock(hdev);
ts->busy_to_idle_ts = ktime_get();
if (hdev->idle_busy_ts_idx == HL_IDLE_BUSY_TS_ARR_SIZE) hdev->cs_active_cnt--;
hdev->idle_busy_ts_idx = 0; if (!hdev->cs_active_cnt) {
} else if (hdev->cs_active_cnt < 0) { struct hl_device_idle_busy_ts *ts;
dev_crit(hdev->dev, "CS active cnt %d is negative\n",
hdev->cs_active_cnt);
}
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); hdev->asic_funcs->hw_queues_unlock(hdev);
/* remove CS from hw_queues mirror list */
list_del_init(&cs->mirror_node);
spin_unlock(&hdev->hw_queues_mirror_lock);
/* /* Need to update CI for internal queues */
* Don't cancel TDR in case this CS was timedout because we hl_int_hw_queue_update_ci(cs);
* might be running from the TDR context
*/
if ((!cs->timedout) &&
(hdev->timeout_jiffies != MAX_SCHEDULE_TIMEOUT)) {
struct hl_cs *next;
if (cs->tdr_active) spin_lock(&hdev->hw_queues_mirror_lock);
cancel_delayed_work_sync(&cs->work_tdr); /* 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 */ if (cs->tdr_active)
next = list_first_entry_or_null( cancel_delayed_work_sync(&cs->work_tdr);
&hdev->hw_queues_mirror_list,
struct hl_cs, mirror_node);
if ((next) && (!next->tdr_active)) { spin_lock(&hdev->hw_queues_mirror_lock);
next->tdr_active = true;
schedule_delayed_work(&next->work_tdr, /* queue TDR for next CS */
hdev->timeout_jiffies); 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) {
/* spin_unlock(&hdev->hw_queues_mirror_lock);
* 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);
} }
/* out:
* Must be called before hl_ctx_put because inside we use ctx to get /* Must be called before hl_ctx_put because inside we use ctx to get
* the device * the device
*/ */
hl_debugfs_remove_cs(cs); hl_debugfs_remove_cs(cs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment