iommu: Add is_attach_deferred call-back to iommu-ops
authorBaoquan He <bhe@redhat.com>
Wed, 9 Aug 2017 08:33:40 +0000 (16:33 +0800)
committerJoerg Roedel <jroedel@suse.de>
Tue, 15 Aug 2017 16:14:39 +0000 (18:14 +0200)
This new call-back will be used to check if the domain attach need be
deferred for now. If yes, the domain attach/detach will return directly.

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

index 3f6ea160afed3bdf0e06a220b89e53c04b7ba84f..86581b115b92546cd4dbdc3bf036fc8a153846e4 100644 (file)
@@ -1283,6 +1283,10 @@ static int __iommu_attach_device(struct iommu_domain *domain,
                                 struct device *dev)
 {
        int ret;
+       if ((domain->ops->is_attach_deferred != NULL) &&
+           domain->ops->is_attach_deferred(domain, dev))
+               return 0;
+
        if (unlikely(domain->ops->attach_dev == NULL))
                return -ENODEV;
 
@@ -1324,6 +1328,10 @@ EXPORT_SYMBOL_GPL(iommu_attach_device);
 static void __iommu_detach_device(struct iommu_domain *domain,
                                  struct device *dev)
 {
+       if ((domain->ops->is_attach_deferred != NULL) &&
+           domain->ops->is_attach_deferred(domain, dev))
+               return;
+
        if (unlikely(domain->ops->detach_dev == NULL))
                return;
 
index 2cb54adc4a334aa3f3a1732c35eaf9749d64b9e8..63983c9e6c3af7b542a4dd3dda3377cbad7d6b0b 100644 (file)
@@ -225,6 +225,7 @@ struct iommu_ops {
        u32 (*domain_get_windows)(struct iommu_domain *domain);
 
        int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
+       bool (*is_attach_deferred)(struct iommu_domain *domain, struct device *dev);
 
        unsigned long pgsize_bitmap;
 };