]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
iommu: Consolitate ->add/remove_device() calls
authorJoerg Roedel <jroedel@suse.de>
Fri, 30 Nov 2018 09:31:59 +0000 (10:31 +0100)
committerJoerg Roedel <jroedel@suse.de>
Mon, 17 Dec 2018 11:47:50 +0000 (12:47 +0100)
Put them into separate functions and call those where the
plain ops have been called before.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c
include/linux/iommu.h

index 304c067a0f85217f69376a55d5654898be5f5058..a2131751dcff54c630a17b7de3be661e12829367 100644 (file)
@@ -111,6 +111,23 @@ void iommu_device_unregister(struct iommu_device *iommu)
        spin_unlock(&iommu_device_lock);
 }
 
+int iommu_probe_device(struct device *dev)
+{
+       const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+       WARN_ON(dev->iommu_group);
+
+       return ops->add_device(dev);
+}
+
+void iommu_release_device(struct device *dev)
+{
+       const struct iommu_ops *ops = dev->bus->iommu_ops;
+
+       if (dev->iommu_group)
+               ops->remove_device(dev);
+}
+
 static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
                                                 unsigned type);
 static int __iommu_attach_device(struct iommu_domain *domain,
@@ -1118,16 +1135,7 @@ struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)
 
 static int add_iommu_group(struct device *dev, void *data)
 {
-       struct iommu_callback_data *cb = data;
-       const struct iommu_ops *ops = cb->ops;
-       int ret;
-
-       if (!ops->add_device)
-               return 0;
-
-       WARN_ON(dev->iommu_group);
-
-       ret = ops->add_device(dev);
+       int ret = iommu_probe_device(dev);
 
        /*
         * We ignore -ENODEV errors for now, as they just mean that the
@@ -1142,11 +1150,7 @@ static int add_iommu_group(struct device *dev, void *data)
 
 static int remove_iommu_group(struct device *dev, void *data)
 {
-       struct iommu_callback_data *cb = data;
-       const struct iommu_ops *ops = cb->ops;
-
-       if (ops->remove_device && dev->iommu_group)
-               ops->remove_device(dev);
+       iommu_release_device(dev);
 
        return 0;
 }
@@ -1154,27 +1158,22 @@ static int remove_iommu_group(struct device *dev, void *data)
 static int iommu_bus_notifier(struct notifier_block *nb,
                              unsigned long action, void *data)
 {
+       unsigned long group_action = 0;
        struct device *dev = data;
-       const struct iommu_ops *ops = dev->bus->iommu_ops;
        struct iommu_group *group;
-       unsigned long group_action = 0;
 
        /*
         * ADD/DEL call into iommu driver ops if provided, which may
         * result in ADD/DEL notifiers to group->notifier
         */
        if (action == BUS_NOTIFY_ADD_DEVICE) {
-               if (ops->add_device) {
-                       int ret;
+               int ret;
 
-                       ret = ops->add_device(dev);
-                       return (ret) ? NOTIFY_DONE : NOTIFY_OK;
-               }
+               ret = iommu_probe_device(dev);
+               return (ret) ? NOTIFY_DONE : NOTIFY_OK;
        } else if (action == BUS_NOTIFY_REMOVED_DEVICE) {
-               if (ops->remove_device && dev->iommu_group) {
-                       ops->remove_device(dev);
-                       return 0;
-               }
+               iommu_release_device(dev);
+               return NOTIFY_OK;
        }
 
        /*
index 26225f762cd7b34a1e9c93556e7fcb0c6c01c967..e90da6b6f3d1b91d431d4f194e70c3cf872b3493 100644 (file)
@@ -409,6 +409,9 @@ static inline void dev_iommu_fwspec_set(struct device *dev,
        dev->iommu_fwspec = fwspec;
 }
 
+int iommu_probe_device(struct device *dev);
+void iommu_release_device(struct device *dev);
+
 #else /* CONFIG_IOMMU_API */
 
 struct iommu_ops {};