[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/Dom0: account for shadow/HAP allocation
On 25/02/15 14:45, Jan Beulich wrote: > ... when calculating how many pages to allocate fopr Dom0. This is "fopr" => "for" ? > basically equivalent to the already present IOMMU related adjustment. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/domain_build.c > +++ b/xen/arch/x86/domain_build.c > @@ -132,6 +132,8 @@ struct vcpu *__init alloc_dom0_vcpu0(str > #ifdef CONFIG_SHADOW_PAGING > static bool_t __initdata opt_dom0_shadow; > boolean_param("dom0_shadow", opt_dom0_shadow); > +#else > +#define opt_dom0_shadow 0 > #endif > > static char __initdata opt_dom0_ioports_disable[200] = ""; > @@ -203,13 +205,23 @@ static struct page_info * __init alloc_c > return page; > } > > +static unsigned long __init dom0_paging_pages(const struct domain *d, > + unsigned long nr_pages) > +{ > + /* Copied from: libxl_get_required_shadow_memory() */ > + unsigned long memkb = nr_pages * (PAGE_SIZE / 1024); > + > + memkb = 4 * (256 * d->max_vcpus + 2 * (memkb / 1024)); I have recently raised a bug against Xapi for similar wrong logic when calculating the size of the shadow pool. A per-vcpu reservation of shadow allocation is only needed if shadow paging is actually in use, and even then should match shadow_min_acceptable_pages() at 128 pages per vcpu. If HAP is in use, the only allocations from the shadow pool are for the EPT/NPT tables (1% of nr_pages), IOMMU tables (another 1% of nr_pages if in use), and the logdirty radix tree (substantially less than than 1% of nr_pages). One could argue that structure such as the vmcs/vmcb should have their allocations accounted against the domain, in which case a small per-vcpu component would be appropriate. However as it currently stands, this calculation wastes 4MB of ram per vcpu in shadow allocation which is not going to be used. ~Andrew > + > + return ((memkb + 1023) / 1024) << (20 - PAGE_SHIFT); > +} > + > static unsigned long __init compute_dom0_nr_pages( > struct domain *d, struct elf_dom_parms *parms, unsigned long initrd_len) > { > unsigned long avail = avail_domheap_pages() + initial_images_nrpages(); > - unsigned long nr_pages = dom0_nrpages; > - unsigned long min_pages = dom0_min_nrpages; > - unsigned long max_pages = dom0_max_nrpages; > + unsigned long nr_pages, min_pages, max_pages; > + bool_t need_paging; > > /* Reserve memory for further dom0 vcpu-struct allocations... */ > avail -= (d->max_vcpus - 1UL) > @@ -227,23 +239,37 @@ static unsigned long __init compute_dom0 > avail -= max_pdx >> s; > } > > - /* > - * If domain 0 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 == 0 ) > - nr_pages = -min(avail / 16, 128UL << (20 - PAGE_SHIFT)); > + need_paging = opt_dom0_shadow || (is_pvh_domain(d) && > !iommu_hap_pt_share); > + for ( ; ; need_paging = 0 ) > + { > + nr_pages = dom0_nrpages; > + min_pages = dom0_min_nrpages; > + max_pages = dom0_max_nrpages; > + > + /* > + * 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 == 0 ) > + nr_pages = -min(avail / 16, 128UL << (20 - PAGE_SHIFT)); > > - /* Negative memory specification means "all memory - specified amount". > */ > - if ( (long)nr_pages < 0 ) nr_pages += avail; > - if ( (long)min_pages < 0 ) min_pages += avail; > - if ( (long)max_pages < 0 ) max_pages += avail; > - > - /* Clamp dom0 memory according to min/max limits and available memory. */ > - nr_pages = max(nr_pages, min_pages); > - nr_pages = min(nr_pages, max_pages); > - nr_pages = min(nr_pages, avail); > + /* Negative specification means "all memory - specified amount". */ > + if ( (long)nr_pages < 0 ) nr_pages += avail; > + if ( (long)min_pages < 0 ) min_pages += avail; > + if ( (long)max_pages < 0 ) max_pages += avail; > + > + /* 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 = min(nr_pages, avail); > + > + if ( !need_paging ) > + break; > + > + /* Reserve memory for shadow or HAP. */ > + avail -= dom0_paging_pages(d, nr_pages); > + } > > if ( (parms->p2m_base == UNSET_ADDR) && (dom0_nrpages <= 0) && > ((dom0_min_nrpages <= 0) || (nr_pages > min_pages)) ) > @@ -1287,14 +1313,7 @@ int __init construct_dom0( > } > > if ( is_pvh_domain(d) ) > - { > - unsigned long hap_pages, memkb = nr_pages * (PAGE_SIZE / 1024); > - > - /* Copied from: libxl_get_required_shadow_memory() */ > - memkb = 4 * (256 * d->max_vcpus + 2 * (memkb / 1024)); > - hap_pages = ( (memkb + 1023) / 1024) << (20 - PAGE_SHIFT); > - hap_set_alloc_for_pvh_dom0(d, hap_pages); > - } > + hap_set_alloc_for_pvh_dom0(d, dom0_paging_pages(d, nr_pages)); > > /* > * We enable paging mode again so guest_physmap_add_page will do the > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |