File xsa400-07.patch of Package xen.31431
VT-d: prepare for per-device quarantine page tables (part II)
Replace the passing of struct domain * by domid_t in preparation of
per-device quarantine page tables also requiring per-device pseudo
domain IDs, which aren't going to be associated with any struct domain
instances.
No functional change intended (except for slightly adjusted log message
text).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul@xen.org>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -52,8 +52,8 @@ static struct tasklet vtd_fault_tasklet;
static int setup_hwdom_device(u8 devfn, struct pci_dev *);
static void setup_hwdom_rmrr(struct domain *d);
-static int domain_iommu_domid(struct domain *d,
- struct iommu *iommu)
+static int get_iommu_did(domid_t domid, const struct iommu *iommu,
+ bool warn)
{
unsigned long nr_dom, i;
@@ -61,16 +61,16 @@ static int domain_iommu_domid(struct dom
i = find_first_bit(iommu->domid_bitmap, nr_dom);
while ( i < nr_dom )
{
- if ( iommu->domid_map[i] == d->domain_id )
+ if ( iommu->domid_map[i] == domid )
return i;
i = find_next_bit(iommu->domid_bitmap, nr_dom, i+1);
}
- if ( !d->is_dying )
+ if ( warn )
dprintk(XENLOG_ERR VTDPREFIX,
- "Cannot get valid iommu %u domid: %pd\n",
- iommu->index, d);
+ "No valid iommu %u domid for Dom%d\n",
+ iommu->index, domid);
return -1;
}
@@ -78,8 +78,7 @@ static int domain_iommu_domid(struct dom
#define DID_FIELD_WIDTH 16
#define DID_HIGH_OFFSET 8
static int context_set_domain_id(struct context_entry *context,
- struct domain *d,
- struct iommu *iommu)
+ domid_t domid, struct iommu *iommu)
{
unsigned long nr_dom, i;
int found = 0;
@@ -90,7 +89,7 @@ static int context_set_domain_id(struct
i = find_first_bit(iommu->domid_bitmap, nr_dom);
while ( i < nr_dom )
{
- if ( iommu->domid_map[i] == d->domain_id )
+ if ( iommu->domid_map[i] == domid )
{
found = 1;
break;
@@ -106,7 +105,7 @@ static int context_set_domain_id(struct
dprintk(XENLOG_ERR VTDPREFIX, "IOMMU: no free domain ids\n");
return -EFAULT;
}
- iommu->domid_map[i] = d->domain_id;
+ iommu->domid_map[i] = domid;
}
set_bit(i, iommu->domid_bitmap);
@@ -133,9 +132,9 @@ static void __init free_intel_iommu(stru
xfree(intel);
}
-static void cleanup_domid_map(struct domain *domain, struct iommu *iommu)
+static void cleanup_domid_map(domid_t domid, struct iommu *iommu)
{
- int iommu_domid = domain_iommu_domid(domain, iommu);
+ int iommu_domid = get_iommu_did(domid, iommu, false);
if ( iommu_domid >= 0 )
{
@@ -191,7 +190,7 @@ static void check_cleanup_domid_map(stru
if ( !found )
{
clear_bit(iommu->index, &dom_iommu(d)->arch.iommu_bitmap);
- cleanup_domid_map(d, iommu);
+ cleanup_domid_map(d->domain_id, iommu);
}
}
@@ -673,7 +672,7 @@ static int __must_check iommu_flush_iotl
continue;
flush_dev_iotlb = !!find_ats_dev_drhd(iommu);
- iommu_domid= domain_iommu_domid(d, iommu);
+ iommu_domid = get_iommu_did(d->domain_id, iommu, !d->is_dying);
if ( iommu_domid == -1 )
continue;
@@ -1505,7 +1504,7 @@ int domain_context_mapping_one(
spin_unlock(&hd->arch.mapping_lock);
}
- rc = context_set_domain_id(&lctxt, domain, iommu);
+ rc = context_set_domain_id(&lctxt, domid, iommu);
if ( rc )
{
unlock:
@@ -1815,7 +1814,7 @@ int domain_context_unmap_one(
context_clear_entry(*context);
iommu_sync_cache(context, sizeof(struct context_entry));
- iommu_domid= domain_iommu_domid(domain, iommu);
+ iommu_domid = get_iommu_did(domid, iommu, !domain->is_dying);
if ( iommu_domid == -1 )
{
spin_unlock(&iommu->lock);
@@ -1995,7 +1994,7 @@ static void iommu_domain_teardown(struct
spin_unlock(&hd->arch.mapping_lock);
for_each_drhd_unit ( drhd )
- cleanup_domid_map(d, drhd->iommu);
+ cleanup_domid_map(d->domain_id, drhd->iommu);
}
static int __must_check intel_iommu_map_page(struct domain *d, dfn_t dfn,