Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP5:Update
xen.23721
xsa400-07.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xsa400-07.patch of Package xen.23721
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_t 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: Dom%d\n", - iommu->index, d->domain_id); + "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, 0); 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); } } @@ -644,7 +643,7 @@ void iommu_flush_iotlb(struct domain *d, continue; flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0; - iommu_domid= domain_iommu_domid(d, iommu); + iommu_domid = get_iommu_did(d->domain_id, iommu, !d->is_dying); if ( iommu_domid == -1 ) continue; @@ -1450,7 +1449,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: @@ -1733,7 +1732,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); @@ -1866,7 +1865,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 intel_iommu_map_page(
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor