[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-users] Xen + VServer



Hi all,

I used to run VServer in the past and recently gave Xen a try. I pretty
much like both of these technologies - each of them has some advantages
that the other one can't offer. I appreciate the real independence of
Xen domains but the memory overhead of running a kernel for each domain
and the need to partition the memory space may become a limitation. On
the other hand in VServer the contexts run on top of the same kernel and
may share the available memory which may come handy in some deployments.

So I decided to merge both patches and surprisingly enough - it works! I
don't now (yet) how stable it is but the kernel booted as domU and a
guest vserver context was created, some prcosses are running inside and
everything looks just fine.

Versions used:
* Linux kernel 2.6.11
* Xen 2.0-testing from yesterday
* VServer 2.0-rc4 (last version for 2.6.11)

Apply the attached patch on top of these.

Xen userspace is 2.0-testing as well, util-vserver 0.30.204 (debian
build), running on Debian Sarge.

My configuration was x86, statically compiled without modules, domU with
no physdev access, 3G/1G memspace split on x86, no preempt, no selinux.
What else?

This is the very first shot, I don't guarantee that it is stable,
secure, etc, but if you're brave enough give it a try ;-)

Michal Ludvig
--
* Personal homepage: http://www.logix.cz/michal



Index: linux-2.6.11/arch/xen/i386/Kconfig
===================================================================
--- linux-2.6.11.orig/arch/xen/i386/Kconfig
+++ linux-2.6.11/arch/xen/i386/Kconfig
@@ -546,6 +546,46 @@ config HIGHMEM4G
 
 endchoice
 
+choice
+       prompt "Memory Split User Space"
+       default SPLIT_3GB
+       help
+         A different Userspace/Kernel split allows you to
+         utilize up to alsmost 3GB of RAM without the requirement
+         for HIGHMEM. It also increases the available lowmem.
+
+config SPLIT_3GB
+       bool "3.0GB/1.0GB Kernel (Default)"
+       help
+         This is the default split of 3GB userspace to 1GB kernel
+         space, which will result in about 860MB of lowmem.
+
+config SPLIT_25GB
+       bool "2.5GB/1.5GB Kernel"
+       help
+         This split provides 2.5GB userspace and 1.5GB kernel
+         space, which will result in about 1370MB of lowmem.
+
+config SPLIT_2GB
+       bool "2.0GB/2.0GB Kernel"
+       help
+         This split provides 2GB userspace and 2GB kernel
+         space, which will result in about 1880MB of lowmem.
+
+config SPLIT_15GB
+       bool "1.5GB/2.5GB Kernel"
+       help
+         This split provides 1.5GB userspace and 2.5GB kernel
+         space, which will result in about 2390MB of lowmem.
+
+config SPLIT_1GB
+       bool "1.0GB/3.0GB Kernel"
+       help
+         This split provides 1GB userspace and 3GB kernel
+         space, which will result in about 2900MB of lowmem.
+
+endchoice
+
 config HIGHMEM
        bool
        depends on HIGHMEM64G || HIGHMEM4G
Index: linux-2.6.11/arch/xen/i386/kernel/entry.S
===================================================================
--- linux-2.6.11.orig/arch/xen/i386/kernel/entry.S
+++ linux-2.6.11/arch/xen/i386/kernel/entry.S
@@ -1011,7 +1011,7 @@ ENTRY(sys_call_table)
        .long sys_tgkill        /* 270 */
        .long sys_utimes
        .long sys_fadvise64_64
-       .long sys_ni_syscall    /* sys_vserver */
+       .long sys_vserver
        .long sys_mbind
        .long sys_get_mempolicy
        .long sys_set_mempolicy
Index: linux-2.6.11/arch/xen/i386/kernel/traps.c
===================================================================
--- linux-2.6.11.orig/arch/xen/i386/kernel/traps.c
+++ linux-2.6.11/arch/xen/i386/kernel/traps.c
@@ -53,6 +53,7 @@
 
 #include <linux/irq.h>
 #include <linux/module.h>
+#include <linux/vserver/debug.h>
 
 #include "mach_traps.h"
 
@@ -303,6 +304,7 @@ void die(const char * str, struct pt_reg
        };
        static int die_counter;
 
+       vxh_throw_oops();
        if (die.lock_owner != _smp_processor_id()) {
                console_verbose();
                spin_lock_irq(&die.lock);
@@ -337,6 +339,7 @@ void die(const char * str, struct pt_reg
        bust_spinlocks(0);
        die.lock_owner = -1;
        spin_unlock_irq(&die.lock);
+       vxh_dump_history();
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
Index: linux-2.6.11/include/asm-xen/asm-i386/page.h
===================================================================
--- linux-2.6.11.orig/include/asm-xen/asm-i386/page.h
+++ linux-2.6.11/include/asm-xen/asm-i386/page.h
@@ -167,16 +167,24 @@ extern int sysctl_legacy_va_layout;
 
 #endif /* __ASSEMBLY__ */
 
-#ifdef __ASSEMBLY__
+#if   defined(CONFIG_SPLIT_3GB)
 #define __PAGE_OFFSET          (0xC0000000)
-#else
-#define __PAGE_OFFSET          (0xC0000000UL)
+#elif defined(CONFIG_SPLIT_25GB)
+#define __PAGE_OFFSET          (0xA0000000)
+#elif defined(CONFIG_SPLIT_2GB)
+#define __PAGE_OFFSET          (0x80000000)
+#elif defined(CONFIG_SPLIT_15GB)
+#define __PAGE_OFFSET          (0x60000000)
+#elif defined(CONFIG_SPLIT_1GB)
+#define __PAGE_OFFSET          (0x40000000)
 #endif
 
 
 #define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
 #define VMALLOC_RESERVE                ((unsigned long)__VMALLOC_RESERVE)
-#define MAXMEM                 
(HYPERVISOR_VIRT_START-__PAGE_OFFSET-__VMALLOC_RESERVE)
+#define __MAXMEM               (-__PAGE_OFFSET-__VMALLOC_RESERVE)
+#define MAXMEM                 ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE))
+
 #define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
 #define __va(x)                        ((void *)((unsigned 
long)(x)+PAGE_OFFSET))
 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
Index: linux-2.6.11/include/asm-xen/asm-i386/processor.h
===================================================================
--- linux-2.6.11.orig/include/asm-xen/asm-i386/processor.h
+++ linux-2.6.11/include/asm-xen/asm-i386/processor.h
@@ -308,9 +308,10 @@ extern unsigned int mca_pentium_flag;
 extern int bootloader_type;
 
 /*
- * User space process size: 3GB (default).
+ * User space process size: (3GB default).
  */
-#define TASK_SIZE      (PAGE_OFFSET)
+#define __TASK_SIZE            (__PAGE_OFFSET)
+#define TASK_SIZE              ((unsigned long)__TASK_SIZE)
 
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
_______________________________________________
Xen-users mailing list
Xen-users@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-users

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.