[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxc: x86: ensure that the initial mapping fits into the guest's memory
>>> On 07.01.13 at 11:37, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote: > On Mon, 2013-01-07 at 10:35 +0000, Jan Beulich wrote: >> >>> On 07.01.13 at 08:00, Jan Beulich wrote: >> >>>> Ian Campbell <Ian.Campbell@xxxxxxxxxx> 01/04/13 5:53 PM >>> >> >>libxc: x86: ensure that the initial mapping fits into the guest's memory >> >> >> >>In particular we need to check that adding 512KB of slack and >> >>rounding up to a 4MB boundary do not overflow the guest's memory >> >>allocation. Otherwise we run off the end of the p2m when building the >> >>guest's initial page tables and populate them with garbage. >> > >> > Sadly our testing found this to cause SLE11 SP2 PV guests to not start >> > anymore (in its 4.1.x backported incarnation). I didn't get around yet to >> > check whether in the (apparently trivial) backport I overlooked something; >> > will do as soon as I get to the office. >> >> Switching the added panic invocation to >> >> xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, >> "%s: not enough memory for initial mapping > (%#"PRIx64" > %#"PRIpfn")", >> __FUNCTION__, try_virt_end >> PAGE_SHIFT_X86, >> dom->total_pages); >> >> I see (with xend on 4.1.3) >> >> xc: error: panic: xc_dom_x86.c:100: count_pgtables: not enough memory for > initial mapping (0xffffffff81bff > 0x80000): Out of memory >> >> Did this really work for you? > > It did but I must confess I only tested with the mini-os test domain, > since that was what the initial bug was reported about and I stupidly > didn't think to test with a "real" kernel. > >> The 4.1.3 xl doesn't really want to work >> for me, so I can't directly cross check whether there's a behavioral >> difference between the two, but looking at an older log the virtual >> addresses reported for virt_alloc_end look similar. Afaict you need >> to subtract dom->parms.virt_base from try_virt_end. > > I bet virt_base == 0 for the mini-os kernel I tried. I'll respin and > retest. This is what works for me (also added printing of the relevant value, and dropping the unchanged parts of the patch): --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -82,6 +82,7 @@ static int count_pgtables(struct xc_dom_ { int pages, extra_pages; xen_vaddr_t try_virt_end; + xen_pfn_t try_pfn_end; extra_pages = dom->alloc_bootstack ? 1 : 0; extra_pages += dom->extra_pages; @@ -91,6 +92,16 @@ static int count_pgtables(struct xc_dom_ { try_virt_end = round_up(dom->virt_alloc_end + pages * PAGE_SIZE_X86, bits_to_mask(22)); /* 4MB alignment */ + try_pfn_end = (try_virt_end - dom->parms.virt_base) >> PAGE_SHIFT_X86; + + if ( try_pfn_end > dom->total_pages ) + { + xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, + "%s: not enough memory for initial mapping (%#"PRIpfn" > %#"PRIpfn")", + __FUNCTION__, try_pfn_end, dom->total_pages); + return -ENOMEM; + } + dom->pg_l4 = nr_page_tables(dom, dom->parms.virt_base, try_virt_end, l4_bits); dom->pg_l3 = Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |