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

[Xen-devel] [PATCH] linux/x86: consolidate pte_val/p[mug]d_val replacements



- replace incomplete pXX_val_ma() set with complete __pXX_val() set
- use __pXX_val() instead of pXX_val() when only flags are accessed or
  the frame number is only compared against zero

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: head-2007-04-27/arch/i386/mm/hypervisor.c
===================================================================
--- head-2007-04-27.orig/arch/i386/mm/hypervisor.c      2007-05-14 
13:35:27.000000000 +0200
+++ head-2007-04-27/arch/i386/mm/hypervisor.c   2007-04-27 16:08:31.000000000 
+0200
@@ -43,22 +43,11 @@
 #include <linux/percpu.h>
 #include <asm/tlbflush.h>
 
-#ifdef CONFIG_X86_64
-#define pmd_val_ma(v) (v).pmd
-#else
-#ifdef CONFIG_X86_PAE
-# define pmd_val_ma(v) ((v).pmd)
-# define pud_val_ma(v) ((v).pgd.pgd)
-#else
-# define pmd_val_ma(v) ((v).pud.pgd.pgd)
-#endif
-#endif
-
 void xen_l1_entry_update(pte_t *ptr, pte_t val)
 {
        mmu_update_t u;
        u.ptr = virt_to_machine(ptr);
-       u.val = pte_val_ma(val);
+       u.val = __pte_val(val);
        BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
 }
 
@@ -66,34 +55,26 @@ void xen_l2_entry_update(pmd_t *ptr, pmd
 {
        mmu_update_t u;
        u.ptr = virt_to_machine(ptr);
-       u.val = pmd_val_ma(val);
+       u.val = __pmd_val(val);
        BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
 }
 
-#ifdef CONFIG_X86_PAE
+#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
 void xen_l3_entry_update(pud_t *ptr, pud_t val)
 {
        mmu_update_t u;
        u.ptr = virt_to_machine(ptr);
-       u.val = pud_val_ma(val);
+       u.val = __pud_val(val);
        BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
 }
 #endif
 
 #ifdef CONFIG_X86_64
-void xen_l3_entry_update(pud_t *ptr, pud_t val)
-{
-       mmu_update_t u;
-       u.ptr = virt_to_machine(ptr);
-       u.val = val.pud;
-       BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
-
 void xen_l4_entry_update(pgd_t *ptr, pgd_t val)
 {
        mmu_update_t u;
        u.ptr = virt_to_machine(ptr);
-       u.val = val.pgd;
+       u.val = __pgd_val(val);
        BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
 }
 #endif /* CONFIG_X86_64 */
Index: head-2007-04-27/arch/i386/mm/ioremap-xen.c
===================================================================
--- head-2007-04-27.orig/arch/i386/mm/ioremap-xen.c     2007-05-14 
13:35:27.000000000 +0200
+++ head-2007-04-27/arch/i386/mm/ioremap-xen.c  2007-05-14 13:35:35.000000000 
+0200
@@ -76,7 +76,7 @@ static int __direct_remap_pfn_range(stru
                 * Fill in the machine address: PTE ptr is done later by
                 * __direct_remap_area_pages(). 
                 */
-               v->val = pte_val_ma(pfn_pte_ma(mfn, prot));
+               v->val = __pte_val(pfn_pte_ma(mfn, prot));
 
                mfn++;
                address += PAGE_SIZE; 
Index: head-2007-04-27/include/asm-i386/mach-xen/asm/page.h
===================================================================
--- head-2007-04-27.orig/include/asm-i386/mach-xen/asm/page.h   2007-05-14 
13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-i386/mach-xen/asm/page.h        2007-04-27 
16:08:31.000000000 +0200
@@ -89,19 +89,20 @@ typedef struct { unsigned long long pgpr
     (pgd_t) {((_x) & _PAGE_PRESENT) ? pte_phys_to_machine(_x) : (_x)}; })
 #define __pmd(x) ({ unsigned long long _x = (x); \
     (pmd_t) {((_x) & _PAGE_PRESENT) ? pte_phys_to_machine(_x) : (_x)}; })
-static inline unsigned long long pte_val_ma(pte_t x)
+static inline unsigned long long __pte_val(pte_t x)
 {
        return ((unsigned long long)x.pte_high << 32) | x.pte_low;
 }
 static inline unsigned long long pte_val(pte_t x)
 {
-       unsigned long long ret = pte_val_ma(x);
+       unsigned long long ret = __pte_val(x);
        if (x.pte_low & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
        return ret;
 }
+#define __pmd_val(x) ((x).pmd)
 static inline unsigned long long pmd_val(pmd_t x)
 {
-       unsigned long long ret = x.pmd;
+       unsigned long long ret = __pmd_val(x);
 #if CONFIG_XEN_COMPAT <= 0x030002
        if (ret) ret = pte_machine_to_phys(ret) | _PAGE_PRESENT;
 #else
@@ -109,9 +110,11 @@ static inline unsigned long long pmd_val
 #endif
        return ret;
 }
+#define __pud_val(x) __pgd_val((x).pgd)
+#define __pgd_val(x) ((x).pgd)
 static inline unsigned long long pgd_val(pgd_t x)
 {
-       unsigned long long ret = x.pgd;
+       unsigned long long ret = __pgd_val(x);
        if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
        return ret;
 }
@@ -123,17 +126,20 @@ typedef struct { unsigned long pgprot; }
 #define pgprot_val(x)  ((x).pgprot)
 #include <asm/maddr.h>
 #define boot_pte_t pte_t /* or would you rather have a typedef */
-#define pte_val(x)     (((x).pte_low & _PAGE_PRESENT) ? \
-                        machine_to_phys((x).pte_low) : \
-                        (x).pte_low)
-#define pte_val_ma(x)  ((x).pte_low)
+#define __pte_val(x) ((x).pte_low)
+#define pte_val(x) (__pte_val(x) & _PAGE_PRESENT ? \
+                    machine_to_phys(__pte_val(x)) : \
+                    __pte_val(x))
 #define __pte(x) ({ unsigned long _x = (x); \
     (pte_t) {((_x) & _PAGE_PRESENT) ? phys_to_machine(_x) : (_x)}; })
+#define __pmd_val(x) __pud_val((x).pud)
+#define __pud_val(x) __pgd_val((x).pgd)
 #define __pgd(x) ({ unsigned long _x = (x); \
     (pgd_t) {((_x) & _PAGE_PRESENT) ? phys_to_machine(_x) : (_x)}; })
+#define __pgd_val(x) ((x).pgd)
 static inline unsigned long pgd_val(pgd_t x)
 {
-       unsigned long ret = x.pgd;
+       unsigned long ret = __pgd_val(x);
 #if CONFIG_XEN_COMPAT <= 0x030002
        if (ret) ret = machine_to_phys(ret) | _PAGE_PRESENT;
 #else
Index: head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable.h
===================================================================
--- head-2007-04-27.orig/include/asm-i386/mach-xen/asm/pgtable.h        
2007-05-14 13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable.h     2007-04-27 
16:08:31.000000000 +0200
@@ -209,15 +209,16 @@ extern unsigned long pg0[];
 #define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
 
 /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
-#define pmd_none(x)    (!(unsigned long)pmd_val(x))
+#define pmd_none(x)    (!(unsigned long)__pmd_val(x))
 #if CONFIG_XEN_COMPAT <= 0x030002
 /* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
    can temporarily clear it. */
-#define pmd_present(x) (pmd_val(x))
+#define pmd_present(x) (__pmd_val(x))
+#define pmd_bad(x)     ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER & 
~_PAGE_PRESENT)) != (_KERNPG_TABLE & ~_PAGE_PRESENT))
 #else
-#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
+#define pmd_present(x) (__pmd_val(x) & _PAGE_PRESENT)
+#define pmd_bad(x)     ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != 
_KERNPG_TABLE)
 #endif
-#define pmd_bad(x)     ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER & 
~_PAGE_PRESENT)) != (_KERNPG_TABLE & ~_PAGE_PRESENT))
 
 
 #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
@@ -346,7 +347,7 @@ static inline pte_t pte_modify(pte_t pte
 }
 
 #define pmd_large(pmd) \
-((pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
+((__pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
 
 /*
  * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
Index: head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable-2level.h
===================================================================
--- head-2007-04-27.orig/include/asm-i386/mach-xen/asm/pgtable-2level.h 
2007-05-14 13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable-2level.h      
2007-04-27 16:08:31.000000000 +0200
@@ -4,9 +4,11 @@
 #include <asm-generic/pgtable-nopmd.h>
 
 #define pte_ERROR(e) \
-       printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low)
+       printk("%s:%d: bad pte %08lx (pfn %05lx).\n", __FILE__, __LINE__, \
+              __pte_val(e), pte_pfn(e))
 #define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
+       printk("%s:%d: bad pgd %08lx (pfn %05lx).\n", __FILE__, __LINE__, \
+              __pgd_val(e), pgd_val(e) >> PAGE_SHIFT)
 
 /*
  * Certain architectures need to do special things when PTEs
Index: head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable-3level.h
===================================================================
--- head-2007-04-27.orig/include/asm-i386/mach-xen/asm/pgtable-3level.h 
2007-05-14 13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-i386/mach-xen/asm/pgtable-3level.h      
2007-04-27 16:08:31.000000000 +0200
@@ -11,11 +11,14 @@
  */
 
 #define pte_ERROR(e) \
-       printk("%s:%d: bad pte %p(%08lx%08lx).\n", __FILE__, __LINE__, &(e), 
(e).pte_high, (e).pte_low)
+       printk("%s:%d: bad pte %p(%016Lx pfn %08lx).\n", __FILE__, __LINE__, \
+              &(e), __pte_val(e), pte_pfn(e))
 #define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %p(%016Lx).\n", __FILE__, __LINE__, &(e), 
pmd_val(e))
+       printk("%s:%d: bad pmd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
+              &(e), __pmd_val(e), (pmd_val(e) & PTE_MASK) >> PAGE_SHIFT)
 #define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %p(%016Lx).\n", __FILE__, __LINE__, &(e), 
pgd_val(e))
+       printk("%s:%d: bad pgd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
+              &(e), __pgd_val(e), (pgd_val(e) & PTE_MASK) >> PAGE_SHIFT)
 
 #define pud_none(pud)                          0
 #define pud_bad(pud)                           0
@@ -26,7 +29,7 @@
  */
 static inline int pte_x(pte_t pte)
 {
-       return !(pte_val(pte) & _PAGE_NX);
+       return !(__pte_val(pte) & _PAGE_NX);
 }
 
 /*
@@ -59,7 +62,7 @@ static inline void set_pte(pte_t *ptep, 
        ptep->pte_low = pte.pte_low;
 }
 #define set_pte_atomic(pteptr,pteval) \
-               set_64bit((unsigned long long *)(pteptr),pte_val_ma(pteval))
+               set_64bit((unsigned long long *)(pteptr),__pte_val(pteval))
 
 #define set_pte_at(_mm,addr,ptep,pteval) do {                          \
        if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
@@ -126,7 +129,7 @@ static inline pte_t ptep_get_and_clear(s
        pte_t pte = *ptep;
        if (!pte_none(pte)) {
                if (mm != &init_mm) {
-                       uint64_t val = pte_val_ma(pte);
+                       uint64_t val = __pte_val(pte);
                        if (__cmpxchg64(ptep, val, 0) != val) {
                                /* xchg acts as a barrier before the setting of 
the high bits */
                                pte.pte_low = xchg(&ptep->pte_low, 0);
Index: head-2007-04-27/include/asm-x86_64/mach-xen/asm/page.h
===================================================================
--- head-2007-04-27.orig/include/asm-x86_64/mach-xen/asm/page.h 2007-05-14 
13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-x86_64/mach-xen/asm/page.h      2007-04-27 
16:08:31.000000000 +0200
@@ -96,14 +96,15 @@ typedef struct { unsigned long pgd; } pg
 
 typedef struct { unsigned long pgprot; } pgprot_t;
 
-#define pte_val(x)     (((x).pte & _PAGE_PRESENT) ? \
-                        pte_machine_to_phys((x).pte) : \
-                        (x).pte)
-#define pte_val_ma(x)  ((x).pte)
+#define __pte_val(x) ((x).pte)
+#define pte_val(x) ((__pte_val(x) & _PAGE_PRESENT) ? \
+                    pte_machine_to_phys(__pte_val(x)) : \
+                    __pte_val(x))
 
+#define __pmd_val(x) ((x).pmd)
 static inline unsigned long pmd_val(pmd_t x)
 {
-       unsigned long ret = x.pmd;
+       unsigned long ret = __pmd_val(x);
 #if CONFIG_XEN_COMPAT <= 0x030002
        if (ret) ret = pte_machine_to_phys(ret) | _PAGE_PRESENT;
 #else
@@ -112,16 +113,18 @@ static inline unsigned long pmd_val(pmd_
        return ret;
 }
 
+#define __pud_val(x) ((x).pud)
 static inline unsigned long pud_val(pud_t x)
 {
-       unsigned long ret = x.pud;
+       unsigned long ret = __pud_val(x);
        if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
        return ret;
 }
 
+#define __pgd_val(x) ((x).pgd)
 static inline unsigned long pgd_val(pgd_t x)
 {
-       unsigned long ret = x.pgd;
+       unsigned long ret = __pgd_val(x);
        if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
        return ret;
 }
Index: head-2007-04-27/include/asm-x86_64/mach-xen/asm/pgtable.h
===================================================================
--- head-2007-04-27.orig/include/asm-x86_64/mach-xen/asm/pgtable.h      
2007-05-14 13:35:27.000000000 +0200
+++ head-2007-04-27/include/asm-x86_64/mach-xen/asm/pgtable.h   2007-05-03 
11:15:25.000000000 +0200
@@ -82,16 +82,20 @@ extern unsigned long empty_zero_page[PAG
 #define PTRS_PER_PTE   512
 
 #define pte_ERROR(e) \
-       printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), 
pte_val(e))
+       printk("%s:%d: bad pte %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
+              &(e), __pte_val(e), pte_pfn(e))
 #define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), 
pmd_val(e))
+       printk("%s:%d: bad pmd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
+              &(e), __pmd_val(e), pmd_pfn(e))
 #define pud_ERROR(e) \
-       printk("%s:%d: bad pud %p(%016lx).\n", __FILE__, __LINE__, &(e), 
pud_val(e))
+       printk("%s:%d: bad pud %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
+              &(e), __pud_val(e), (pud_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
 #define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), 
pgd_val(e))
+       printk("%s:%d: bad pgd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
+              &(e), __pgd_val(e), (pgd_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
 
-#define pgd_none(x)    (!pgd_val(x))
-#define pud_none(x)    (!pud_val(x))
+#define pgd_none(x)    (!__pgd_val(x))
+#define pud_none(x)    (!__pud_val(x))
 
 static inline void set_pte(pte_t *dst, pte_t val)
 {
@@ -236,7 +240,7 @@ extern unsigned int __kernel_page_user;
 
 static inline unsigned long pgd_bad(pgd_t pgd)
 {
-       unsigned long val = pgd_val(pgd);
+       unsigned long val = __pgd_val(pgd);
        val &= ~PTE_MASK;
        val &= ~(_PAGE_USER | _PAGE_DIRTY);
        return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);
@@ -244,7 +248,7 @@ static inline unsigned long pgd_bad(pgd_
 
 static inline unsigned long pud_bad(pud_t pud) 
 { 
-       unsigned long val = pud_val(pud);
+       unsigned long val = __pud_val(pud);
        val &= ~PTE_MASK; 
        val &= ~(_PAGE_USER | _PAGE_DIRTY); 
        return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);      
@@ -322,8 +327,6 @@ static inline pte_t ptep_get_and_clear_f
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-#define __pte_val(x)   ((x).pte)
-
 #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
 static inline int pte_user(pte_t pte)          { return __pte_val(pte) & 
_PAGE_USER; }
 static inline int pte_read(pte_t pte)          { return __pte_val(pte) & 
_PAGE_USER; }
@@ -377,7 +379,7 @@ static inline void ptep_set_wrprotect(st
 #define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | 
_PAGE_PWT))
 
 static inline int pmd_large(pmd_t pte) { 
-       return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE; 
+       return (__pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE;
 }      
 
 
@@ -394,14 +396,14 @@ static inline int pmd_large(pmd_t pte) {
 #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
 #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
 #define pgd_offset_k(address) (pgd_t *)(init_level4_pgt + pgd_index(address))
-#define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT)
+#define pgd_present(pgd) (__pgd_val(pgd) & _PAGE_PRESENT)
 #define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE)
 
 /* PUD - Level3 access */
 /* to find an entry in a page-table-directory. */
 #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
 #define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + 
pud_index(address))
-#define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT)
+#define pud_present(pud) (__pud_val(pud) & _PAGE_PRESENT)
 
 /* PMD  - Level 2 access */
 #define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK))
@@ -410,21 +412,21 @@ static inline int pmd_large(pmd_t pte) {
 #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
 #define pmd_offset(dir, address) ((pmd_t *) pud_page(*(dir)) + \
                                   pmd_index(address))
-#define pmd_none(x)    (!pmd_val(x))
+#define pmd_none(x)    (!__pmd_val(x))
 #if CONFIG_XEN_COMPAT <= 0x030002
 /* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
    can temporarily clear it. */
-#define pmd_present(x) (pmd_val(x))
+#define pmd_present(x) (__pmd_val(x))
 #else
-#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
+#define pmd_present(x) (__pmd_val(x) & _PAGE_PRESENT)
 #endif
 #define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
-#define pmd_bad(x) ((pmd_val(x) & ~(PTE_MASK | _PAGE_USER | _PAGE_PRESENT)) \
+#define pmd_bad(x) ((__pmd_val(x) & ~(PTE_MASK | _PAGE_USER | _PAGE_PRESENT)) \
                    != (_KERNPG_TABLE & ~(_PAGE_USER | _PAGE_PRESENT)))
 #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
 #define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
 
-#define pte_to_pgoff(pte) ((pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
+#define pte_to_pgoff(pte) ((__pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
 #define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
 #define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT
 
@@ -432,7 +434,7 @@ static inline pud_t *pud_offset_k(pgd_t 
 
 /* page, protection -> pte */
 #define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
-#define mk_pte_huge(entry) (pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
+#define mk_pte_huge(entry) (__pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
  
 /* physical address -> PTE */
 static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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