# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 2704a88c329598a92bc349869df461363e509b8f
# Parent 22c30df92b11f37e1f266976d0667d7c8cb02783
# Parent 4cdf880c94633aadff4d4d45f7a88d7e97f0e9dd
merge?
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Fri Sep
9 08:56:14 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Fri Sep
9 08:56:38 2005
@@ -2202,7 +2202,7 @@
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
-# CONFIG_DEVFS_FS is not set
+CONFIG_DEVFS_FS=y
CONFIG_DEVPTS_FS_XATTR=y
CONFIG_DEVPTS_FS_SECURITY=y
CONFIG_TMPFS=y
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c Fri Sep 9 08:56:14 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c Fri Sep 9 08:56:38 2005
@@ -22,13 +22,14 @@
#define ISA_START_ADDRESS 0x0
#define ISA_END_ADDRESS 0x100000
+#if 0 /* not PAE safe */
/* These hacky macros avoid phys->machine translations. */
#define __direct_pte(x) ((pte_t) { (x) } )
#define __direct_mk_pte(page_nr,pgprot) \
__direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
#define direct_mk_pte_phys(physpage, pgprot) \
__direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot)
-
+#endif
static int direct_remap_area_pte_fn(pte_t *pte,
struct page *pte_page,
@@ -37,16 +38,16 @@
{
mmu_update_t **v = (mmu_update_t **)data;
- (*v)->ptr = ((maddr_t)pfn_to_mfn(page_to_pfn(pte_page)) <<
+ (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pte_page)) <<
PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
(*v)++;
return 0;
}
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid)
@@ -77,9 +78,9 @@
* Fill in the machine address: PTE ptr is done later by
* __direct_remap_area_pages().
*/
- v->val = pte_val_ma(pfn_pte_ma(machine_addr >> PAGE_SHIFT,
prot));
-
- machine_addr += PAGE_SIZE;
+ v->val = pte_val_ma(pfn_pte_ma(mfn, prot));
+
+ mfn++;
address += PAGE_SIZE;
v++;
}
@@ -97,8 +98,10 @@
return 0;
}
-EXPORT_SYMBOL(direct_remap_area_pages);
-
+EXPORT_SYMBOL(direct_remap_pfn_range);
+
+
+/* FIXME: This is horribly broken on PAE */
static int lookup_pte_fn(
pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
{
@@ -218,7 +221,7 @@
#ifdef __x86_64__
flags |= _PAGE_USER;
#endif
- if (direct_remap_area_pages(&init_mm, (unsigned long) addr, phys_addr,
+ if (direct_remap_pfn_range(&init_mm, (unsigned long) addr,
phys_addr>>PAGE_SHIFT,
size, __pgprot(flags), domid)) {
vunmap((void __force *) addr);
return NULL;
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Sep 9
08:56:38 2005
@@ -182,7 +182,7 @@
static int blkif_queue_request(struct request *req)
{
struct blkfront_info *info = req->rq_disk->private_data;
- unsigned long buffer_ma;
+ unsigned long buffer_mfn;
blkif_request_t *ring_req;
struct bio *bio;
struct bio_vec *bvec;
@@ -221,7 +221,7 @@
bio_for_each_segment (bvec, bio, idx) {
BUG_ON(ring_req->nr_segments
== BLKIF_MAX_SEGMENTS_PER_REQUEST);
- buffer_ma = page_to_phys(bvec->bv_page);
+ buffer_mfn = page_to_phys(bvec->bv_page) >> PAGE_SHIFT;
fsect = bvec->bv_offset >> 9;
lsect = fsect + (bvec->bv_len >> 9) - 1;
/* install a grant reference. */
@@ -231,11 +231,11 @@
gnttab_grant_foreign_access_ref(
ref,
info->backend_id,
- buffer_ma >> PAGE_SHIFT,
+ buffer_mfn,
rq_data_dir(req) );
info->shadow[id].frame[ring_req->nr_segments] =
- buffer_ma >> PAGE_SHIFT;
+ buffer_mfn;
ring_req->frame_and_sects[ring_req->nr_segments] =
blkif_fas_from_gref(ref, fsect, lsect);
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Fri Sep 9
08:56:38 2005
@@ -154,12 +154,12 @@
pgprot_t prot = __pgprot(_KERNPG_TABLE);
int err;
- err = direct_remap_area_pages(&init_mm, localaddr,
- tx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
+ err = direct_remap_pfn_range(&init_mm, localaddr,
+ tx_ring_ref, PAGE_SIZE,
prot, netif->domid);
- err |= direct_remap_area_pages(&init_mm, localaddr + PAGE_SIZE,
- rx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
+ err |= direct_remap_pfn_range(&init_mm, localaddr + PAGE_SIZE,
+ rx_ring_ref, PAGE_SIZE,
prot, netif->domid);
if (err)
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Fri Sep 9
08:56:38 2005
@@ -297,7 +297,7 @@
mmuext->mfn = old_mfn;
mmuext++;
#endif
- mmu->ptr = (new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
+ mmu->ptr = ((unsigned long long)new_mfn << PAGE_SHIFT) |
MMU_MACHPHYS_UPDATE;
mmu->val = __pa(vdata) >> PAGE_SHIFT;
mmu++;
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri Sep 9
08:56:38 2005
@@ -618,7 +618,7 @@
/* Remap the page. */
#ifdef CONFIG_XEN_NETDEV_GRANT
- mmu->ptr = mfn << PAGE_SHIFT | MMU_MACHPHYS_UPDATE;
+ mmu->ptr = ((unsigned long long)mfn << PAGE_SHIFT) |
MMU_MACHPHYS_UPDATE;
#else
mmu->ptr = (rx->addr & PAGE_MASK) | MMU_MACHPHYS_UPDATE;
#endif
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c
--- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Fri Sep 9
08:56:38 2005
@@ -116,9 +116,9 @@
if ( (msg[j].va + (msg[j].npages<<PAGE_SHIFT)) > vma->vm_end )
return -EINVAL;
- if ( (rc = direct_remap_area_pages(vma->vm_mm,
+ if ( (rc = direct_remap_pfn_range(vma->vm_mm,
msg[j].va&PAGE_MASK,
- msg[j].mfn<<PAGE_SHIFT,
+ msg[j].mfn,
msg[j].npages<<PAGE_SHIFT,
vma->vm_page_prot,
mmapcmd.dom)) < 0 )
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/drivers/xen/usbback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/usbback/interface.c Fri Sep 9
08:56:38 2005
@@ -161,8 +161,8 @@
}
prot = __pgprot(_KERNPG_TABLE);
- error = direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(vma->addr),
- shmem_frame<<PAGE_SHIFT, PAGE_SIZE,
+ error = direct_remap_pfn_range(&init_mm, VMALLOC_VMADDR(vma->addr),
+ shmem_frame, PAGE_SIZE,
prot, domid);
if ( error != 0 )
{
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Fri Sep 9
08:56:38 2005
@@ -460,9 +460,9 @@
#define kern_addr_valid(addr) (1)
#endif /* !CONFIG_DISCONTIGMEM */
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid);
@@ -474,10 +474,10 @@
unsigned long size);
#define io_remap_page_range(vma,from,phys,size,prot) \
-direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
+direct_remap_pfn_range(vma->vm_mm,from,phys>>PAGE_SHIFT,size,prot,DOMID_IO)
#define io_remap_pfn_range(vma,from,pfn,size,prot) \
-direct_remap_area_pages(vma->vm_mm,from,pfn<<PAGE_SHIFT,size,prot,DOMID_IO)
+direct_remap_pfn_range(vma->vm_mm,from,pfn,size,prot,DOMID_IO)
#define MK_IOSPACE_PFN(space, pfn) (pfn)
#define GET_IOSPACE(pfn) 0
diff -r 22c30df92b11 -r 2704a88c3295
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h
--- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Fri Sep 9
08:56:14 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Fri Sep 9
08:56:38 2005
@@ -526,28 +526,26 @@
#define DOMID_LOCAL (0xFFFFU)
-int direct_remap_area_pages(struct mm_struct *mm,
+int direct_remap_pfn_range(struct mm_struct *mm,
unsigned long address,
- unsigned long machine_addr,
+ unsigned long mfn,
unsigned long size,
pgprot_t prot,
domid_t domid);
-int __direct_remap_area_pages(struct mm_struct *mm,
- unsigned long address,
- unsigned long size,
- mmu_update_t *v);
+
int create_lookup_pte_addr(struct mm_struct *mm,
unsigned long address,
unsigned long *ptep);
+
int touch_pte_range(struct mm_struct *mm,
unsigned long address,
unsigned long size);
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
-
direct_remap_area_pages((vma)->vm_mm,vaddr,paddr,size,prot,DOMID_IO)
+
direct_remap_pfn_range((vma)->vm_mm,vaddr,paddr>>PAGE_SHIFT,size,prot,DOMID_IO)
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
-
direct_remap_area_pages((vma)->vm_mm,vaddr,(pfn)<<PAGE_SHIFT,size,prot,DOMID_IO)
+
direct_remap_pfn_range((vma)->vm_mm,vaddr,pfn,size,prot,DOMID_IO)
#define MK_IOSPACE_PFN(space, pfn) (pfn)
#define GET_IOSPACE(pfn) 0
diff -r 22c30df92b11 -r 2704a88c3295 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Fri Sep 9 08:56:14 2005
+++ b/tools/libxc/xc_domain.c Fri Sep 9 08:56:38 2005
@@ -262,23 +262,66 @@
int xc_domain_memory_increase_reservation(int xc_handle,
u32 domid,
- unsigned int mem_kb)
+ unsigned long nr_extents,
+ unsigned int extent_order,
+ 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 = 0,
+ .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 : %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 22c30df92b11 -r 2704a88c3295 tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Fri Sep 9 08:56:14 2005
+++ b/tools/libxc/xc_linux_build.c Fri Sep 9 08:56:38 2005
@@ -57,7 +57,7 @@
}
#define alloc_pt(ltab, vltab) \
- ltab = page_array[ppt_alloc++] << PAGE_SHIFT; \
+ ltab = (unsigned long long)(page_array[ppt_alloc++]) << PAGE_SHIFT; \
if (vltab != NULL) { \
munmap(vltab, PAGE_SIZE); \
} \
@@ -128,18 +128,37 @@
l1_pgentry_64_t *vl1tab=NULL, *vl1e=NULL;
l2_pgentry_64_t *vl2tab=NULL, *vl2e=NULL;
l3_pgentry_64_t *vl3tab=NULL, *vl3e=NULL;
- unsigned long l1tab = 0;
- unsigned long l2tab = 0;
- unsigned long l3tab = 0;
+ unsigned long long l1tab = 0;
+ unsigned long long l2tab = 0;
+ unsigned long long l3tab = 0;
unsigned long ppt_alloc;
unsigned long count;
/* 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>0xfffff000ULL)
+ {
+ fprintf(stderr,"L3TAB = %llx above 4GB!\n",l3tab);
+ goto error_out;
+ }
+
for ( count = 0; count < ((v_end-dsi_v_start)>>PAGE_SHIFT); count++)
{
if ( !((unsigned long)vl1e & (PAGE_SIZE-1)) )
@@ -525,12 +544,14 @@
physmap = physmap_e = xc_map_foreign_range(
xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
page_array[physmap_pfn++]);
+
for ( count = 0; count < nr_pages; count++ )
{
if ( xc_add_mmu_update(xc_handle, mmu,
- (page_array[count] << PAGE_SHIFT) |
+ ((unsigned long long)page_array[count] <<
PAGE_SHIFT) |
MMU_MACHPHYS_UPDATE, count) )
{
+ fprintf(stderr,"m2p update failure p=%lx
m=%lx\n",count,page_array[count] );
munmap(physmap, PAGE_SIZE);
goto error_out;
}
diff -r 22c30df92b11 -r 2704a88c3295 tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Fri Sep 9 08:56:14 2005
+++ b/tools/libxc/xc_linux_restore.c Fri Sep 9 08:56:38 2005
@@ -149,9 +149,9 @@
}
err = xc_domain_memory_increase_reservation(xc_handle, dom,
- nr_pfns * PAGE_SIZE / 1024);
+ nr_pfns, 0, 0, NULL);
if (err != 0) {
- ERR("Failed to increate reservation by %lx\n",
+ ERR("Failed to increase reservation by %lx\n",
nr_pfns * PAGE_SIZE / 1024);
errno = ENOMEM;
goto out;
diff -r 22c30df92b11 -r 2704a88c3295 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Fri Sep 9 08:56:14 2005
+++ b/tools/libxc/xc_private.c Fri Sep 9 08:56:38 2005
@@ -116,7 +116,7 @@
if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
{
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ fprintf(stderr, "Dom_mmuext operation failed (rc=%ld errno=%d)-- need
to"
" rebuild the user-space tool set?\n",ret,errno);
}
@@ -172,7 +172,7 @@
}
int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
- unsigned long ptr, unsigned long val)
+ unsigned long long ptr, unsigned long long val)
{
mmu->updates[mmu->idx].ptr = ptr;
mmu->updates[mmu->idx].val = val;
@@ -229,7 +229,7 @@
if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
{
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ fprintf(stderr, "hypercall failed (rc=%ld errno=%d)-- need to"
" rebuild the user-space tool set?\n",ret,errno);
}
@@ -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 22c30df92b11 -r 2704a88c3295 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Fri Sep 9 08:56:14 2005
+++ b/tools/libxc/xenctrl.h Fri Sep 9 08:56:38 2005
@@ -387,7 +387,19 @@
int xc_domain_memory_increase_reservation(int xc_handle,
u32 domid,
- unsigned int mem_kb);
+ unsigned long nr_extents,
+ unsigned int extent_order,
+ 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. */
@@ -521,7 +533,7 @@
typedef struct xc_mmu xc_mmu_t;
xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom);
int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
- unsigned long ptr, unsigned long val);
+ unsigned long long ptr, unsigned long long val);
int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);
#endif
diff -r 22c30df92b11 -r 2704a88c3295 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Fri Sep 9 08:56:14 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Fri Sep 9 08:56:38 2005
@@ -841,14 +841,21 @@
u32 dom;
unsigned long mem_kb;
-
- static char *kwd_list[] = { "dom", "mem_kb", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list,
- &dom, &mem_kb) )
- return NULL;
-
- if ( xc_domain_memory_increase_reservation(xc->xc_handle, dom, 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 };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "il|ii", kwd_list,
+ &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,
+ nr_extents, extent_order,
+ address_bits, NULL) )
return PyErr_SetFromErrno(xc_error);
Py_INCREF(zero);
diff -r 22c30df92b11 -r 2704a88c3295 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Fri Sep 9 08:56:14 2005
+++ b/tools/python/xen/xend/image.py Fri Sep 9 08:56:38 2005
@@ -159,7 +159,12 @@
xc.domain_setmaxmem(dom, mem_kb)
try:
- xc.domain_memory_increase_reservation(dom, mem_kb)
+ # Give the domain some memory below 4GB
+ 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:
xc.domain_destroy(dom)
raise
diff -r 22c30df92b11 -r 2704a88c3295 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Fri Sep 9 08:56:14 2005
+++ b/xen/arch/x86/domain.c Fri Sep 9 08:56:38 2005
@@ -381,11 +381,13 @@
out:
free_vmcs(vmcs);
if(v->arch.arch_vmx.io_bitmap_a != 0) {
- free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+ free_xenheap_pages(
+ v->arch.arch_vmx.io_bitmap_a, get_order_from_bytes(0x1000));
v->arch.arch_vmx.io_bitmap_a = 0;
}
if(v->arch.arch_vmx.io_bitmap_b != 0) {
- free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+ free_xenheap_pages(
+ v->arch.arch_vmx.io_bitmap_b, get_order_from_bytes(0x1000));
v->arch.arch_vmx.io_bitmap_b = 0;
}
v->arch.arch_vmx.vmcs = 0;
@@ -972,11 +974,13 @@
BUG_ON(v->arch.arch_vmx.vmcs == NULL);
free_vmcs(v->arch.arch_vmx.vmcs);
if(v->arch.arch_vmx.io_bitmap_a != 0) {
- free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000));
+ free_xenheap_pages(
+ v->arch.arch_vmx.io_bitmap_a, get_order_from_bytes(0x1000));
v->arch.arch_vmx.io_bitmap_a = 0;
}
if(v->arch.arch_vmx.io_bitmap_b != 0) {
- free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000));
+ free_xenheap_pages(
+ v->arch.arch_vmx.io_bitmap_b, get_order_from_bytes(0x1000));
v->arch.arch_vmx.io_bitmap_b = 0;
}
v->arch.arch_vmx.vmcs = 0;
diff -r 22c30df92b11 -r 2704a88c3295 xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c Fri Sep 9 08:56:14 2005
+++ b/xen/arch/x86/domain_build.c Fri Sep 9 08:56:38 2005
@@ -75,15 +75,12 @@
struct pfn_info *page;
unsigned int order;
/*
- * Allocate up to 2MB at a time:
- * 1. This prevents overflow of get_order() when allocating more than
- * 4GB to domain 0 on a PAE machine.
- * 2. It prevents allocating very large chunks from DMA pools before
- * the >4GB pool is fully depleted.
+ * Allocate up to 2MB at a time: It prevents allocating very large chunks
+ * from DMA pools before the >4GB pool is fully depleted.
*/
if ( max_pages > (2UL << (20 - PAGE_SHIFT)) )
max_pages = 2UL << (20 - PAGE_SHIFT);
- order = get_order(max_pages << PAGE_SHIFT);
+ order = get_order_from_pages(max_pages);
if ( (max_pages & (max_pages-1)) != 0 )
order--;
while ( (page = alloc_domheap_pages(d, order, 0)) == NULL )
@@ -252,7 +249,7 @@
#endif
}
- order = get_order(v_end - dsi.v_start);
+ order = get_order_from_bytes(v_end - dsi.v_start);
if ( (1UL << order) > nr_pages )
panic("Domain 0 allocation is too small for kernel image.\n");
diff -r 22c30df92b11 -r 2704a88c3295 xen/arch/x86/vmx_vmcs.c
--- a/xen/arch/x86/vmx_vmcs.c Fri Sep 9 08:56:14 2005
+++ b/xen/arch/x86/vmx_vmcs.c Fri Sep 9 08:56:38 2005
@@ -44,7 +44,7 @@
rdmsr(MSR_IA32_VMX_BASIC_MSR, vmx_msr_low, vmx_msr_high);
vmcs_size = vmx_msr_high & 0x1fff;
- vmcs = alloc_xenheap_pages(get_order(vmcs_size));
+ vmcs = alloc_xenheap_pages(get_order_from_bytes(vmcs_size));
memset((char *)vmcs, 0, vmcs_size); /* don't remove this */
vmcs->vmcs_revision_id = vmx_msr_low;
@@ -55,7 +55,7 @@
{
int order;
- order = get_order(vmcs_size);
+ order = get_order_from_bytes(vmcs_size);
free_xenheap_pages(vmcs, order);
}
@@ -76,8 +76,8 @@
error |= __vmwrite(VM_ENTRY_CONTROLS, MONITOR_VM_ENTRY_CONTROLS);
/* need to use 0x1000 instead of PAGE_SIZE */
- io_bitmap_a = (void*) alloc_xenheap_pages(get_order(0x1000));
- io_bitmap_b = (void*) alloc_xenheap_pages(get_order(0x1000));
+ io_bitmap_a = (void*) alloc_xenheap_pages(get_order_from_bytes(0x1000));
+ io_bitmap_b = (void*) alloc_xenheap_pages(get_order_from_bytes(0x1000));
memset(io_bitmap_a, 0xff, 0x1000);
/* don't bother debug port access */
clear_bit(PC_DEBUG_PORT, io_bitmap_a);
diff -r 22c30df92b11 -r 2704a88c3295 xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c Fri Sep 9 08:56:14 2005
+++ b/xen/arch/x86/x86_32/mm.c Fri Sep 9 08:56:38 2005
@@ -118,7 +118,8 @@
}
/* Set up mapping cache for domain pages. */
- mapcache_order = get_order(MAPCACHE_MBYTES << (20 - PAGETABLE_ORDER));
+ mapcache_order = get_order_from_bytes(
+ MAPCACHE_MBYTES << (20 - PAGETABLE_ORDER));
mapcache = alloc_xenheap_pages(mapcache_order);
memset(mapcache, 0, PAGE_SIZE << mapcache_order);
for ( i = 0; i < (MAPCACHE_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ )
diff -r 22c30df92b11 -r 2704a88c3295 xen/common/grant_table.c
--- a/xen/common/grant_table.c Fri Sep 9 08:56:14 2005
+++ b/xen/common/grant_table.c Fri Sep 9 08:56:38 2005
@@ -399,7 +399,7 @@
{
int i;
grant_mapping_t *new_mt;
- grant_table_t *lgt = ld->grant_table;
+ grant_table_t *lgt = ld->grant_table;
if ( (lgt->maptrack_limit << 1) > MAPTRACK_MAX_ENTRIES )
{
@@ -437,9 +437,8 @@
ref, dom, dev_hst_ro_flags);
#endif
- if ( 0 <= ( rc = __gnttab_activate_grant_ref( ld, led, rd, ref,
- dev_hst_ro_flags,
- addr, &frame)))
+ if ( (rc = __gnttab_activate_grant_ref(ld, led, rd, ref, dev_hst_ro_flags,
+ addr, &frame)) >= 0 )
{
/*
* Only make the maptrack live _after_ writing the pte, in case we
@@ -807,7 +806,8 @@
int i;
int result = GNTST_okay;
- for (i = 0; i < count; i++) {
+ for ( i = 0; i < count; i++ )
+ {
gnttab_donate_t *gop = &uop[i];
#if GRANT_DEBUG
printk("gnttab_donate: i=%d mfn=%lx domid=%d gref=%08x\n",
@@ -815,19 +815,24 @@
#endif
page = &frame_table[gop->mfn];
- if (unlikely(IS_XEN_HEAP_FRAME(page))) {
+ if ( unlikely(IS_XEN_HEAP_FRAME(page)))
+ {
printk("gnttab_donate: xen heap frame mfn=%lx\n",
(unsigned long) gop->mfn);
gop->status = GNTST_bad_virt_addr;
continue;
}
- if (unlikely(!pfn_valid(page_to_pfn(page)))) {
+
+ if ( unlikely(!pfn_valid(page_to_pfn(page))) )
+ {
printk("gnttab_donate: invalid pfn for mfn=%lx\n",
(unsigned long) gop->mfn);
gop->status = GNTST_bad_virt_addr;
continue;
}
- if (unlikely((e = find_domain_by_id(gop->domid)) == NULL)) {
+
+ if ( unlikely((e = find_domain_by_id(gop->domid)) == NULL) )
+ {
printk("gnttab_donate: can't find domain %d\n", gop->domid);
gop->status = GNTST_bad_domain;
continue;
@@ -881,48 +886,23 @@
* headroom. Also, a domain mustn't have PGC_allocated
* pages when it is dying.
*/
-#ifdef GRANT_DEBUG
- if (unlikely(e->tot_pages >= e->max_pages)) {
- printk("gnttab_dontate: no headroom tot_pages=%d max_pages=%d\n",
- e->tot_pages, e->max_pages);
+ if ( unlikely(test_bit(DOMFLAGS_DYING, &e->domain_flags)) ||
+ unlikely(e->tot_pages >= e->max_pages) ||
+ unlikely(!gnttab_prepare_for_transfer(e, d, gop->handle)) )
+ {
+ DPRINTK("gnttab_donate: Transferee has no reservation headroom "
+ "(%d,%d) or provided a bad grant ref (%08x) or "
+ "is dying (%lx)\n",
+ e->tot_pages, e->max_pages, gop->handle, e->domain_flags);
spin_unlock(&e->page_alloc_lock);
put_domain(e);
gop->status = result = GNTST_general_error;
break;
}
- if (unlikely(test_bit(DOMFLAGS_DYING, &e->domain_flags))) {
- printk("gnttab_donate: target domain is dying\n");
- spin_unlock(&e->page_alloc_lock);
- put_domain(e);
- gop->status = result = GNTST_general_error;
- break;
- }
- if (unlikely(!gnttab_prepare_for_transfer(e, d, gop->handle))) {
- printk("gnttab_donate: gnttab_prepare_for_transfer fails.\n");
- spin_unlock(&e->page_alloc_lock);
- put_domain(e);
- gop->status = result = GNTST_general_error;
- break;
- }
-#else
- ASSERT(e->tot_pages <= e->max_pages);
- if (unlikely(test_bit(DOMFLAGS_DYING, &e->domain_flags)) ||
- unlikely(e->tot_pages == e->max_pages) ||
- unlikely(!gnttab_prepare_for_transfer(e, d, gop->handle))) {
- printk("gnttab_donate: Transferee has no reservation headroom (%d,"
- "%d) or provided a bad grant ref (%08x) or is dying (%p)\n",
- e->tot_pages, e->max_pages, gop->handle, e->d_flags);
- spin_unlock(&e->page_alloc_lock);
- put_domain(e);
- /* XXX SMH: better error return here would be useful */
- gop->status = result = GNTST_general_error;
- break;
- }
-#endif
+
/* Okay, add the page to 'e'. */
- if (unlikely(e->tot_pages++ == 0)) {
+ if ( unlikely(e->tot_pages++ == 0) )
get_knownalive_domain(e);
- }
list_add_tail(&page->list, &e->page_list);
page_set_owner(page, e);
@@ -938,6 +918,7 @@
gop->status = GNTST_okay;
}
+
return result;
}
@@ -957,38 +938,38 @@
rc = -EFAULT;
switch ( cmd )
- {
- case GNTTABOP_map_grant_ref:
- if ( unlikely(!array_access_ok(
- uop, count, sizeof(gnttab_map_grant_ref_t))) )
- goto out;
- rc = gnttab_map_grant_ref((gnttab_map_grant_ref_t *)uop, count);
- break;
- case GNTTABOP_unmap_grant_ref:
- if ( unlikely(!array_access_ok(
- uop, count, sizeof(gnttab_unmap_grant_ref_t))) )
- goto out;
- rc = gnttab_unmap_grant_ref((gnttab_unmap_grant_ref_t *)uop,
- count);
- break;
- case GNTTABOP_setup_table:
- rc = gnttab_setup_table((gnttab_setup_table_t *)uop, count);
- break;
+ {
+ case GNTTABOP_map_grant_ref:
+ if ( unlikely(!array_access_ok(
+ uop, count, sizeof(gnttab_map_grant_ref_t))) )
+ goto out;
+ rc = gnttab_map_grant_ref((gnttab_map_grant_ref_t *)uop, count);
+ break;
+ case GNTTABOP_unmap_grant_ref:
+ if ( unlikely(!array_access_ok(
+ uop, count, sizeof(gnttab_unmap_grant_ref_t))) )
+ goto out;
+ rc = gnttab_unmap_grant_ref(
+ (gnttab_unmap_grant_ref_t *)uop, count);
+ break;
+ case GNTTABOP_setup_table:
+ rc = gnttab_setup_table((gnttab_setup_table_t *)uop, count);
+ break;
#if GRANT_DEBUG
- case GNTTABOP_dump_table:
- rc = gnttab_dump_table((gnttab_dump_table_t *)uop);
- break;
+ case GNTTABOP_dump_table:
+ rc = gnttab_dump_table((gnttab_dump_table_t *)uop);
+ break;
#endif
- case GNTTABOP_donate:
- if (unlikely(!array_access_ok(uop, count,
- sizeof(gnttab_donate_t))))
- goto out;
- rc = gnttab_donate(uop, count);
- break;
- default:
- rc = -ENOSYS;
- break;
- }
+ case GNTTABOP_donate:
+ if (unlikely(!array_access_ok(
+ uop, count, sizeof(gnttab_donate_t))))
+ goto out;
+ rc = gnttab_donate(uop, count);
+ break;
+ default:
+ rc = -ENOSYS;
+ break;
+ }
out:
UNLOCK_BIGLOCK(d);
@@ -1021,17 +1002,17 @@
lgt = ld->grant_table;
#if GRANT_DEBUG_VERBOSE
- if ( ld->domain_id != 0 ) {
- DPRINTK("Foreign unref rd(%d) ld(%d) frm(%lx) flgs(%x).\n",
- rd->domain_id, ld->domain_id, frame, readonly);
- }
+ if ( ld->domain_id != 0 )
+ DPRINTK("Foreign unref rd(%d) ld(%d) frm(%lx) flgs(%x).\n",
+ rd->domain_id, ld->domain_id, frame, readonly);
#endif
/* Fast exit if we're not mapping anything using grant tables */
if ( lgt->map_count == 0 )
return 0;
- if ( get_domain(rd) == 0 ) {
+ if ( get_domain(rd) == 0 )
+ {
DPRINTK("gnttab_check_unmap: couldn't get_domain rd(%d)\n",
rd->domain_id);
return 0;
@@ -1268,8 +1249,11 @@
for ( i = 0; i < NR_GRANT_FRAMES; i++ )
{
SHARE_PFN_WITH_DOMAIN(
- virt_to_page((char *)(t->shared)+(i*PAGE_SIZE)), d);
- set_pfn_from_mfn((virt_to_phys(t->shared) >> PAGE_SHIFT) + i,
INVALID_M2P_ENTRY);
+ virt_to_page((char *)t->shared + (i * PAGE_SIZE)),
+ d);
+ set_pfn_from_mfn(
+ (virt_to_phys(t->shared) >> PAGE_SHIFT) + i,
+ INVALID_M2P_ENTRY);
}
/* Okay, install the structure. */
@@ -1306,57 +1290,53 @@
{
map = >->maptrack[handle];
- if ( map->ref_and_flags & GNTMAP_device_map )
- {
- dom = map->domid;
- ref = map->ref_and_flags >> MAPTRACK_REF_SHIFT;
-
- DPRINTK("Grant release (%hu) ref:(%hu) flags:(%x) dom:(%hu)\n",
- handle, ref,
- map->ref_and_flags & MAPTRACK_GNTMAP_MASK, dom);
-
- if ( unlikely((rd = find_domain_by_id(dom)) == NULL) ||
- unlikely(ld == rd) )
+ if ( !(map->ref_and_flags & GNTMAP_device_map) )
+ continue;
+
+ dom = map->domid;
+ ref = map->ref_and_flags >> MAPTRACK_REF_SHIFT;
+
+ DPRINTK("Grant release (%hu) ref:(%hu) flags:(%x) dom:(%hu)\n",
+ handle, ref, map->ref_and_flags & MAPTRACK_GNTMAP_MASK, dom);
+
+ if ( unlikely((rd = find_domain_by_id(dom)) == NULL) ||
+ unlikely(ld == rd) )
+ {
+ if ( rd != NULL )
+ put_domain(rd);
+ printk(KERN_WARNING "Grant release: No dom%d\n", dom);
+ continue;
+ }
+
+ act = &rd->grant_table->active[ref];
+ sha = &rd->grant_table->shared[ref];
+
+ spin_lock(&rd->grant_table->lock);
+
+ if ( act->pin & (GNTPIN_devw_mask | GNTPIN_devr_mask) )
+ {
+ frame = act->frame;
+
+ if ( ( (act->pin & GNTPIN_hstw_mask) == 0 ) &&
+ ( (act->pin & GNTPIN_devw_mask) > 0 ) )
{
- if ( rd != NULL )
- put_domain(rd);
-
- printk(KERN_WARNING "Grant release: No dom%d\n", dom);
- continue;
+ clear_bit(_GTF_writing, &sha->flags);
+ put_page_type(&frame_table[frame]);
}
- act = &rd->grant_table->active[ref];
- sha = &rd->grant_table->shared[ref];
-
- spin_lock(&rd->grant_table->lock);
-
- if ( act->pin & (GNTPIN_devw_mask | GNTPIN_devr_mask) )
+ map->ref_and_flags &= ~GNTMAP_device_map;
+ act->pin &= ~(GNTPIN_devw_mask | GNTPIN_devr_mask);
+ if ( act->pin == 0 )
{
- frame = act->frame;
-
- if ( ( (act->pin & GNTPIN_hstw_mask) == 0 ) &&
- ( (act->pin & GNTPIN_devw_mask) > 0 ) )
- {
- clear_bit(_GTF_writing, &sha->flags);
- put_page_type(&frame_table[frame]);
- }
-
- act->pin &= ~(GNTPIN_devw_mask | GNTPIN_devr_mask);
-
- if ( act->pin == 0 )
- {
- clear_bit(_GTF_reading, &sha->flags);
- map->ref_and_flags = 0;
- put_page(&frame_table[frame]);
- }
- else
- map->ref_and_flags &= ~GNTMAP_device_map;
+ clear_bit(_GTF_reading, &sha->flags);
+ map->ref_and_flags = 0;
+ put_page(&frame_table[frame]);
}
-
- spin_unlock(&rd->grant_table->lock);
-
- put_domain(rd);
- }
+ }
+
+ spin_unlock(&rd->grant_table->lock);
+
+ put_domain(rd);
}
}
diff -r 22c30df92b11 -r 2704a88c3295 xen/common/memory.c
--- a/xen/common/memory.c Fri Sep 9 08:56:14 2005
+++ b/xen/common/memory.c Fri Sep 9 08:56:38 2005
@@ -31,8 +31,8 @@
struct pfn_info *page;
unsigned long i;
- if ( (extent_list != NULL)
- && !array_access_ok(extent_list, nr_extents, sizeof(*extent_list)) )
+ if ( (extent_list != NULL) &&
+ !array_access_ok(extent_list, nr_extents, sizeof(*extent_list)) )
return 0;
if ( (extent_order != 0) && !IS_CAPABLE_PHYSDEV(current->domain) )
@@ -52,13 +52,14 @@
if ( unlikely((page = alloc_domheap_pages(
d, extent_order, flags)) == NULL) )
{
- DPRINTK("Could not allocate a frame\n");
+ DPRINTK("Could not allocate order=%d extent: id=%d flags=%x\n",
+ extent_order, d->domain_id, flags);
return i;
}
/* Inform the domain of the new page's machine address. */
- if ( (extent_list != NULL)
- && (__put_user(page_to_pfn(page), &extent_list[i]) != 0) )
+ if ( (extent_list != NULL) &&
+ (__put_user(page_to_pfn(page), &extent_list[i]) != 0) )
return i;
}
@@ -152,8 +153,9 @@
reservation.extent_start += start_extent;
reservation.nr_extents -= start_extent;
- if ( unlikely(reservation.address_bits != 0)
- && (reservation.address_bits > (get_order(max_page)+PAGE_SHIFT)) )
+ if ( (reservation.address_bits != 0) &&
+ (reservation.address_bits <
+ (get_order_from_pages(max_page) + PAGE_SHIFT)) )
{
if ( reservation.address_bits < 31 )
return -ENOMEM;
diff -r 22c30df92b11 -r 2704a88c3295 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c Fri Sep 9 08:56:14 2005
+++ b/xen/common/page_alloc.c Fri Sep 9 08:56:38 2005
@@ -216,7 +216,7 @@
#define NR_ZONES 3
-#define MAX_DMADOM_PFN 0x7FFFF /* 31 addressable bits */
+#define MAX_DMADOM_PFN 0x7FFFFUL /* 31 addressable bits */
#define pfn_dom_zone_type(_pfn) \
(((_pfn) <= MAX_DMADOM_PFN) ? MEMZONE_DMADOM : MEMZONE_DOM)
@@ -485,43 +485,40 @@
void init_domheap_pages(physaddr_t ps, physaddr_t pe)
{
+ unsigned long s_tot, e_tot, s_dma, e_dma, s_nrm, e_nrm;
+
ASSERT(!in_irq());
- ps = round_pgup(ps) >> PAGE_SHIFT;
- pe = round_pgdown(pe) >> PAGE_SHIFT;
- if ( pe <= ps )
- return;
-
- if ( (ps < MAX_DMADOM_PFN) && (pe > MAX_DMADOM_PFN) )
- {
- init_heap_pages(
- MEMZONE_DMADOM, pfn_to_page(ps), MAX_DMADOM_PFN - ps);
- init_heap_pages(
- MEMZONE_DOM, pfn_to_page(MAX_DMADOM_PFN), pe - MAX_DMADOM_PFN);
- }
- else
- {
- init_heap_pages(pfn_dom_zone_type(ps), pfn_to_page(ps), pe - ps);
- }
+ s_tot = round_pgup(ps) >> PAGE_SHIFT;
+ e_tot = round_pgdown(pe) >> PAGE_SHIFT;
+
+ s_dma = min(s_tot, MAX_DMADOM_PFN + 1);
+ e_dma = min(e_tot, MAX_DMADOM_PFN + 1);
+ if ( s_dma < e_dma )
+ init_heap_pages(MEMZONE_DMADOM, pfn_to_page(s_dma), e_dma - s_dma);
+
+ s_nrm = max(s_tot, MAX_DMADOM_PFN + 1);
+ e_nrm = max(e_tot, MAX_DMADOM_PFN + 1);
+ if ( s_nrm < e_nrm )
+ init_heap_pages(MEMZONE_DOM, pfn_to_page(s_nrm), e_nrm - s_nrm);
}
struct pfn_info *alloc_domheap_pages(
struct domain *d, unsigned int order, unsigned int flags)
{
- struct pfn_info *pg;
+ struct pfn_info *pg = NULL;
cpumask_t mask;
int i;
ASSERT(!in_irq());
- pg = NULL;
- if (! (flags & ALLOC_DOM_DMA))
+ if ( !(flags & ALLOC_DOM_DMA) )
pg = alloc_heap_pages(MEMZONE_DOM, order);
- if (pg == NULL) {
- if ( unlikely((pg = alloc_heap_pages(MEMZONE_DMADOM, order)) == NULL) )
+
+ if ( pg == NULL )
+ if ( (pg = alloc_heap_pages(MEMZONE_DMADOM, order)) == NULL )
return NULL;
- }
mask = pg->u.free.cpumask;
tlbflush_filter(mask, pg->tlbflush_timestamp);
diff -r 22c30df92b11 -r 2704a88c3295 xen/common/trace.c
--- a/xen/common/trace.c Fri Sep 9 08:56:14 2005
+++ b/xen/common/trace.c Fri Sep 9 08:56:38 2005
@@ -66,7 +66,7 @@
}
nr_pages = num_online_cpus() * opt_tbuf_size;
- order = get_order(nr_pages * PAGE_SIZE);
+ order = get_order_from_pages(nr_pages);
if ( (rawbuf = alloc_xenheap_pages(order)) == NULL )
{
diff -r 22c30df92b11 -r 2704a88c3295 xen/common/xmalloc.c
--- a/xen/common/xmalloc.c Fri Sep 9 08:56:14 2005
+++ b/xen/common/xmalloc.c Fri Sep 9 08:56:38 2005
@@ -86,7 +86,7 @@
static void *xmalloc_whole_pages(size_t size)
{
struct xmalloc_hdr *hdr;
- unsigned int pageorder = get_order(size);
+ unsigned int pageorder = get_order_from_bytes(size);
hdr = alloc_xenheap_pages(pageorder);
if ( hdr == NULL )
@@ -159,7 +159,7 @@
/* Big allocs free directly. */
if ( hdr->size >= PAGE_SIZE )
{
- free_xenheap_pages(hdr, get_order(hdr->size));
+ free_xenheap_pages(hdr, get_order_from_bytes(hdr->size));
return;
}
diff -r 22c30df92b11 -r 2704a88c3295 xen/drivers/char/console.c
--- a/xen/drivers/char/console.c Fri Sep 9 08:56:14 2005
+++ b/xen/drivers/char/console.c Fri Sep 9 08:56:38 2005
@@ -627,7 +627,7 @@
if ( bytes == 0 )
return 0;
- order = get_order(bytes);
+ order = get_order_from_bytes(bytes);
debugtrace_buf = alloc_xenheap_pages(order);
ASSERT(debugtrace_buf != NULL);
diff -r 22c30df92b11 -r 2704a88c3295 xen/drivers/char/serial.c
--- a/xen/drivers/char/serial.c Fri Sep 9 08:56:14 2005
+++ b/xen/drivers/char/serial.c Fri Sep 9 08:56:38 2005
@@ -366,8 +366,9 @@
void serial_async_transmit(struct serial_port *port)
{
BUG_ON(!port->driver->tx_empty);
- if ( !port->txbuf )
- port->txbuf = alloc_xenheap_pages(get_order(SERIAL_TXBUFSZ));
+ if ( port->txbuf == NULL )
+ port->txbuf = alloc_xenheap_pages(
+ get_order_from_bytes(SERIAL_TXBUFSZ));
}
/*
diff -r 22c30df92b11 -r 2704a88c3295 xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h Fri Sep 9 08:56:14 2005
+++ b/xen/include/asm-x86/page.h Fri Sep 9 08:56:38 2005
@@ -280,12 +280,21 @@
#ifndef __ASSEMBLY__
-static __inline__ int get_order(unsigned long size)
+static inline int get_order_from_bytes(physaddr_t size)
{
int order;
size = (size-1) >> PAGE_SHIFT;
for ( order = 0; size; order++ )
size >>= 1;
+ return order;
+}
+
+static inline int get_order_from_pages(unsigned long nr_pages)
+{
+ int order;
+ nr_pages--;
+ for ( order = 0; nr_pages; order++ )
+ nr_pages >>= 1;
return order;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|