• Jason Gunthorpe's avatar
    vfio: Delete vfio_get/put_group from vfio_iommu_group_notifier() · 63b150fd
    Jason Gunthorpe authored
    iommu_group_register_notifier()/iommu_group_unregister_notifier() are
    built using a blocking_notifier_chain which integrates a rwsem. The
    notifier function cannot be running outside its registration.
    
    When considering how the notifier function interacts with create/destroy
    of the group there are two fringe cases, the notifier starts before
    list_add(&vfio.group_list) and the notifier runs after the kref
    becomes 0.
    
    Prior to vfio_create_group() unlocking and returning we have
       container_users == 0
       device_list == empty
    And this cannot change until the mutex is unlocked.
    
    After the kref goes to zero we must also have
       container_users == 0
       device_list == empty
    
    Both are required because they are balanced operations and a 0 kref means
    some caller became unbalanced. Add the missing assertion that
    container_users must be zero as well.
    
    These two facts are important because when checking each operation we see:
    
    - IOMMU_GROUP_NOTIFY_ADD_DEVICE
       Empty device_list avoids the WARN_ON in vfio_group_nb_add_dev()
       0 container_users ends the call
    - IOMMU_GROUP_NOTIFY_BOUND_DRIVER
       0 container_users ends the call
    
    Finally, we have IOMMU_GROUP_NOTIFY_UNBOUND_DRIVER, which only deletes
    items from the unbound list. During creation this list is empty, during
    kref == 0 nothing can read this list, and it will be freed soon.
    
    Since the vfio_group_release() doesn't hold the appropriate lock to
    manipulate the unbound_list and could race with the notifier, move the
    cleanup to directly before the kfree.
    
    This allows deleting all of the deferred group put code.
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Reviewed-by: default avatarLiu Yi L <yi.l.liu@intel.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/1-v3-2fdfe4ca2cc6+18c-vfio_group_cdev_jgg@nvidia.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    63b150fd
vfio.c 59.9 KB