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

habanalabs: Save context in a command buffer object

Future changes require using a context while handling a command buffer,
and thus need to save the context in the command buffer object.
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 448f63ba
...@@ -47,6 +47,8 @@ static void cb_release(struct kref *ref) ...@@ -47,6 +47,8 @@ static void cb_release(struct kref *ref)
hl_debugfs_remove_cb(cb); hl_debugfs_remove_cb(cb);
hl_ctx_put(cb->ctx);
cb_do_release(hdev, cb); cb_do_release(hdev, cb);
} }
...@@ -107,11 +109,12 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size, ...@@ -107,11 +109,12 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,
} }
int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr, int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
u32 cb_size, u64 *handle, int ctx_id, bool internal_cb) struct hl_ctx *ctx, u32 cb_size, bool internal_cb,
u64 *handle)
{ {
struct hl_cb *cb; struct hl_cb *cb;
bool alloc_new_cb = true; bool alloc_new_cb = true;
int rc; int rc, ctx_id = ctx->asid;
/* /*
* Can't use generic function to check this because of special case * Can't use generic function to check this because of special case
...@@ -163,7 +166,8 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr, ...@@ -163,7 +166,8 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
} }
cb->hdev = hdev; cb->hdev = hdev;
cb->ctx_id = ctx_id; cb->ctx = ctx;
hl_ctx_get(hdev, cb->ctx);
spin_lock(&mgr->cb_lock); spin_lock(&mgr->cb_lock);
rc = idr_alloc(&mgr->cb_handles, cb, 1, 0, GFP_ATOMIC); rc = idr_alloc(&mgr->cb_handles, cb, 1, 0, GFP_ATOMIC);
...@@ -191,6 +195,7 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr, ...@@ -191,6 +195,7 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
return 0; return 0;
release_cb: release_cb:
hl_ctx_put(cb->ctx);
cb_do_release(hdev, cb); cb_do_release(hdev, cb);
out_err: out_err:
*handle = 0; *handle = 0;
...@@ -250,9 +255,8 @@ int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -250,9 +255,8 @@ int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data)
args->in.cb_size, HL_MAX_CB_SIZE); args->in.cb_size, HL_MAX_CB_SIZE);
rc = -EINVAL; rc = -EINVAL;
} else { } else {
rc = hl_cb_create(hdev, &hpriv->cb_mgr, rc = hl_cb_create(hdev, &hpriv->cb_mgr, hpriv->ctx,
args->in.cb_size, &handle, args->in.cb_size, false, &handle);
hpriv->ctx->asid, false);
} }
memset(args, 0, sizeof(*args)); memset(args, 0, sizeof(*args));
...@@ -424,7 +428,7 @@ void hl_cb_mgr_fini(struct hl_device *hdev, struct hl_cb_mgr *mgr) ...@@ -424,7 +428,7 @@ void hl_cb_mgr_fini(struct hl_device *hdev, struct hl_cb_mgr *mgr)
if (kref_put(&cb->refcount, cb_release) != 1) if (kref_put(&cb->refcount, cb_release) != 1)
dev_err(hdev->dev, dev_err(hdev->dev,
"CB %d for CTX ID %d is still alive\n", "CB %d for CTX ID %d is still alive\n",
id, cb->ctx_id); id, cb->ctx->asid);
} }
idr_destroy(&mgr->cb_handles); idr_destroy(&mgr->cb_handles);
...@@ -437,8 +441,8 @@ struct hl_cb *hl_cb_kernel_create(struct hl_device *hdev, u32 cb_size, ...@@ -437,8 +441,8 @@ struct hl_cb *hl_cb_kernel_create(struct hl_device *hdev, u32 cb_size,
struct hl_cb *cb; struct hl_cb *cb;
int rc; int rc;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, cb_size, &cb_handle, rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, cb_size,
HL_KERNEL_ASID_ID, internal_cb); internal_cb, &cb_handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
"Failed to allocate CB for the kernel driver %d\n", rc); "Failed to allocate CB for the kernel driver %d\n", rc);
......
...@@ -111,7 +111,7 @@ static int command_buffers_show(struct seq_file *s, void *data) ...@@ -111,7 +111,7 @@ static int command_buffers_show(struct seq_file *s, void *data)
} }
seq_printf(s, seq_printf(s,
" %03llu %d 0x%08x %d %d %d\n", " %03llu %d 0x%08x %d %d %d\n",
cb->id, cb->ctx_id, cb->size, cb->id, cb->ctx->asid, cb->size,
kref_read(&cb->refcount), kref_read(&cb->refcount),
cb->mmap, cb->cs_cnt); cb->mmap, cb->cs_cnt);
} }
......
...@@ -417,6 +417,7 @@ struct hl_cb_mgr { ...@@ -417,6 +417,7 @@ struct hl_cb_mgr {
* struct hl_cb - describes a Command Buffer. * struct hl_cb - describes a Command Buffer.
* @refcount: reference counter for usage of the CB. * @refcount: reference counter for usage of the CB.
* @hdev: pointer to device this CB belongs to. * @hdev: pointer to device this CB belongs to.
* @ctx: pointer to the CB owner's context.
* @lock: spinlock to protect mmap/cs flows. * @lock: spinlock to protect mmap/cs flows.
* @debugfs_list: node in debugfs list of command buffers. * @debugfs_list: node in debugfs list of command buffers.
* @pool_list: node in pool list of command buffers. * @pool_list: node in pool list of command buffers.
...@@ -426,7 +427,6 @@ struct hl_cb_mgr { ...@@ -426,7 +427,6 @@ struct hl_cb_mgr {
* @mmap_size: Holds the CB's size that was mmaped. * @mmap_size: Holds the CB's size that was mmaped.
* @size: holds the CB's size. * @size: holds the CB's size.
* @cs_cnt: holds number of CS that this CB participates in. * @cs_cnt: holds number of CS that this CB participates in.
* @ctx_id: holds the ID of the owner's context.
* @mmap: true if the CB is currently mmaped to user. * @mmap: true if the CB is currently mmaped to user.
* @is_pool: true if CB was acquired from the pool, false otherwise. * @is_pool: true if CB was acquired from the pool, false otherwise.
* @is_internal: internaly allocated * @is_internal: internaly allocated
...@@ -434,6 +434,7 @@ struct hl_cb_mgr { ...@@ -434,6 +434,7 @@ struct hl_cb_mgr {
struct hl_cb { struct hl_cb {
struct kref refcount; struct kref refcount;
struct hl_device *hdev; struct hl_device *hdev;
struct hl_ctx *ctx;
spinlock_t lock; spinlock_t lock;
struct list_head debugfs_list; struct list_head debugfs_list;
struct list_head pool_list; struct list_head pool_list;
...@@ -443,7 +444,6 @@ struct hl_cb { ...@@ -443,7 +444,6 @@ struct hl_cb {
u32 mmap_size; u32 mmap_size;
u32 size; u32 size;
u32 cs_cnt; u32 cs_cnt;
u32 ctx_id;
u8 mmap; u8 mmap;
u8 is_pool; u8 is_pool;
u8 is_internal; u8 is_internal;
...@@ -1838,8 +1838,9 @@ void hl_sysfs_fini(struct hl_device *hdev); ...@@ -1838,8 +1838,9 @@ void hl_sysfs_fini(struct hl_device *hdev);
int hl_hwmon_init(struct hl_device *hdev); int hl_hwmon_init(struct hl_device *hdev);
void hl_hwmon_fini(struct hl_device *hdev); void hl_hwmon_fini(struct hl_device *hdev);
int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr, u32 cb_size, int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
u64 *handle, int ctx_id, bool internal_cb); struct hl_ctx *ctx, u32 cb_size, bool internal_cb,
u64 *handle);
int hl_cb_destroy(struct hl_device *hdev, struct hl_cb_mgr *mgr, u64 cb_handle); int hl_cb_destroy(struct hl_device *hdev, struct hl_cb_mgr *mgr, u64 cb_handle);
int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma); int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma);
struct hl_cb *hl_cb_get(struct hl_device *hdev, struct hl_cb_mgr *mgr, struct hl_cb *hl_cb_get(struct hl_device *hdev, struct hl_cb_mgr *mgr,
......
...@@ -4114,8 +4114,9 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -4114,8 +4114,9 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
parser->patched_cb_size = parser->user_cb_size + parser->patched_cb_size = parser->user_cb_size +
sizeof(struct packet_msg_prot) * 2; sizeof(struct packet_msg_prot) * 2;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size, rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
&patched_cb_handle, HL_KERNEL_ASID_ID, false); parser->patched_cb_size, false,
&patched_cb_handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
...@@ -4187,8 +4188,9 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -4187,8 +4188,9 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
if (rc) if (rc)
goto free_userptr; goto free_userptr;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size, rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
&patched_cb_handle, HL_KERNEL_ASID_ID, false); parser->patched_cb_size, false,
&patched_cb_handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
"Failed to allocate patched CB for DMA CS %d\n", rc); "Failed to allocate patched CB for DMA CS %d\n", rc);
......
...@@ -3810,8 +3810,9 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -3810,8 +3810,9 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
parser->patched_cb_size = parser->user_cb_size + parser->patched_cb_size = parser->user_cb_size +
sizeof(struct packet_msg_prot) * 2; sizeof(struct packet_msg_prot) * 2;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size, rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
&patched_cb_handle, HL_KERNEL_ASID_ID, false); parser->patched_cb_size, false,
&patched_cb_handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
...@@ -3883,8 +3884,9 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev, ...@@ -3883,8 +3884,9 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev,
if (rc) if (rc)
goto free_userptr; goto free_userptr;
rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size, rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
&patched_cb_handle, HL_KERNEL_ASID_ID, false); parser->patched_cb_size, false,
&patched_cb_handle);
if (rc) { if (rc) {
dev_err(hdev->dev, dev_err(hdev->dev,
"Failed to allocate patched CB for DMA CS %d\n", rc); "Failed to allocate patched CB for DMA CS %d\n", rc);
......
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