iommufd: Move _iommufd_object_alloc helper to a sharable file
authorNicolin Chen <nicolinc@nvidia.com>
Tue, 5 Nov 2024 20:04:18 +0000 (12:04 -0800)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 12 Nov 2024 15:46:18 +0000 (11:46 -0400)
The following patch will add a new vIOMMU allocator that will require this
_iommufd_object_alloc to be sharable with IOMMU drivers (and iommufd too).

Add a new driver.c file that will be built with CONFIG_IOMMUFD_DRIVER_CORE
selected by CONFIG_IOMMUFD, and put the CONFIG_DRIVER under that remaining
to be selectable for drivers to build the existing iova_bitmap.c file.

Link: https://patch.msgid.link/r/2f4f6e116dc49ffb67ff6c5e8a7a8e789ab9e98e.1730836219.git.nicolinc@nvidia.com
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/Kconfig
drivers/iommu/iommufd/Makefile
drivers/iommu/iommufd/driver.c [new file with mode: 0644]
drivers/iommu/iommufd/iommufd_private.h
drivers/iommu/iommufd/main.c
include/linux/iommufd.h

index 76656fe..0a07f94 100644 (file)
@@ -1,4 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0-only
+config IOMMUFD_DRIVER_CORE
+       tristate
+       default (IOMMUFD_DRIVER || IOMMUFD) if IOMMUFD!=n
+
 config IOMMUFD
        tristate "IOMMU Userspace API"
        select INTERVAL_TREE
index cf46059..83df907 100644 (file)
@@ -13,3 +13,6 @@ iommufd-$(CONFIG_IOMMUFD_TEST) += selftest.o
 
 obj-$(CONFIG_IOMMUFD) += iommufd.o
 obj-$(CONFIG_IOMMUFD_DRIVER) += iova_bitmap.o
+
+iommufd_driver-y := driver.o
+obj-$(CONFIG_IOMMUFD_DRIVER_CORE) += iommufd_driver.o
diff --git a/drivers/iommu/iommufd/driver.c b/drivers/iommu/iommufd/driver.c
new file mode 100644 (file)
index 0000000..2bc47d9
--- /dev/null
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES
+ */
+#include "iommufd_private.h"
+
+struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
+                                            size_t size,
+                                            enum iommufd_object_type type)
+{
+       struct iommufd_object *obj;
+       int rc;
+
+       obj = kzalloc(size, GFP_KERNEL_ACCOUNT);
+       if (!obj)
+               return ERR_PTR(-ENOMEM);
+       obj->type = type;
+       /* Starts out bias'd by 1 until it is removed from the xarray */
+       refcount_set(&obj->shortterm_users, 1);
+       refcount_set(&obj->users, 1);
+
+       /*
+        * Reserve an ID in the xarray but do not publish the pointer yet since
+        * the caller hasn't initialized it yet. Once the pointer is published
+        * in the xarray and visible to other threads we can't reliably destroy
+        * it anymore, so the caller must complete all errorable operations
+        * before calling iommufd_object_finalize().
+        */
+       rc = xa_alloc(&ictx->objects, &obj->id, XA_ZERO_ENTRY, xa_limit_31b,
+                     GFP_KERNEL_ACCOUNT);
+       if (rc)
+               goto out_free;
+       return obj;
+out_free:
+       kfree(obj);
+       return ERR_PTR(rc);
+}
+EXPORT_SYMBOL_NS_GPL(_iommufd_object_alloc, IOMMUFD);
+
+MODULE_DESCRIPTION("iommufd code shared with builtin modules");
+MODULE_LICENSE("GPL");
index 94cfcab..be347f7 100644 (file)
@@ -206,10 +206,6 @@ iommufd_object_put_and_try_destroy(struct iommufd_ctx *ictx,
        iommufd_object_remove(ictx, obj, obj->id, 0);
 }
 
-struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
-                                            size_t size,
-                                            enum iommufd_object_type type);
-
 #define __iommufd_object_alloc(ictx, ptr, type, obj)                           \
        container_of(_iommufd_object_alloc(                                    \
                             ictx,                                             \
index 826a2b2..3c32b44 100644 (file)
@@ -29,38 +29,6 @@ struct iommufd_object_ops {
 static const struct iommufd_object_ops iommufd_object_ops[];
 static struct miscdevice vfio_misc_dev;
 
-struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
-                                            size_t size,
-                                            enum iommufd_object_type type)
-{
-       struct iommufd_object *obj;
-       int rc;
-
-       obj = kzalloc(size, GFP_KERNEL_ACCOUNT);
-       if (!obj)
-               return ERR_PTR(-ENOMEM);
-       obj->type = type;
-       /* Starts out bias'd by 1 until it is removed from the xarray */
-       refcount_set(&obj->shortterm_users, 1);
-       refcount_set(&obj->users, 1);
-
-       /*
-        * Reserve an ID in the xarray but do not publish the pointer yet since
-        * the caller hasn't initialized it yet. Once the pointer is published
-        * in the xarray and visible to other threads we can't reliably destroy
-        * it anymore, so the caller must complete all errorable operations
-        * before calling iommufd_object_finalize().
-        */
-       rc = xa_alloc(&ictx->objects, &obj->id, XA_ZERO_ENTRY,
-                     xa_limit_31b, GFP_KERNEL_ACCOUNT);
-       if (rc)
-               goto out_free;
-       return obj;
-out_free:
-       kfree(obj);
-       return ERR_PTR(rc);
-}
-
 /*
  * Allow concurrent access to the object.
  *
index 22948dd..94522d4 100644 (file)
@@ -135,4 +135,17 @@ static inline int iommufd_vfio_compat_set_no_iommu(struct iommufd_ctx *ictx)
        return -EOPNOTSUPP;
 }
 #endif /* CONFIG_IOMMUFD */
+
+#if IS_ENABLED(CONFIG_IOMMUFD_DRIVER_CORE)
+struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
+                                            size_t size,
+                                            enum iommufd_object_type type);
+#else /* !CONFIG_IOMMUFD_DRIVER_CORE */
+static inline struct iommufd_object *
+_iommufd_object_alloc(struct iommufd_ctx *ictx, size_t size,
+                     enum iommufd_object_type type)
+{
+       return ERR_PTR(-EOPNOTSUPP);
+}
+#endif /* CONFIG_IOMMUFD_DRIVER_CORE */
 #endif