]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommufd: Move _iommufd_object_alloc out of driver.c
authorNicolin Chen <nicolinc@nvidia.com>
Sat, 14 Jun 2025 06:35:24 +0000 (23:35 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 19 Jun 2025 18:43:29 +0000 (15:43 -0300)
Now, all driver structures will be allocated by the core, i.e. no longer a
need of driver calling _iommufd_object_alloc. Thus, move it back.

Before:
   text    data     bss     dec     hex filename
   3024     180       0    3204     c84 drivers/iommu/iommufd/driver.o
   9074     610      64    9748    2614 drivers/iommu/iommufd/main.o
After:
   text    data     bss     dec     hex filename
   2665     164       0    2829     b0d drivers/iommu/iommufd/driver.o
   9410     618      64   10092    276c drivers/iommu/iommufd/main.o

Link: https://patch.msgid.link/r/79e630c7b911930cf36e3c8a775a04e66c528d65.1749882255.git.nicolinc@nvidia.com
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/driver.c
drivers/iommu/iommufd/iommufd_private.h
drivers/iommu/iommufd/main.c
include/linux/iommufd.h

index 922cd1fe7ec20be5c601879a7363f27e804e0b3d..2fee399a148ef66dbd0c65e448d17b00aa6f3e7e 100644 (file)
@@ -3,39 +3,6 @@
  */
 #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");
-
 /* Caller should xa_lock(&viommu->vdevs) to protect the return value */
 struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
                                       unsigned long vdev_id)
index 32f0631368e1a425f0fb168c85e44c9c36aa6670..ec5b499d139cd87839cefa93bf435bfc0d106665 100644 (file)
@@ -230,6 +230,10 @@ 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 347c56ef44d835f6c5af30e2e391509e7d0d86f1..85ad2853da0b737c3927cda7a0fe977065de668f 100644 (file)
@@ -29,6 +29,38 @@ 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 bf41b242b9f688f0398c4af25fc4cb89cd902d58..2d1bf2f97ee311be051de9025a3b4fafabecba8f 100644 (file)
@@ -190,9 +190,6 @@ static inline int iommufd_vfio_compat_set_no_iommu(struct iommufd_ctx *ictx)
 #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);
 struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
                                       unsigned long vdev_id);
 int iommufd_viommu_get_vdev_id(struct iommufd_viommu *viommu,
@@ -201,13 +198,6 @@ int iommufd_viommu_report_event(struct iommufd_viommu *viommu,
                                enum iommu_veventq_type type, void *event_data,
                                size_t data_len);
 #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);
-}
-
 static inline struct device *
 iommufd_viommu_find_dev(struct iommufd_viommu *viommu, unsigned long vdev_id)
 {