[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 1/6] x86/PVH: improve Dom0 memory size calculation
On 22.10.2021 11:55, Roger Pau Monné wrote: > On Wed, Sep 29, 2021 at 03:13:24PM +0200, 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). >> >> To not further complicate the logic, eliminate the up-to-2-iteration >> loop in favor of doing a few calculations twice (before and after >> calling dom0_paging_pages()). While this will lead to slightly too high >> a value in "cpu_pages", it is deemed better to account a few too many >> than a few too little. >> >> Also uniformly use paging_mode_enabled(), not is_hvm_domain(). >> >> 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> >> --- >> I wonder whether this isn't enough to drop the "PVH dom0 without >> dom0_mem" warning. >> >> --- a/xen/arch/x86/dom0_build.c >> +++ b/xen/arch/x86/dom0_build.c >> @@ -318,8 +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; >> - bool need_paging; >> + unsigned long avail = 0, nr_pages, min_pages, max_pages, iommu_pages = >> 0; >> >> /* The ordering of operands is to work around a clang5 issue. */ >> if ( CONFIG_DOM0_MEM[0] && !dom0_mem_set ) >> @@ -337,53 +336,65 @@ 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; >> + } >> + >> + nr_pages = get_memsize(&dom0_size, avail); >> + >> + /* >> + * If allocation isn't specified, reserve 1/16th of available memory for >> + * things like DMA buffers. This reservation is clamped to a maximum of >> + * 128MB. >> + */ >> + if ( !nr_pages ) >> + { >> + nr_pages = avail - (pv_shim ? pv_shim_mem(avail) >> + : min(avail / 16, 128UL << (20 - PAGE_SHIFT))); >> + if ( paging_mode_enabled(d) ) >> + /* >> + * Temporary workaround message until internal (paging) memory >> + * accounting required to build a pvh dom0 is improved. >> + */ >> + printk("WARNING: PVH dom0 without dom0_mem set is still >> unstable. " >> + "If you get crashes during boot, try adding a dom0_mem >> parameter\n"); >> } >> >> - need_paging = is_hvm_domain(d) && >> - (!iommu_use_hap_pt(d) || !paging_mode_hap(d)); >> - for ( ; ; need_paging = false ) >> + if ( paging_mode_enabled(d) || opt_dom0_shadow ) > > Do we also need to account for opt_pv_l1tf_hwdom in case dom0 gets > shadowing enabled during runtime? Yes, we do, and I've added that to the check for v5 already. > The rest LGTM, so: > > Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Thanks, but as said in a reply to this just yesterday, this is buggy, and a v5 is going to be needed anyway. > I'm also fine if you want to remove the warning message at this time. Okay, will do. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |