summaryrefslogtreecommitdiff
path: root/drivers/accel/habanalabs/common/memory.c
diff options
context:
space:
mode:
authorTomer Tayar <ttayar@habana.ai>2023-01-22 13:17:02 +0300
committerOded Gabbay <ogabbay@kernel.org>2023-03-15 14:29:12 +0300
commit09524eb8824e102fb57210967bc9d61d7469121c (patch)
treef509d999451adad7519234031aba5965c157e334 /drivers/accel/habanalabs/common/memory.c
parentd43bce6e762f25b25685487630510452feaf7362 (diff)
downloadlinux-09524eb8824e102fb57210967bc9d61d7469121c.tar.xz
accel/habanalabs: enforce release order of compute device and dma-buf
When user closes the compute device file descriptor without closing a dma-buf file descriptor, the device will be considered as in use, leading to hard reset and killing the user process, to ensure the release of the dma-buf. Same thing will happen if user first releases the compute device file and only then the dma-buf. The implication of this is the duration of hard reset, during which the device cannot be reacquired. Moreover, this behavior adds a constraint on a user process to follow this order of release operations. To avoid killing the user process and to remove this constraint, enforce the correct order of release operations inside the driver, by incrementing the device file refcount for any dma-buf until it is released. Signed-off-by: Tomer Tayar <ttayar@habana.ai> Reviewed-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Oded Gabbay <ogabbay@kernel.org> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Diffstat (limited to 'drivers/accel/habanalabs/common/memory.c')
-rw-r--r--drivers/accel/habanalabs/common/memory.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/accel/habanalabs/common/memory.c b/drivers/accel/habanalabs/common/memory.c
index fd333dd2835e..7fd8e8f87682 100644
--- a/drivers/accel/habanalabs/common/memory.c
+++ b/drivers/accel/habanalabs/common/memory.c
@@ -1835,6 +1835,10 @@ static void hl_release_dmabuf(struct dma_buf *dmabuf)
atomic_dec(&ctx->hdev->dmabuf_export_cnt);
hl_ctx_put(ctx);
+
+ /* Paired with get_file() in export_dmabuf() */
+ fput(ctx->hpriv->filp);
+
kfree(hl_dmabuf);
}
@@ -1875,6 +1879,12 @@ static int export_dmabuf(struct hl_ctx *ctx,
hl_ctx_get(hl_dmabuf->ctx);
atomic_inc(&ctx->hdev->dmabuf_export_cnt);
+ /* Get compute device file to enforce release order, such that all exported dma-buf will be
+ * released first and only then the compute device.
+ * Paired with fput() in hl_release_dmabuf().
+ */
+ get_file(ctx->hpriv->filp);
+
*dmabuf_fd = fd;
return 0;