[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Claim mode and HVM PoD interact badly
On Mon, Jan 27, 2014 at 02:54:40PM +0000, George Dunlap wrote: [...] > > ---8<--- > > diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c > > index 77bd365..472f1df 100644 > > --- a/tools/libxc/xc_hvm_build_x86.c > > +++ b/tools/libxc/xc_hvm_build_x86.c > > @@ -49,6 +49,8 @@ > > #define NR_SPECIAL_PAGES 8 > > #define special_pfn(x) (0xff000u - NR_SPECIAL_PAGES + (x)) > > > > +#define POD_VGA_HOLE_SIZE (0x20) > > + > > static int modules_init(struct xc_hvm_build_args *args, > > uint64_t vend, struct elf_binary *elf, > > uint64_t *mstart_out, uint64_t *mend_out) > > @@ -305,11 +307,13 @@ static int setup_guest(xc_interface *xch, > > if ( pod_mode ) > > { > > /* > > - * Subtract 0x20 from target_pages for the VGA "hole". Xen will > > - * adjust the PoD cache size so that domain tot_pages will be > > - * target_pages - 0x20 after this call. > > + * Subtract POD_VGA_HOLE_SIZE from target_pages for the VGA > > + * "hole". Xen will adjust the PoD cache size so that domain > > + * tot_pages will be target_pages - POD_VGA_HOLE_SIZE after > > + * this call. > > */ > > - rc = xc_domain_set_pod_target(xch, dom, target_pages - 0x20, > > + rc = xc_domain_set_pod_target(xch, dom, > > + target_pages - POD_VGA_HOLE_SIZE, > > NULL, NULL, NULL); > > if ( rc != 0 ) > > { > > @@ -335,7 +339,12 @@ static int setup_guest(xc_interface *xch, > > > > /* try to claim pages for early warning of insufficient memory > > available */ > > if ( claim_enabled ) { > > - rc = xc_domain_claim_pages(xch, dom, nr_pages - cur_pages); > > + unsigned long nr = target_pages; > > + > > + if ( pod_mode ) > > + nr -= POD_VGA_HOLE_SIZE; > > + > > + rc = xc_domain_claim_pages(xch, dom, nr); > > Two things: > > 1. This is broken because it doesn't claim pages for the PoD "cache". > The PoD "cache" amounts to *all the pages that the domain will have > allocated* -- there will be basically no pages allocated after this > point. > > Claim mode is trying to make creation of large guests fail early or be > guaranteed to succeed. For large guests, it's set_pod_target() that > may take the long time, and it's there that things will fail if > there's not enough memory. By the time you get to actually setting up > the p2m, you've already made it. > > 2. I think the VGA_HOLE doesn't have anything to do with PoD. > > Actually, it looks like the original code was wrong: correct me if I'm > wrong, but xc_domain_claim_pages() wants the *total number of pages*, > whereas nr_pages-cur_pages would give you the *number of additional > pages*. > > I think you need to claim nr_pages-VGA_HOLE_SIZE regardless of whether > you're in PoD mode or not. The initial code would claim 0xa0 pages > too few; the new code will claim 0x20 pages too many in the non-PoD > case. > > > diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c > > index 5f484a2..1e44ba3 100644 > > --- a/xen/common/page_alloc.c > > +++ b/xen/common/page_alloc.c > > @@ -339,8 +339,8 @@ int domain_set_outstanding_pages(struct domain *d, > > unsigned long pages) > > goto out; > > } > > > > - /* disallow a claim not exceeding current tot_pages or above max_pages > > */ > > - if ( (pages <= d->tot_pages) || (pages > d->max_pages) ) > > + /* disallow a claim below current tot_pages or above max_pages */ > > + if ( (pages < d->tot_pages) || (pages > d->max_pages) ) > > { > > This seems like a good interface change in any case -- there's no > particular reason not to allow multiple calls with the same claim > amount. (Interface-wise, I don't see a good reason we couldn't allow > the claim to be reduced as well; but that's probably more than we want > to do at this point.) > > So it seems like we should at least make the two fixes above: > * Use nr_pages-VGA_HOLE_SIZE for the claim, regardless of whether PoD is > enabled You mean target_pages here, right? nr_pages is maxmem= while target_pages is memory=. And from the face-to-face discussion we had this morning I had the impression you meant target_pages. In fact using nr_pages won't work because at that point d->max_pages is capped to target_memory in the hypervisor. > * Allow a claim equal to tot_pages > > That will allow PoD guests to boot with claim mode enabled, although > it will effectively be a noop. > > The next question is whether we should try to make claim mode actually > do the claim properly for PoD mode for 4.4. It seems like just moving > the claim call up before the xc_domain_set_target() call should work; > I'm inclined to say that if that works, we should just do it. > Agreed. Wei. > Thoughts? > > -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |