iommu/vt-d: Duplicate iommu_resv_region objects per device list
authorEric Auger <eric.auger@redhat.com>
Mon, 3 Jun 2019 06:53:31 +0000 (08:53 +0200)
committerJoerg Roedel <jroedel@suse.de>
Wed, 12 Jun 2019 08:32:59 +0000 (10:32 +0200)
commit5f64ce5411b467f1cfea6c63e2494c22b773582b
tree9837f8989e06c2f76cf720346842341c5e80b3da
parentad0834dedaa15c3a176f783c0373f836e44b4700
iommu/vt-d: Duplicate iommu_resv_region objects per device list

intel_iommu_get_resv_regions() aims to return the list of
reserved regions accessible by a given @device. However several
devices can access the same reserved memory region and when
building the list it is not safe to use a single iommu_resv_region
object, whose container is the RMRR. This iommu_resv_region must
be duplicated per device reserved region list.

Let's remove the struct iommu_resv_region from the RMRR unit
and allocate the iommu_resv_region directly in
intel_iommu_get_resv_regions(). We hold the dmar_global_lock instead
of the rcu-lock to allow sleeping.

Fixes: 0659b8dc45a6 ("iommu/vt-d: Implement reserved region get/put callbacks")
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel-iommu.c