[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Improved "PGDs must be under 4GB" handling for PAE.
# HG changeset patch # User iap10@xxxxxxxxxxxxxxxxxxxxx # Node ID 5db85ba1c4e034a84aaea053052719320cefebfb # Parent 1f4863861d18ded485b5f126d592e2aad87a831d Improved "PGDs must be under 4GB" handling for PAE. Signed-off-by: ian@xxxxxxxxxxxxx diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Thu Sep 8 17:35:44 2005 +++ b/tools/libxc/xc_domain.c Thu Sep 8 17:36:23 2005 @@ -262,28 +262,66 @@ int xc_domain_memory_increase_reservation(int xc_handle, u32 domid, - unsigned long mem_kb, + unsigned long nr_extents, unsigned int extent_order, - unsigned int address_bits) + unsigned int address_bits, + unsigned long *extent_start) { int err; - unsigned int npages = mem_kb / (PAGE_SIZE/1024); struct xen_memory_reservation reservation = { - .nr_extents = npages, - .extent_order = extent_order, + .extent_start = extent_start, /* may be NULL */ + .nr_extents = nr_extents, + .extent_order = extent_order, .address_bits = address_bits, .domid = domid }; err = xc_memory_op(xc_handle, XENMEM_increase_reservation, &reservation); - if (err == npages) + if (err == nr_extents) return 0; if (err > 0) { - fprintf(stderr,"Failed alocation for dom %d : %d pages order %d addr_bits %d\n", - domid, npages, extent_order, address_bits); + fprintf(stderr,"Failed alocation for dom %d : %ld pages order %d addr_bits %d\n", + domid, nr_extents, extent_order, address_bits); errno = ENOMEM; err = -1; } return err; } + +int xc_domain_memory_decrease_reservation(int xc_handle, + u32 domid, + unsigned long nr_extents, + unsigned int extent_order, + unsigned long *extent_start) +{ + int err; + struct xen_memory_reservation reservation = { + .extent_start = extent_start, + .nr_extents = nr_extents, + .extent_order = extent_order, + .address_bits = 0, + .domid = domid + }; + + if (extent_start == NULL) + { + fprintf(stderr,"decrease_reservation extent_start is NULL!\n"); + errno = EINVAL; + err = -1; + goto out; + } + + err = xc_memory_op(xc_handle, XENMEM_increase_reservation, &reservation); + if (err == nr_extents) + return 0; + + if (err > 0) { + fprintf(stderr,"Failed de-alocation for dom %d : %ld pages order %d\n", + domid, nr_extents, extent_order); + errno = EBUSY; + err = -1; + } +out: + return err; +} diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Thu Sep 8 17:35:44 2005 +++ b/tools/libxc/xc_linux_build.c Thu Sep 8 17:36:23 2005 @@ -136,11 +136,24 @@ /* First allocate page for page dir. */ ppt_alloc = (vpt_start - dsi_v_start) >> PAGE_SHIFT; + + if ( page_array[ppt_alloc] > 0xfffff ) + { + unsigned long nmfn; + nmfn = xc_make_page_below_4G( xc_handle, dom, page_array[ppt_alloc] ); + if ( nmfn == 0 ) + { + fprintf(stderr, "Couldn't get a page below 4GB :-(\n"); + goto error_out; + } + page_array[ppt_alloc] = nmfn; + } + alloc_pt(l3tab, vl3tab); vl3e = &vl3tab[l3_table_offset_pae(dsi_v_start)]; ctxt->ctrlreg[3] = l3tab; - if(l3tab>0xfffff000) + if(l3tab>0xfffff000ULL) { fprintf(stderr,"L3TAB = %llx above 4GB!\n",l3tab); goto error_out; diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/libxc/xc_linux_restore.c --- a/tools/libxc/xc_linux_restore.c Thu Sep 8 17:35:44 2005 +++ b/tools/libxc/xc_linux_restore.c Thu Sep 8 17:36:23 2005 @@ -149,7 +149,7 @@ } err = xc_domain_memory_increase_reservation(xc_handle, dom, - nr_pfns * PAGE_SIZE / 1024, 0, 0); //FIX ME + nr_pfns, 0, 0, NULL); if (err != 0) { ERR("Failed to increase reservation by %lx\n", nr_pfns * PAGE_SIZE / 1024); diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Thu Sep 8 17:35:44 2005 +++ b/tools/libxc/xc_private.c Thu Sep 8 17:36:23 2005 @@ -427,3 +427,21 @@ { return do_xen_version(xc_handle, cmd, arg); } + +unsigned long xc_make_page_below_4G(int xc_handle, u32 domid, + unsigned long mfn) +{ + unsigned long new_mfn; + if ( xc_domain_memory_decrease_reservation( + xc_handle, domid, 1, 0, &mfn ) != 1 ) + { + fprintf(stderr,"xc_make_page_below_4G decrease failed. mfn=%lx\n",mfn); + return 0; + } + if ( xc_domain_memory_increase_reservation( xc_handle, domid, 1, 0, 32, &new_mfn ) != 1 ) + { + fprintf(stderr,"xc_make_page_below_4G increase failed. mfn=%lx\n",mfn); + return 0; + } + return new_mfn; +} diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Thu Sep 8 17:35:44 2005 +++ b/tools/libxc/xenctrl.h Thu Sep 8 17:36:23 2005 @@ -387,9 +387,19 @@ int xc_domain_memory_increase_reservation(int xc_handle, u32 domid, - unsigned long mem_kb, + unsigned long nr_extents, unsigned int extent_order, - unsigned int address_bits); + unsigned int address_bits, + unsigned long *extent_start); + +int xc_domain_memory_decrease_reservation(int xc_handle, + u32 domid, + unsigned long nr_extents, + unsigned int extent_order, + unsigned long *extent_start); + +unsigned long xc_make_page_below_4G(int xc_handle, u32 domid, + unsigned long mfn); typedef dom0_perfc_desc_t xc_perfc_desc_t; /* IMPORTANT: The caller is responsible for mlock()'ing the @desc array. */ diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Thu Sep 8 17:35:44 2005 +++ b/tools/python/xen/lowlevel/xc/xc.c Thu Sep 8 17:36:23 2005 @@ -842,6 +842,7 @@ u32 dom; unsigned long mem_kb; unsigned int extent_order = 0 , address_bits = 0; + unsigned long nr_extents; static char *kwd_list[] = { "dom", "mem_kb", "extent_order", "address_bits", NULL }; @@ -849,8 +850,12 @@ &dom, &mem_kb, &extent_order, &address_bits) ) return NULL; + /* round down to nearest power of 2. Assume callers using extent_order>0 + know what they are doing */ + nr_extents = (mem_kb / (XC_PAGE_SIZE/1024)) >> extent_order; if ( xc_domain_memory_increase_reservation(xc->xc_handle, dom, - mem_kb, extent_order, address_bits) ) + nr_extents, extent_order, + address_bits, NULL) ) return PyErr_SetFromErrno(xc_error); Py_INCREF(zero); diff -r 1f4863861d18 -r 5db85ba1c4e0 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Thu Sep 8 17:35:44 2005 +++ b/tools/python/xen/xend/image.py Thu Sep 8 17:36:23 2005 @@ -160,8 +160,9 @@ try: # Give the domain some memory below 4GB - lmem_kb = 4096 - xc.domain_memory_increase_reservation(dom, min(lmem_kb,mem_kb), 0, 32) + lmem_kb = 0 + if lmem_kb > 0: + xc.domain_memory_increase_reservation(dom, min(lmem_kb,mem_kb), 0, 32) if mem_kb > lmem_kb: xc.domain_memory_increase_reservation(dom, mem_kb-lmem_kb, 0, 0) except: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |