cxl: Fix force unmapping mmaps of contexts allocated through the kernel api
[deliverable/linux.git] / drivers / misc / cxl / api.c
index 005adc7d33a29c704a77da79b59b7fee36f8ac42..8af12c884b04eeb870d21ae2bb4bf15e0cfb76c4 100644 (file)
 #include <linux/anon_inodes.h>
 #include <linux/file.h>
 #include <misc/cxl.h>
+#include <linux/fs.h>
 
 #include "cxl.h"
 
 struct cxl_context *cxl_dev_context_init(struct pci_dev *dev)
 {
+       struct address_space *mapping;
        struct cxl_afu *afu;
        struct cxl_context  *ctx;
        int rc;
@@ -30,14 +32,32 @@ struct cxl_context *cxl_dev_context_init(struct pci_dev *dev)
                goto err_dev;
        }
 
+       ctx->kernelapi = true;
+
+       /*
+        * Make our own address space since we won't have one from the
+        * filesystem like the user api has, and even if we do associate a file
+        * with this context we don't want to use the global anonymous inode's
+        * address space as that can invalidate unrelated users:
+        */
+       mapping = kmalloc(sizeof(struct address_space), GFP_KERNEL);
+       if (!mapping) {
+               rc = -ENOMEM;
+               goto err_ctx;
+       }
+       address_space_init_once(mapping);
+
        /* Make it a slave context.  We can promote it later? */
-       rc = cxl_context_init(ctx, afu, false, NULL);
+       rc = cxl_context_init(ctx, afu, false, mapping);
        if (rc)
-               goto err_ctx;
+               goto err_mapping;
+
        cxl_assign_psn_space(ctx);
 
        return ctx;
 
+err_mapping:
+       kfree(mapping);
 err_ctx:
        kfree(ctx);
 err_dev:
@@ -260,9 +280,16 @@ struct file *cxl_get_fd(struct cxl_context *ctx, struct file_operations *fops,
 
        file = anon_inode_getfile("cxl", fops, ctx, flags);
        if (IS_ERR(file))
-               put_unused_fd(fdtmp);
+               goto err_fd;
+
+       file->f_mapping = ctx->mapping;
+
        *fd = fdtmp;
        return file;
+
+err_fd:
+       put_unused_fd(fdtmp);
+       return NULL;
 }
 EXPORT_SYMBOL_GPL(cxl_get_fd);
 
This page took 0.024536 seconds and 5 git commands to generate.