[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] VT-d: per-domain IOMMU bitmap needs to have dynamic size
commit c06e3d81031424a8a0f725198c16ad81007be89c Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Nov 12 13:56:51 2021 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Nov 12 13:56:51 2021 +0100 VT-d: per-domain IOMMU bitmap needs to have dynamic size With no upper bound (anymore) on the number of IOMMUs, a fixed-size 64-bit map may be insufficient (systems with 40 IOMMUs have already been observed). Fixes: 27713fa2aa21 ("VT-d: improve save/restore of registers across S3") Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> Release-Acked-by: Ian Jackson <iwj@xxxxxxxxxxxxxx> --- xen/drivers/passthrough/vtd/iommu.c | 15 +++++++++++---- xen/include/asm-x86/iommu.h | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 0e7e111286..7b8337017a 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -54,7 +54,7 @@ bool __read_mostly iommu_qinval = true; bool __read_mostly iommu_snoop = true; #endif -static unsigned int __initdata nr_iommus; +static unsigned int __read_mostly nr_iommus; static struct iommu_ops vtd_ops; static struct tasklet vtd_fault_tasklet; @@ -645,7 +645,7 @@ static int __must_check iommu_flush_iotlb(struct domain *d, dfn_t dfn, iommu = drhd->iommu; - if ( !test_bit(iommu->index, &hd->arch.vtd.iommu_bitmap) ) + if ( !test_bit(iommu->index, hd->arch.vtd.iommu_bitmap) ) continue; flush_dev_iotlb = !!find_ats_dev_drhd(iommu); @@ -1308,6 +1308,11 @@ static int intel_iommu_domain_init(struct domain *d) { struct domain_iommu *hd = dom_iommu(d); + hd->arch.vtd.iommu_bitmap = xzalloc_array(unsigned long, + BITS_TO_LONGS(nr_iommus)); + if ( !hd->arch.vtd.iommu_bitmap ) + return -ENOMEM; + hd->arch.vtd.agaw = width_to_agaw(DEFAULT_DOMAIN_ADDRESS_WIDTH); return 0; @@ -1457,7 +1462,7 @@ int domain_context_mapping_one( if ( rc > 0 ) rc = 0; - set_bit(iommu->index, &hd->arch.vtd.iommu_bitmap); + set_bit(iommu->index, hd->arch.vtd.iommu_bitmap); unmap_vtd_domain_page(context_entries); @@ -1789,7 +1794,7 @@ static int domain_context_unmap(struct domain *domain, u8 devfn, if ( !found ) { - clear_bit(iommu->index, &dom_iommu(domain)->arch.vtd.iommu_bitmap); + clear_bit(iommu->index, dom_iommu(domain)->arch.vtd.iommu_bitmap); cleanup_domid_map(domain, iommu); } @@ -1819,6 +1824,8 @@ static void iommu_domain_teardown(struct domain *d) for_each_drhd_unit ( drhd ) cleanup_domid_map(d, drhd->iommu); + + XFREE(hd->arch.vtd.iommu_bitmap); } static int __must_check intel_iommu_map_page(struct domain *d, dfn_t dfn, diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index 8aff75e4ff..de46149b40 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -58,7 +58,7 @@ struct arch_iommu struct { uint64_t pgd_maddr; /* io page directory machine address */ unsigned int agaw; /* adjusted guest address width, 0 is level 2 30-bit */ - uint64_t iommu_bitmap; /* bitmap of iommu(s) that the domain uses */ + unsigned long *iommu_bitmap; /* bitmap of iommu(s) that the domain uses */ } vtd; /* AMD IOMMU */ struct { -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |