drivers/iommu: Initialise module 'owner' field in iommu_device_set_ops()
authorWill Deacon <will@kernel.org>
Thu, 9 Jan 2020 14:08:41 +0000 (14:08 +0000)
committerWill Deacon <will@kernel.org>
Fri, 10 Jan 2020 09:49:13 +0000 (09:49 +0000)
Requiring each IOMMU driver to initialise the 'owner' field of their
'struct iommu_ops' is error-prone and easily forgotten. Follow the
example set by PCI and USB by assigning THIS_MODULE automatically when
registering the ops structure with IOMMU core.

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm-smmu-v3.c
drivers/iommu/arm-smmu.c
include/linux/iommu.h

index 03dc978..e82997a 100644 (file)
@@ -2733,7 +2733,6 @@ static struct iommu_ops arm_smmu_ops = {
        .get_resv_regions       = arm_smmu_get_resv_regions,
        .put_resv_regions       = arm_smmu_put_resv_regions,
        .pgsize_bitmap          = -1UL, /* Restricted during device attach */
-       .owner                  = THIS_MODULE,
 };
 
 /* Probing and initialisation functions */
index 5ef1f2e..93d3324 100644 (file)
@@ -1623,7 +1623,6 @@ static struct iommu_ops arm_smmu_ops = {
        .get_resv_regions       = arm_smmu_get_resv_regions,
        .put_resv_regions       = arm_smmu_put_resv_regions,
        .pgsize_bitmap          = -1UL, /* Restricted during device attach */
-       .owner                  = THIS_MODULE,
 };
 
 static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
index e9f94d3..90007c9 100644 (file)
@@ -388,12 +388,19 @@ void iommu_device_sysfs_remove(struct iommu_device *iommu);
 int  iommu_device_link(struct iommu_device   *iommu, struct device *link);
 void iommu_device_unlink(struct iommu_device *iommu, struct device *link);
 
-static inline void iommu_device_set_ops(struct iommu_device *iommu,
-                                       const struct iommu_ops *ops)
+static inline void __iommu_device_set_ops(struct iommu_device *iommu,
+                                         const struct iommu_ops *ops)
 {
        iommu->ops = ops;
 }
 
+#define iommu_device_set_ops(iommu, ops)                               \
+do {                                                                   \
+       struct iommu_ops *__ops = (struct iommu_ops *)(ops);            \
+       __ops->owner = THIS_MODULE;                                     \
+       __iommu_device_set_ops(iommu, __ops);                           \
+} while (0)
+
 static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
                                           struct fwnode_handle *fwnode)
 {