• Jason Gunthorpe's avatar
    iommu: Add iommu_init/deinit_device() paired functions · aa095857
    Jason Gunthorpe authored
    Move the driver init and destruction code into two logically paired
    functions.
    
    There is a subtle ordering dependency in how the group's domains are
    freed, the current code does the kobject_put() on the group which will
    hopefully trigger the free of the domains before the module_put() that
    protects the domain->ops.
    
    Reorganize this to be explicit and documented. The domains are cleaned up
    by iommu_deinit_device() if it is the last device to be deinit'd from the
    group.  This must be done in a specific order - after
    ops->release_device() and before the module_put(). Make it very clear and
    obvious by putting the order directly in one function.
    
    Leave WARN_ON's in case the refcounting gets messed up somehow.
    
    This also moves the module_put() and dev_iommu_free() under the
    group->mutex to keep the code simple.
    
    Building paired functions like this helps ensure that error cleanup flows
    in __iommu_probe_device() are correct because they share the same code
    that handles the normal flow. These details become relavent as following
    patches add more error unwind into __iommu_probe_device(), and ultimately
    a following series adds fine-grained locking to __iommu_probe_device().
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/5-v3-328044aa278c+45e49-iommu_probe_jgg@nvidia.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    aa095857
iommu.c 86.2 KB