[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] merge?
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID 8db9c5873b9b4f9edc633f790b22d8683e30de2d # Parent 83bcc68aaf32b3eb1184d8d9c970147b006f4160 # Parent 28a10ec0fd6b6043f019beded0c99401315bfe93 merge? diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c Tue Sep 6 18:29:53 2005 @@ -359,7 +359,7 @@ shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; EXPORT_SYMBOL(HYPERVISOR_shared_info); -unsigned int *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; EXPORT_SYMBOL(phys_to_machine_mapping); /* Raw start-of-day parameters from the hypervisor. */ @@ -1206,7 +1206,7 @@ } #endif - phys_to_machine_mapping = (unsigned int *)xen_start_info->mfn_list; + phys_to_machine_mapping = (unsigned long *)xen_start_info->mfn_list; } /* @@ -1638,15 +1638,15 @@ /* Make sure we have a correctly sized P->M table. */ if (max_pfn != xen_start_info->nr_pages) { phys_to_machine_mapping = alloc_bootmem_low_pages( - max_pfn * sizeof(unsigned int)); + max_pfn * sizeof(unsigned long)); if (max_pfn > xen_start_info->nr_pages) { /* set to INVALID_P2M_ENTRY */ memset(phys_to_machine_mapping, ~0, - max_pfn * sizeof(unsigned int)); + max_pfn * sizeof(unsigned long)); memcpy(phys_to_machine_mapping, - (unsigned int *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(unsigned int)); + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); } else { struct xen_memory_reservation reservation = { .extent_start = (unsigned long *)xen_start_info->mfn_list + max_pfn, @@ -1656,9 +1656,8 @@ }; memcpy(phys_to_machine_mapping, - (unsigned int *)xen_start_info->mfn_list, - max_pfn * sizeof(unsigned int)); - /* N.B. below relies on sizeof(int) == sizeof(long). */ + (unsigned long *)xen_start_info->mfn_list, + max_pfn * sizeof(unsigned long)); BUG_ON(HYPERVISOR_memory_op( XENMEM_decrease_reservation, &reservation) != @@ -1667,11 +1666,11 @@ free_bootmem( __pa(xen_start_info->mfn_list), PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(unsigned int)))); + sizeof(unsigned long)))); } pfn_to_mfn_frame_list = alloc_bootmem_low_pages(PAGE_SIZE); - for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned int)), j++ ) + for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) { pfn_to_mfn_frame_list[j] = virt_to_mfn(&phys_to_machine_mapping[i]); diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c Tue Sep 6 18:29:53 2005 @@ -51,7 +51,7 @@ * swiotlb_sync_single_*, to see if the memory was in fact allocated by this * API. */ -static dma_addr_t iotlb_bus_start, iotlb_bus_mask; +static dma_addr_t iotlb_bus_start, iotlb_bus_end, iotlb_bus_mask; /* Does the given dma address reside within the swiotlb aperture? */ #define in_swiotlb_aperture(a) (!(((a) ^ iotlb_bus_start) & iotlb_bus_mask)) @@ -157,6 +157,7 @@ io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow); iotlb_bus_start = virt_to_bus(iotlb_virt_start); + iotlb_bus_end = iotlb_bus_start + bytes; iotlb_bus_mask = ~(dma_addr_t)(bytes - 1); printk(KERN_INFO "Software IO TLB enabled: \n" @@ -165,7 +166,7 @@ " Kernel range: 0x%016lx - 0x%016lx\n", bytes >> 20, (unsigned long)iotlb_bus_start, - (unsigned long)iotlb_bus_start + bytes, + (unsigned long)iotlb_bus_end, (unsigned long)iotlb_virt_start, (unsigned long)iotlb_virt_start + bytes); } @@ -191,6 +192,8 @@ if (swiotlb) swiotlb_init_with_default_size(64 * (1<<20)); + else + printk(KERN_INFO "Software IO TLB disabled\n"); } static void @@ -424,13 +427,6 @@ } dev_addr = virt_to_bus(map); - - /* - * Ensure that the address returned is DMA'ble - */ - if (address_needs_mapping(hwdev, dev_addr)) - panic("map_single: bounce buffer is not DMA'ble"); - return dev_addr; } @@ -632,7 +628,7 @@ int swiotlb_dma_supported (struct device *hwdev, u64 mask) { - return (mask >= 0xffffffffUL); + return (mask >= (iotlb_bus_end - 1)); } EXPORT_SYMBOL(swiotlb_init); diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/arch/xen/kernel/reboot.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Tue Sep 6 18:29:53 2005 @@ -81,7 +81,7 @@ extern void time_suspend(void); extern void time_resume(void); extern unsigned long max_pfn; - extern unsigned int *pfn_to_mfn_frame_list; + extern unsigned long *pfn_to_mfn_frame_list; #ifdef CONFIG_SMP extern void smp_suspend(void); diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c Tue Sep 6 18:29:53 2005 @@ -90,7 +90,7 @@ { int i; - phys_to_machine_mapping = (u32 *)xen_start_info->mfn_list; + phys_to_machine_mapping = (unsigned long *)xen_start_info->mfn_list; start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + xen_start_info->nr_pt_frames; diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Tue Sep 6 18:29:53 2005 @@ -76,7 +76,7 @@ /* Allows setting of maximum possible memory size */ unsigned long xen_override_max_pfn; -u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; EXPORT_SYMBOL(phys_to_machine_mapping); @@ -734,22 +734,22 @@ /* Make sure we have a large enough P->M table. */ if (end_pfn > xen_start_info->nr_pages) { phys_to_machine_mapping = alloc_bootmem( - end_pfn * sizeof(u32)); + end_pfn * sizeof(unsigned long)); memset(phys_to_machine_mapping, ~0, - end_pfn * sizeof(u32)); + end_pfn * sizeof(unsigned long)); memcpy(phys_to_machine_mapping, - (u32 *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(u32)); + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); free_bootmem( __pa(xen_start_info->mfn_list), PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(u32)))); + sizeof(unsigned long)))); } pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); - for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(u32)), j++ ) - pfn_to_mfn_frame_list[j] = + for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) + pfn_to_mfn_frame_list[j] = virt_to_mfn(&phys_to_machine_mapping[i]); } #endif diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Tue Sep 6 18:29:53 2005 @@ -60,14 +60,14 @@ #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0U) -#define FOREIGN_FRAME(m) ((m) | 0x80000000U) -extern unsigned int *phys_to_machine_mapping; +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME(m) ((m) | (1UL<<31)) +extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ -((unsigned long)phys_to_machine_mapping[(unsigned int)(pfn)] & 0x7FFFFFFFUL) +(phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL<<31)) static inline unsigned long mfn_to_pfn(unsigned long mfn) { - unsigned int pfn; + unsigned long pfn; /* * The array access can fail (e.g., device space beyond end of RAM). @@ -83,7 +83,7 @@ ".previous" : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); - return (unsigned long)pfn; + return pfn; } /* Definitions for machine and pseudophysical addresses. */ diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/include/asm-xen/asm-i386/pci.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pci.h Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pci.h Tue Sep 6 18:29:53 2005 @@ -43,8 +43,32 @@ struct pci_dev; +#ifdef CONFIG_SWIOTLB + + /* On Xen we use SWIOTLB instead of blk-specific bounce buffers. */ #define PCI_DMA_BUS_IS_PHYS (0) + +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ + dma_addr_t ADDR_NAME; +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ + __u32 LEN_NAME; +#define pci_unmap_addr(PTR, ADDR_NAME) \ + ((PTR)->ADDR_NAME) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ + (((PTR)->ADDR_NAME) = (VAL)) +#define pci_unmap_len(PTR, LEN_NAME) \ + ((PTR)->LEN_NAME) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ + (((PTR)->LEN_NAME) = (VAL)) + +#else + +/* The PCI address space does equal the physical memory + * address space. The networking and block device layers use + * this boolean for bounce buffer decisions. + */ +#define PCI_DMA_BUS_IS_PHYS (1) /* pci_unmap_{page,single} is a nop so... */ #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) @@ -53,6 +77,8 @@ #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) #define pci_unmap_len(PTR, LEN_NAME) (0) #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) + +#endif /* This is always fine. */ #define pci_dac_dma_supported(pci_dev, mask) (1) diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h Tue Sep 6 18:29:53 2005 @@ -62,14 +62,14 @@ #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0U) -#define FOREIGN_FRAME(m) ((m) | 0x80000000U) -extern u32 *phys_to_machine_mapping; +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME(m) ((m) | (1UL<<63)) +extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ -((unsigned long)phys_to_machine_mapping[(unsigned int)(pfn)] & 0x7FFFFFFFUL) +(phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL << 63)) static inline unsigned long mfn_to_pfn(unsigned long mfn) { - unsigned int pfn; + unsigned long pfn; /* * The array access can fail (e.g., device space beyond end of RAM). @@ -77,7 +77,7 @@ * but we must handle the fault without crashing! */ asm ( - "1: movl %1,%k0\n" + "1: movq %1,%0\n" "2:\n" ".section __ex_table,\"a\"\n" " .align 8\n" @@ -85,7 +85,7 @@ ".previous" : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); - return (unsigned long)pfn; + return pfn; } /* Definitions for machine and pseudophysical addresses. */ diff -r 83bcc68aaf32 -r 8db9c5873b9b linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pci.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pci.h Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pci.h Tue Sep 6 18:29:53 2005 @@ -76,12 +76,29 @@ #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ (((PTR)->LEN_NAME) = (VAL)) +#elif defined(CONFIG_SWIOTLB) + +#define PCI_DMA_BUS_IS_PHYS 0 + +#define pci_dac_dma_supported(pci_dev, mask) 1 + +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ + dma_addr_t ADDR_NAME; +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ + __u32 LEN_NAME; +#define pci_unmap_addr(PTR, ADDR_NAME) \ + ((PTR)->ADDR_NAME) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ + (((PTR)->ADDR_NAME) = (VAL)) +#define pci_unmap_len(PTR, LEN_NAME) \ + ((PTR)->LEN_NAME) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ + (((PTR)->LEN_NAME) = (VAL)) + #else /* No IOMMU */ -/* On Xen we use SWIOTLB instead of blk-specific bounce buffers. */ -#define PCI_DMA_BUS_IS_PHYS (0) - +#define PCI_DMA_BUS_IS_PHYS 1 #define pci_dac_dma_supported(pci_dev, mask) 1 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) diff -r 83bcc68aaf32 -r 8db9c5873b9b 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 Tue Sep 6 18:29:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Tue Sep 6 18:29:53 2005 @@ -307,7 +307,7 @@ #define pte_pfn(_pte) \ ({ \ unsigned long mfn = pte_mfn(_pte); \ - unsigned pfn = mfn_to_pfn(mfn); \ + unsigned long pfn = mfn_to_pfn(mfn); \ if ((pfn >= max_mapnr) || (phys_to_machine_mapping[pfn] != mfn))\ pfn = max_mapnr; /* special: force !pfn_valid() */ \ pfn; \ diff -r 83bcc68aaf32 -r 8db9c5873b9b tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Tue Sep 6 18:29:27 2005 +++ b/tools/libxc/xc_linux_build.c Tue Sep 6 18:29:53 2005 @@ -348,7 +348,7 @@ unsigned long nr_pt_pages; unsigned long physmap_pfn; - u32 *physmap, *physmap_e; + unsigned long *physmap, *physmap_e; struct load_funcs load_funcs; struct domain_setup_info dsi; diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Tue Sep 6 18:29:27 2005 +++ b/xen/arch/x86/domain_build.c Tue Sep 6 18:29:53 2005 @@ -218,7 +218,7 @@ vinitrd_start = round_pgup(dsi.v_end); vinitrd_end = vinitrd_start + initrd_len; vphysmap_start = round_pgup(vinitrd_end); - vphysmap_end = vphysmap_start + (nr_pages * sizeof(u32)); + vphysmap_end = vphysmap_start + (nr_pages * sizeof(unsigned long)); vstartinfo_start = round_pgup(vphysmap_end); vstartinfo_end = vstartinfo_start + PAGE_SIZE; vpt_start = vstartinfo_end; @@ -613,7 +613,7 @@ if ( !opt_dom0_translate && (pfn > REVERSE_START) ) mfn = alloc_epfn - (pfn - REVERSE_START); #endif - ((u32 *)vphysmap_start)[pfn] = mfn; + ((unsigned long *)vphysmap_start)[pfn] = mfn; set_pfn_from_mfn(mfn, pfn); } while ( pfn < nr_pages ) @@ -626,7 +626,7 @@ #ifndef NDEBUG #define pfn (nr_pages - 1 - (pfn - (alloc_epfn - alloc_spfn))) #endif - ((u32 *)vphysmap_start)[pfn] = mfn; + ((unsigned long *)vphysmap_start)[pfn] = mfn; set_pfn_from_mfn(mfn, pfn); #undef pfn page++; pfn++; diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Tue Sep 6 18:29:27 2005 +++ b/xen/arch/x86/mm.c Tue Sep 6 18:29:53 2005 @@ -1450,7 +1450,7 @@ ((type & PGT_type_mask) != PGT_l1_page_table) ) MEM_LOG("Bad type (saw %" PRtype_info "!= exp %" PRtype_info ") " - "for mfn %lx (pfn %x)", + "for mfn %lx (pfn %lx)", x, type, page_to_pfn(page), get_pfn_from_mfn(page_to_pfn(page))); return 0; diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/arch/x86/x86_32/mm.c --- a/xen/arch/x86/x86_32/mm.c Tue Sep 6 18:29:27 2005 +++ b/xen/arch/x86/x86_32/mm.c Tue Sep 6 18:29:53 2005 @@ -95,7 +95,7 @@ * Allocate and map the machine-to-phys table and create read-only mapping * of MPT for guest-OS use. */ - mpt_size = (max_page * 4) + (1UL << L2_PAGETABLE_SHIFT) - 1UL; + mpt_size = (max_page * BYTES_PER_LONG) + (1UL << L2_PAGETABLE_SHIFT) - 1; mpt_size &= ~((1UL << L2_PAGETABLE_SHIFT) - 1UL); for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++ ) { diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Tue Sep 6 18:29:27 2005 +++ b/xen/arch/x86/x86_64/mm.c Tue Sep 6 18:29:53 2005 @@ -98,7 +98,7 @@ * Allocate and map the machine-to-phys table. * This also ensures L3 is present for fixmaps. */ - mpt_size = (max_page * 4) + (1UL << L2_PAGETABLE_SHIFT) - 1UL; + mpt_size = (max_page * BYTES_PER_LONG) + (1UL << L2_PAGETABLE_SHIFT) - 1; mpt_size &= ~((1UL << L2_PAGETABLE_SHIFT) - 1UL); for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++ ) { diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Tue Sep 6 18:29:27 2005 +++ b/xen/include/asm-x86/mm.h Tue Sep 6 18:29:53 2005 @@ -255,9 +255,9 @@ * contiguous (or near contiguous) physical memory. */ #undef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)RDWR_MPT_VIRT_START) -#define INVALID_M2P_ENTRY (~0U) -#define VALID_M2P(_e) (!((_e) & (1U<<31))) +#define machine_to_phys_mapping ((unsigned long *)RDWR_MPT_VIRT_START) +#define INVALID_M2P_ENTRY (~0UL) +#define VALID_M2P(_e) (!((_e) & (1UL<<(BITS_PER_LONG-1)))) #define IS_INVALID_M2P_ENTRY(_e) (!VALID_M2P(_e)) #define set_pfn_from_mfn(mfn, pfn) (machine_to_phys_mapping[(mfn)] = (pfn)) diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/include/public/arch-x86_32.h --- a/xen/include/public/arch-x86_32.h Tue Sep 6 18:29:27 2005 +++ b/xen/include/public/arch-x86_32.h Tue Sep 6 18:29:53 2005 @@ -55,7 +55,7 @@ # define HYPERVISOR_VIRT_START (0xFC000000UL) #endif #ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)HYPERVISOR_VIRT_START) +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) #endif /* Maximum number of virtual CPUs in multi-processor guests. */ diff -r 83bcc68aaf32 -r 8db9c5873b9b xen/include/public/arch-x86_64.h --- a/xen/include/public/arch-x86_64.h Tue Sep 6 18:29:27 2005 +++ b/xen/include/public/arch-x86_64.h Tue Sep 6 18:29:53 2005 @@ -71,7 +71,7 @@ /* The machine->physical mapping table starts at this address, read-only. */ #ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)HYPERVISOR_VIRT_START) +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) #endif /* _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |