[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/4] x86/PVH: improve Dom0 memory size calculation
On 30/08/2021 14:03, Jan Beulich wrote: > Assuming that the accounting for IOMMU page tables will also take care > of the P2M needs was wrong: dom0_paging_pages() can determine a far > higher value, high enough for the system to run out of memory while > setting up Dom0. Hence in the case of shared page tables the larger of > the two values needs to be used (without shared page tables the sum of > both continues to be applicable). I'm afraid that I can't follow this at all. What causes the system to run out of RAM while constructing dom0? > > While there also account for two further aspects in the PV case: With > "iommu=dom0-passthrough" no IOMMU page tables would get allocated, so > none need accounting for. And if shadow mode is to be enabled, setting > aside a suitable amount for the P2M pool to get populated is also > necessary (i.e. similar to the non-shared-page-tables case of PVH). > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/dom0_build.c > +++ b/xen/arch/x86/dom0_build.c > @@ -318,7 +318,7 @@ unsigned long __init dom0_compute_nr_pag > struct domain *d, struct elf_dom_parms *parms, unsigned long initrd_len) > { > nodeid_t node; > - unsigned long avail = 0, nr_pages, min_pages, max_pages; > + unsigned long avail = 0, nr_pages, min_pages, max_pages, iommu_pages = 0; > bool need_paging; > > /* The ordering of operands is to work around a clang5 issue. */ > @@ -337,18 +337,23 @@ unsigned long __init dom0_compute_nr_pag > avail -= d->max_vcpus - 1; > > /* Reserve memory for iommu_dom0_init() (rough estimate). */ > - if ( is_iommu_enabled(d) ) > + if ( is_iommu_enabled(d) && !iommu_hwdom_passthrough ) > { > unsigned int s; > > for ( s = 9; s < BITS_PER_LONG; s += 9 ) > - avail -= max_pdx >> s; > + iommu_pages += max_pdx >> s; > + > + avail -= iommu_pages; > } > > - need_paging = is_hvm_domain(d) && > - (!iommu_use_hap_pt(d) || !paging_mode_hap(d)); > + need_paging = is_hvm_domain(d) > + ? !iommu_use_hap_pt(d) || !paging_mode_hap(d) > + : opt_dom0_shadow; As per patch 4, this condition needs adjusting. ~Andrew > for ( ; ; need_paging = false ) > { > + unsigned long paging_pages; > + > nr_pages = get_memsize(&dom0_size, avail); > min_pages = get_memsize(&dom0_min_size, avail); > max_pages = get_memsize(&dom0_max_size, avail); > @@ -377,11 +382,20 @@ unsigned long __init dom0_compute_nr_pag > nr_pages = min(nr_pages, max_pages); > nr_pages = min(nr_pages, avail); > > - if ( !need_paging ) > - break; > + paging_pages = paging_mode_enabled(d) || need_paging > + ? dom0_paging_pages(d, nr_pages) : 0; > > /* Reserve memory for shadow or HAP. */ > - avail -= dom0_paging_pages(d, nr_pages); > + if ( !need_paging ) > + { > + if ( paging_pages <= iommu_pages ) > + break; > + > + avail -= paging_pages - iommu_pages; > + } > + else > + avail -= paging_pages; > + iommu_pages = paging_pages; > } > > if ( is_pv_domain(d) && >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |