]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
habanalabs: reject host map with mmu disabled
authorOded Gabbay <ogabbay@kernel.org>
Tue, 18 Jan 2022 10:16:53 +0000 (12:16 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Apr 2022 18:03:09 +0000 (20:03 +0200)
[ 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

index 9bd626a00de30c323e5c9db9e9e2acf370a05e54..03416b4ee0b7a209267704e7c3245ba0397aff86 100644 (file)
@@ -1973,16 +1973,15 @@ err_dec_exporting_cnt:
 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: