[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 4:14 PM, Wei Liu <wei.liu2@xxxxxxxxxx> wrote: > 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. Dur, yes of course. -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |