|
[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 29.09.2021 15:13, Jan Beulich wrote:
> @@ -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 )
> {
> - nr_pages = get_memsize(&dom0_size, avail);
> - min_pages = get_memsize(&dom0_min_size, avail);
> - max_pages = get_memsize(&dom0_max_size, avail);
> + unsigned long cpu_pages;
>
> /*
> - * 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.
> + * Clamp according to min/max limits and available memory
> + * (preliminary).
> */
> - if ( !nr_pages )
> - {
> - nr_pages = avail - (pv_shim ? pv_shim_mem(avail)
> - : min(avail / 16, 128UL << (20 -
> PAGE_SHIFT)));
Just FYI that I've noticed only now that moving this only up is
not enough; the same also ...
> - if ( is_hvm_domain(d) && !need_paging )
> - /*
> - * 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");
> - }
> -
> -
> - /* Clamp according to min/max limits and available memory. */
> - nr_pages = max(nr_pages, min_pages);
> - nr_pages = min(nr_pages, max_pages);
> + nr_pages = max(nr_pages, get_memsize(&dom0_min_size, avail));
> + nr_pages = min(nr_pages, get_memsize(&dom0_max_size, avail));
> nr_pages = min(nr_pages, avail);
>
> - if ( !need_paging )
> - break;
> + cpu_pages = dom0_paging_pages(d, nr_pages);
>
> - /* Reserve memory for shadow or HAP. */
> - avail -= dom0_paging_pages(d, nr_pages);
> + if ( !iommu_use_hap_pt(d) )
> + avail -= cpu_pages;
> + else if ( cpu_pages > iommu_pages )
> + avail -= cpu_pages - iommu_pages;
> }
>
> + nr_pages = get_memsize(&dom0_size, avail);
... is needed here, or else things won't work e.g. without any "dom0_mem=".
I'll introduce a helper function ...
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |