[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v3 03/23] VT-d: limit page table population in domain_pgd_maddr()
> From: Jan Beulich <jbeulich@xxxxxxxx> > Sent: Tuesday, January 11, 2022 12:23 AM > > I have to admit that I never understood why domain_pgd_maddr() wants to > populate all page table levels for DFN 0. I can only assume that despite > the comment there what is needed is population just down to the smallest > possible nr_pt_levels that the loop later in the function may need to > run to. Hence what is needed is the minimum of all possible > iommu->nr_pt_levels, to then be passed into addr_to_dma_page_maddr() > instead of literal 1. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > --- > v3: New. > > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -55,6 +55,7 @@ bool __read_mostly iommu_snoop = true; > #endif > > static unsigned int __read_mostly nr_iommus; > +static unsigned int __read_mostly min_pt_levels = UINT_MAX; > > static struct iommu_ops vtd_ops; > static struct tasklet vtd_fault_tasklet; > @@ -482,8 +483,11 @@ static uint64_t domain_pgd_maddr(struct > { > if ( !hd->arch.vtd.pgd_maddr ) > { > - /* Ensure we have pagetables allocated down to leaf PTE. */ > - addr_to_dma_page_maddr(d, 0, 1, NULL, true); > + /* > + * Ensure we have pagetables allocated down to the smallest > + * level the loop below may need to run to. > + */ > + addr_to_dma_page_maddr(d, 0, min_pt_levels, NULL, true); > > if ( !hd->arch.vtd.pgd_maddr ) > return 0; > @@ -1381,6 +1385,8 @@ int __init iommu_alloc(struct acpi_drhd_ > return -ENODEV; > } > iommu->nr_pt_levels = agaw_to_level(agaw); > + if ( min_pt_levels > iommu->nr_pt_levels ) > + min_pt_levels = iommu->nr_pt_levels; > > if ( !ecap_coherent(iommu->ecap) ) > vtd_ops.sync_cache = sync_cache;
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |