Commit 1718a45b authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay

habanalabs: Avoid running restore chunks if no execute chunks

CS with no chunks for execute phase is invalid, so its
context_switch/restore phase should not be run.
Hence, move the check of the execute chunks number to the beginning of
hl_cs_ioctl().
Signed-off-by: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent f3a838c0
...@@ -657,8 +657,8 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -657,8 +657,8 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
struct hl_device *hdev = hpriv->hdev; struct hl_device *hdev = hpriv->hdev;
union hl_cs_args *args = data; union hl_cs_args *args = data;
struct hl_ctx *ctx = hpriv->ctx; struct hl_ctx *ctx = hpriv->ctx;
void __user *chunks; void __user *chunks_execute, *chunks_restore;
u32 num_chunks; u32 num_chunks_execute, num_chunks_restore;
u64 cs_seq = ULONG_MAX; u64 cs_seq = ULONG_MAX;
int rc, do_ctx_switch; int rc, do_ctx_switch;
bool need_soft_reset = false; bool need_soft_reset = false;
...@@ -671,13 +671,25 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -671,13 +671,25 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
goto out; goto out;
} }
chunks_execute = (void __user *) (uintptr_t) args->in.chunks_execute;
num_chunks_execute = args->in.num_chunks_execute;
if (!num_chunks_execute) {
dev_err(hdev->dev,
"Got execute CS with 0 chunks, context %d\n",
ctx->asid);
rc = -EINVAL;
goto out;
}
do_ctx_switch = atomic_cmpxchg(&ctx->thread_ctx_switch_token, 1, 0); do_ctx_switch = atomic_cmpxchg(&ctx->thread_ctx_switch_token, 1, 0);
if (do_ctx_switch || (args->in.cs_flags & HL_CS_FLAGS_FORCE_RESTORE)) { if (do_ctx_switch || (args->in.cs_flags & HL_CS_FLAGS_FORCE_RESTORE)) {
long ret; long ret;
chunks = (void __user *)(uintptr_t)args->in.chunks_restore; chunks_restore =
num_chunks = args->in.num_chunks_restore; (void __user *) (uintptr_t) args->in.chunks_restore;
num_chunks_restore = args->in.num_chunks_restore;
mutex_lock(&hpriv->restore_phase_mutex); mutex_lock(&hpriv->restore_phase_mutex);
...@@ -705,13 +717,13 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -705,13 +717,13 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
hdev->asic_funcs->restore_phase_topology(hdev); hdev->asic_funcs->restore_phase_topology(hdev);
if (num_chunks == 0) { if (!num_chunks_restore) {
dev_dbg(hdev->dev, dev_dbg(hdev->dev,
"Need to run restore phase but restore CS is empty\n"); "Need to run restore phase but restore CS is empty\n");
rc = 0; rc = 0;
} else { } else {
rc = _hl_cs_ioctl(hpriv, chunks, num_chunks, rc = _hl_cs_ioctl(hpriv, chunks_restore,
&cs_seq); num_chunks_restore, &cs_seq);
} }
mutex_unlock(&hpriv->restore_phase_mutex); mutex_unlock(&hpriv->restore_phase_mutex);
...@@ -724,7 +736,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -724,7 +736,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
} }
/* Need to wait for restore completion before execution phase */ /* Need to wait for restore completion before execution phase */
if (num_chunks > 0) { if (num_chunks_restore) {
ret = _hl_cs_wait_ioctl(hdev, ctx, ret = _hl_cs_wait_ioctl(hdev, ctx,
jiffies_to_usecs(hdev->timeout_jiffies), jiffies_to_usecs(hdev->timeout_jiffies),
cs_seq); cs_seq);
...@@ -752,18 +764,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -752,18 +764,7 @@ int hl_cs_ioctl(struct hl_fpriv *hpriv, void *data)
} }
} }
chunks = (void __user *)(uintptr_t)args->in.chunks_execute; rc = _hl_cs_ioctl(hpriv, chunks_execute, num_chunks_execute, &cs_seq);
num_chunks = args->in.num_chunks_execute;
if (num_chunks == 0) {
dev_err(hdev->dev,
"Got execute CS with 0 chunks, context %d\n",
ctx->asid);
rc = -EINVAL;
goto out;
}
rc = _hl_cs_ioctl(hpriv, chunks, num_chunks, &cs_seq);
out: out:
if (rc != -EAGAIN) { if (rc != -EAGAIN) {
......
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