Because XENMEM_maximum_reservation is rumored to change meaning in
the future, this patch adds a third amount-of-memory operation to
HYPERVISOR_memory_op() - XENMEM_maximum_memory.
This should make it possible to simply specify the maximum amount
of memory a guest will have in /etc/xen/<guest> instead of having
to pass it on the kernel commandline.
A next step would be to split out the maxmem values into two
different ones in the guest config file and the tools, but I'm
not quite sure what name to use there...
Signed-off-by: Rik van Riel <riel@xxxxxxxxxx>
--
All Rights Reversed
Because XENMEM_maximum_reservation is rumored to change meaning in
the future, this patch adds a third amount-of-memory operation to
HYPERVISOR_memory_op() - XENMEM_maximum_memory.
This should make it possible to simply specify the maximum amount
of memory a guest will have in /etc/xen/<guest> instead of having
to pass it on the kernel commandline.
A next step would be to split out the maxmem values into two
different ones in the guest config file and the tools, but I'm
not quite sure what name to use there...
Signed-off-by: Rik van Riel <riel@xxxxxxxxxx>
diff -r ea457d9d3fb2 linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c Mon Nov 20
16:59:07 2006 +0000
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c Tue Nov 21
15:58:56 2006 -0500
@@ -583,6 +583,7 @@ void __init setup_memory_region(void)
* the boot process we know we have plenty slack space.
*/
struct e820entry map[E820MAX];
+ unsigned long arg = DOMID_SELF;
memmap.nr_entries = E820MAX;
set_xen_guest_handle(memmap.buffer, map);
@@ -591,7 +592,11 @@ void __init setup_memory_region(void)
if ( rc == -ENOSYS ) {
memmap.nr_entries = 1;
map[0].addr = 0ULL;
- map[0].size = xen_start_info->nr_pages << PAGE_SHIFT;
+ rc = HYPERVISOR_memory_op(XENMEM_maximum_memory, &arg);
+ if ( rc < 0 )
+ map[0].size = xen_start_info->nr_pages << PAGE_SHIFT;
+ else
+ map[0].size = rc << PAGE_SHIFT;
/* 8MB slack (to balance backend allocations). */
map[0].size += 8 << 20;
map[0].type = E820_RAM;
diff -r ea457d9d3fb2
linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h Mon Nov
20 16:59:07 2006 +0000
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h Tue Nov
21 15:58:56 2006 -0500
@@ -18,6 +18,7 @@ static char * __init machine_specific_me
* the boot process we know we have plenty slack space.
*/
struct e820entry map[E820MAX];
+ unsigned long arg = DOMID_SELF;
memmap.nr_entries = E820MAX;
set_xen_guest_handle(memmap.buffer, map);
@@ -26,7 +27,11 @@ static char * __init machine_specific_me
if ( rc == -ENOSYS ) {
memmap.nr_entries = 1;
map[0].addr = 0ULL;
- map[0].size = PFN_PHYS(xen_start_info->nr_pages);
+ rc = HYPERVISOR_memory_op(XENMEM_maximum_memory, &arg);
+ if ( rc < 0 )
+ map[0].size = PFN_PHYS(xen_start_info->nr_pages);
+ else
+ map[0].size = PFN_PHYS(rc);
/* 8MB slack (to balance backend allocations). */
map[0].size += 8ULL << 20;
map[0].type = E820_RAM;
diff -r ea457d9d3fb2 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Mon Nov 20 16:59:07 2006 +0000
+++ b/xen/arch/x86/mm.c Tue Nov 21 15:58:56 2006 -0500
@@ -2974,6 +2974,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
break;
}
+ /* When implementing this, make sure to create a map up to the
+ * maximum amount of memory the guest will ever need. */
case XENMEM_memory_map:
{
return -ENOSYS;
diff -r ea457d9d3fb2 xen/common/memory.c
--- a/xen/common/memory.c Mon Nov 20 16:59:07 2006 +0000
+++ b/xen/common/memory.c Tue Nov 21 15:58:56 2006 -0500
@@ -588,6 +588,7 @@ long do_memory_op(unsigned long cmd, XEN
case XENMEM_current_reservation:
case XENMEM_maximum_reservation:
+ case XENMEM_maximum_memory:
if ( copy_from_guest(&domid, arg, 1) )
return -EFAULT;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|