habanalabs: Save context in a command buffer object
authorTomer Tayar <ttayar@habana.ai>
Mon, 7 Sep 2020 14:36:41 +0000 (17:36 +0300)
committerOded Gabbay <oded.gabbay@gmail.com>
Tue, 22 Sep 2020 15:49:54 +0000 (18:49 +0300)
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: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/misc/habanalabs/common/command_buffer.c
drivers/misc/habanalabs/common/debugfs.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/goya/goya.c

index ba63cee..0cb556f 100644 (file)
@@ -47,6 +47,8 @@ static void cb_release(struct kref *ref)
 
        hl_debugfs_remove_cb(cb);
 
+       hl_ctx_put(cb->ctx);
+
        cb_do_release(hdev, cb);
 }
 
@@ -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,
-                       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;
        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
@@ -163,7 +166,8 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
        }
 
        cb->hdev = hdev;
-       cb->ctx_id = ctx_id;
+       cb->ctx = ctx;
+       hl_ctx_get(hdev, cb->ctx);
 
        spin_lock(&mgr->cb_lock);
        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,
        return 0;
 
 release_cb:
+       hl_ctx_put(cb->ctx);
        cb_do_release(hdev, cb);
 out_err:
        *handle = 0;
@@ -250,9 +255,8 @@ int hl_cb_ioctl(struct hl_fpriv *hpriv, void *data)
                                args->in.cb_size, HL_MAX_CB_SIZE);
                        rc = -EINVAL;
                } else {
-                       rc = hl_cb_create(hdev, &hpriv->cb_mgr,
-                                       args->in.cb_size, &handle,
-                                       hpriv->ctx->asid, false);
+                       rc = hl_cb_create(hdev, &hpriv->cb_mgr, hpriv->ctx,
+                                       args->in.cb_size, false, &handle);
                }
 
                memset(args, 0, sizeof(*args));
@@ -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)
                        dev_err(hdev->dev,
                                "CB %d for CTX ID %d is still alive\n",
-                               id, cb->ctx_id);
+                               id, cb->ctx->asid);
        }
 
        idr_destroy(&mgr->cb_handles);
@@ -437,8 +441,8 @@ struct hl_cb *hl_cb_kernel_create(struct hl_device *hdev, u32 cb_size,
        struct hl_cb *cb;
        int rc;
 
-       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, cb_size, &cb_handle,
-                       HL_KERNEL_ASID_ID, internal_cb);
+       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx, cb_size,
+                               internal_cb, &cb_handle);
        if (rc) {
                dev_err(hdev->dev,
                        "Failed to allocate CB for the kernel driver %d\n", rc);
index 5d4665d..912ddfa 100644 (file)
@@ -111,7 +111,7 @@ static int command_buffers_show(struct seq_file *s, void *data)
                }
                seq_printf(s,
                        "   %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),
                        cb->mmap, cb->cs_cnt);
        }
index 8ef6192..88c68b6 100644 (file)
@@ -417,6 +417,7 @@ struct hl_cb_mgr {
  * struct hl_cb - describes a Command Buffer.
  * @refcount: reference counter for usage of the CB.
  * @hdev: pointer to device this CB belongs to.
+ * @ctx: pointer to the CB owner's context.
  * @lock: spinlock to protect mmap/cs flows.
  * @debugfs_list: node in debugfs list of command buffers.
  * @pool_list: node in pool list of command buffers.
@@ -426,7 +427,6 @@ struct hl_cb_mgr {
  * @mmap_size: Holds the CB's size that was mmaped.
  * @size: holds the CB's size.
  * @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.
  * @is_pool: true if CB was acquired from the pool, false otherwise.
  * @is_internal: internaly allocated
@@ -434,6 +434,7 @@ struct hl_cb_mgr {
 struct hl_cb {
        struct kref             refcount;
        struct hl_device        *hdev;
+       struct hl_ctx           *ctx;
        spinlock_t              lock;
        struct list_head        debugfs_list;
        struct list_head        pool_list;
@@ -443,7 +444,6 @@ struct hl_cb {
        u32                     mmap_size;
        u32                     size;
        u32                     cs_cnt;
-       u32                     ctx_id;
        u8                      mmap;
        u8                      is_pool;
        u8                      is_internal;
@@ -1838,8 +1838,9 @@ void hl_sysfs_fini(struct hl_device *hdev);
 int hl_hwmon_init(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,
-               u64 *handle, int ctx_id, bool internal_cb);
+int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
+                       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_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,
index bf010ff..b51cc6c 100644 (file)
@@ -4114,8 +4114,9 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
        parser->patched_cb_size = parser->user_cb_size +
                        sizeof(struct packet_msg_prot) * 2;
 
-       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size,
-                       &patched_cb_handle, HL_KERNEL_ASID_ID, false);
+       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
+                               parser->patched_cb_size, false,
+                               &patched_cb_handle);
 
        if (rc) {
                dev_err(hdev->dev,
@@ -4187,8 +4188,9 @@ static int gaudi_parse_cb_no_mmu(struct hl_device *hdev,
        if (rc)
                goto free_userptr;
 
-       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size,
-                       &patched_cb_handle, HL_KERNEL_ASID_ID, false);
+       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
+                               parser->patched_cb_size, false,
+                               &patched_cb_handle);
        if (rc) {
                dev_err(hdev->dev,
                        "Failed to allocate patched CB for DMA CS %d\n", rc);
index 6f831cc..6c81a4b 100644 (file)
@@ -3810,8 +3810,9 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
        parser->patched_cb_size = parser->user_cb_size +
                        sizeof(struct packet_msg_prot) * 2;
 
-       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size,
-                       &patched_cb_handle, HL_KERNEL_ASID_ID, false);
+       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
+                               parser->patched_cb_size, false,
+                               &patched_cb_handle);
 
        if (rc) {
                dev_err(hdev->dev,
@@ -3883,8 +3884,9 @@ static int goya_parse_cb_no_mmu(struct hl_device *hdev,
        if (rc)
                goto free_userptr;
 
-       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, parser->patched_cb_size,
-                       &patched_cb_handle, HL_KERNEL_ASID_ID, false);
+       rc = hl_cb_create(hdev, &hdev->kernel_cb_mgr, hdev->kernel_ctx,
+                               parser->patched_cb_size, false,
+                               &patched_cb_handle);
        if (rc) {
                dev_err(hdev->dev,
                        "Failed to allocate patched CB for DMA CS %d\n", rc);