| From b2250e8cba040518c0f8fe5589fffd2e08a07706 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 18 Jan 2022 12:16:53 +0200 |
| Subject: habanalabs: reject host map with mmu disabled |
| |
| From: Oded Gabbay <ogabbay@kernel.org> |
| |
| [ Upstream commit 9a79e3e4a3637c07352d9723b825490a1b04391f ] |
| |
| This is not something we can do a workaround. It is clearly an error |
| and we should notify the user that it is an error. |
| |
| Signed-off-by: Oded Gabbay <ogabbay@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/misc/habanalabs/common/memory.c | 30 +++++++++---------------- |
| 1 file changed, 11 insertions(+), 19 deletions(-) |
| |
| diff --git a/drivers/misc/habanalabs/common/memory.c b/drivers/misc/habanalabs/common/memory.c |
| index 9bd626a00de3..03416b4ee0b7 100644 |
| --- a/drivers/misc/habanalabs/common/memory.c |
| +++ b/drivers/misc/habanalabs/common/memory.c |
| @@ -1973,16 +1973,15 @@ static int export_dmabuf_from_handle(struct hl_ctx *ctx, u64 handle, int flags, |
| static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args) |
| { |
| struct hl_device *hdev = hpriv->hdev; |
| - struct hl_ctx *ctx = hpriv->ctx; |
| u64 block_handle, device_addr = 0; |
| + struct hl_ctx *ctx = hpriv->ctx; |
| u32 handle = 0, block_size; |
| - int rc, dmabuf_fd = -EBADF; |
| + int rc; |
| |
| switch (args->in.op) { |
| case HL_MEM_OP_ALLOC: |
| if (args->in.alloc.mem_size == 0) { |
| - dev_err(hdev->dev, |
| - "alloc size must be larger than 0\n"); |
| + dev_err(hdev->dev, "alloc size must be larger than 0\n"); |
| rc = -EINVAL; |
| goto out; |
| } |
| @@ -2003,15 +2002,14 @@ static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args) |
| |
| case HL_MEM_OP_MAP: |
| if (args->in.flags & HL_MEM_USERPTR) { |
| - device_addr = args->in.map_host.host_virt_addr; |
| - rc = 0; |
| + dev_err(hdev->dev, "Failed to map host memory when MMU is disabled\n"); |
| + rc = -EPERM; |
| } else { |
| - rc = get_paddr_from_handle(ctx, &args->in, |
| - &device_addr); |
| + rc = get_paddr_from_handle(ctx, &args->in, &device_addr); |
| + memset(args, 0, sizeof(*args)); |
| + args->out.device_virt_addr = device_addr; |
| } |
| |
| - memset(args, 0, sizeof(*args)); |
| - args->out.device_virt_addr = device_addr; |
| break; |
| |
| case HL_MEM_OP_UNMAP: |
| @@ -2019,20 +2017,14 @@ static int mem_ioctl_no_mmu(struct hl_fpriv *hpriv, union hl_mem_args *args) |
| break; |
| |
| case HL_MEM_OP_MAP_BLOCK: |
| - rc = map_block(hdev, args->in.map_block.block_addr, |
| - &block_handle, &block_size); |
| + rc = map_block(hdev, args->in.map_block.block_addr, &block_handle, &block_size); |
| args->out.block_handle = block_handle; |
| args->out.block_size = block_size; |
| break; |
| |
| case HL_MEM_OP_EXPORT_DMABUF_FD: |
| - rc = export_dmabuf_from_addr(ctx, |
| - args->in.export_dmabuf_fd.handle, |
| - args->in.export_dmabuf_fd.mem_size, |
| - args->in.flags, |
| - &dmabuf_fd); |
| - memset(args, 0, sizeof(*args)); |
| - args->out.fd = dmabuf_fd; |
| + dev_err(hdev->dev, "Failed to export dma-buf object when MMU is disabled\n"); |
| + rc = -EPERM; |
| break; |
| |
| default: |
| -- |
| 2.35.1 |
| |