[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 3/6] x86/PVH: improve Dom0 memory size calculation
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). 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; 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 |