[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merged.
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID b9181b1c576fb39bb4d3b088ac3378d77163b4cc # Parent 3c21a174e8fcbec6e50aa674e3b920ed7de472f2 # Parent c3cfc4ff3b08b01051e6fa0741e1e014a1307aea Merged. diff -r 3c21a174e8fc -r b9181b1c576f install.sh --- a/install.sh Sat Nov 26 01:13:51 2005 +++ b/install.sh Sat Nov 26 01:21:55 2005 @@ -28,7 +28,7 @@ echo "All done." [ -x "$(which udevinfo)" ] && \ - UDEV_VERSION=$(udevinfo -V | sed -e 's/^.*\s\([0-9]\+\)[^0-9]*/\1/') + UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]* \([0-9]\{1,\}\)[^0-9]\{0,\}/\1/') if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then cp -f $src/etc/udev/rules.d/*.rules $dst/etc/udev/rules.d/ diff -r 3c21a174e8fc -r b9181b1c576f linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c --- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Sat Nov 26 01:13:51 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Sat Nov 26 01:21:55 2005 @@ -213,55 +213,6 @@ break; #endif -#ifndef __ia64__ - case IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS: { - pgd_t *pgd; - pud_t *pud; - pmd_t *pmd; - unsigned long m2pv, m2p_mfn; - privcmd_m2pmfns_t m; - unsigned long __user *p; - int i; - -#if defined (__x86_64__) - /* - ** XXX SMH: the below procedure won't work for 64 since - ** we don't have access to the memory which maps the M2P. - ** A proper fix will probably involve moving this - ** functionality to Xen - for now just return an error - ** here rather than GPF'ing in the kernel. - */ - ret = -EINVAL; - break; -#endif - - if (copy_from_user(&m, udata, sizeof(m))) - return -EFAULT; - - m2pv = (unsigned long)machine_to_phys_mapping; - - p = m.arr; - - for (i=0; i < m.num; i++) { - pgd = pgd_offset_k(m2pv); - pud = pud_offset(pgd, m2pv); - pmd = pmd_offset(pud, m2pv); - m2p_mfn = (*(uint64_t *)pmd >> PAGE_SHIFT)&0xFFFFFFFF; - m2p_mfn += pte_index(m2pv); - - if (put_user(m2p_mfn, p + i)) - return -EFAULT; - - m2pv += (1 << 21); - } - - ret = 0; - break; - - } - break; -#endif - default: ret = -EINVAL; break; diff -r 3c21a174e8fc -r b9181b1c576f linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h --- a/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Sat Nov 26 01:13:51 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Sat Nov 26 01:21:55 2005 @@ -59,11 +59,6 @@ unsigned long __user *arr; /* array of mfns - top nibble set on err */ } privcmd_mmapbatch_t; -typedef struct privcmd_m2pmfns { - int num; /* max number of mfns to return */ - unsigned long __user *arr; /* array of mfns */ -} privcmd_m2pmfns_t; - typedef struct privcmd_blkmsg { unsigned long op; @@ -82,8 +77,6 @@ _IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t)) #define IOCTL_PRIVCMD_MMAPBATCH \ _IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t)) -#define IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS \ - _IOC(_IOC_READ, 'P', 4, sizeof(unsigned long)) #endif /* __LINUX_PUBLIC_PRIVCMD_H__ */ diff -r 3c21a174e8fc -r b9181b1c576f tools/check/check_hotplug --- a/tools/check/check_hotplug Sat Nov 26 01:13:51 2005 +++ b/tools/check/check_hotplug Sat Nov 26 01:21:55 2005 @@ -7,7 +7,7 @@ exit 1 } [ -x "$(which udevinfo)" ] && \ - UDEV_VERSION=$(udevinfo -V | sed -e 's/^.*\s\([0-9]\+\)[^0-9]*/\1/') + UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]* \([0-9]\{1,\}\)[^0-9]\{0,\}/\1/') if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then exit 0 diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_linux_restore.c --- a/tools/libxc/xc_linux_restore.c Sat Nov 26 01:13:51 2005 +++ b/tools/libxc/xc_linux_restore.c Sat Nov 26 01:21:55 2005 @@ -78,6 +78,7 @@ pfn = (pte >> PAGE_SHIFT) & 0xffffffff; if(pfn >= max_pfn) { + /* This "page table page" is probably not one; bail. */ ERR("Frame number in type %lu page table is out of range: " "i=%d pfn=0x%lx max_pfn=%lu", type >> 28, i, pfn, max_pfn); @@ -111,6 +112,7 @@ unsigned long mfn, pfn; unsigned int prev_pc, this_pc; int verify = 0; + int nraces = 0; /* The new domain's shared-info frame number. */ unsigned long shared_info_frame; @@ -344,8 +346,15 @@ if(pt_levels != 3 || pagetype != L1TAB) { if(!uncanonicalize_pagetable(pagetype, page)) { - ERR("failed uncanonicalize pt!\n"); - goto out; + /* + ** Failing to uncanonicalize a page table can be ok + ** under live migration since the pages type may have + ** changed by now (and we'll get an update later). + */ + DPRINTF("PT L%ld race on pfn=%08lx mfn=%08lx\n", + pagetype >> 28, pfn, mfn); + nraces++; + continue; } } @@ -394,7 +403,7 @@ n+= j; /* crude stats */ } - DPRINTF("Received all pages\n"); + DPRINTF("Received all pages (%d races)\n", nraces); if(pt_levels == 3) { diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_linux_save.c --- a/tools/libxc/xc_linux_save.c Sat Nov 26 01:13:51 2005 +++ b/tools/libxc/xc_linux_save.c Sat Nov 26 01:21:55 2005 @@ -502,7 +502,7 @@ unsigned long max_mfn, int prot) { - privcmd_m2pmfns_t m2p_mfns; + struct xen_machphys_mfn_list xmml; privcmd_mmap_t ioctlx; privcmd_mmap_entry_t *entries; unsigned long m2p_chunks, m2p_size; @@ -512,50 +512,45 @@ m2p_size = M2P_SIZE(max_mfn); m2p_chunks = M2P_CHUNKS(max_mfn); - - m2p_mfns.num = m2p_chunks; - - if(!(m2p_mfns.arr = malloc(m2p_chunks * sizeof(unsigned long)))) { + xmml.max_extents = m2p_chunks; + if (!(xmml.extent_start = malloc(m2p_chunks * sizeof(unsigned long)))) { ERR("failed to allocate space for m2p mfns!\n"); return NULL; } - if (ioctl(xc_handle, IOCTL_PRIVCMD_GET_MACH2PHYS_MFNS, &m2p_mfns) < 0) { + if (xc_memory_op(xc_handle, XENMEM_machphys_mfn_list, &xmml) || + (xmml.nr_extents != m2p_chunks)) { ERR("xc_get_m2p_mfns:"); return NULL; } - if((m2p = mmap(NULL, m2p_size, prot, - MAP_SHARED, xc_handle, 0)) == MAP_FAILED) { + if ((m2p = mmap(NULL, m2p_size, prot, + MAP_SHARED, xc_handle, 0)) == MAP_FAILED) { ERR("failed to mmap m2p"); return NULL; } - - - if(!(entries = malloc(m2p_chunks * sizeof(privcmd_mmap_entry_t)))) { + + if (!(entries = malloc(m2p_chunks * sizeof(privcmd_mmap_entry_t)))) { ERR("failed to allocate space for mmap entries!\n"); return NULL; } - ioctlx.num = m2p_chunks; ioctlx.dom = DOMID_XEN; ioctlx.entry = entries; - for(i=0; i < m2p_chunks; i++) { - + for (i=0; i < m2p_chunks; i++) { entries[i].va = (unsigned long)(((void *)m2p) + (i * M2P_CHUNK_SIZE)); - entries[i].mfn = m2p_mfns.arr[i]; + entries[i].mfn = xmml.extent_start[i]; entries[i].npages = M2P_CHUNK_SIZE >> PAGE_SHIFT; - - } - - if((rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx)) < 0) { + } + + if ((rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx)) < 0) { ERR("ioctl_mmap failed (rc = %d)", rc); return NULL; } - - free(m2p_mfns.arr); + + free(xmml.extent_start); free(entries); return m2p; diff -r 3c21a174e8fc -r b9181b1c576f tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Sat Nov 26 01:13:51 2005 +++ b/tools/libxc/xc_private.c Sat Nov 26 01:21:55 2005 @@ -190,6 +190,7 @@ { DECLARE_HYPERCALL; struct xen_memory_reservation *reservation = arg; + struct xen_machphys_mfn_list *xmml = arg; long ret = -EINVAL; hypercall.op = __HYPERVISOR_memory_op; @@ -214,6 +215,20 @@ goto out1; } break; + case XENMEM_machphys_mfn_list: + if ( mlock(xmml, sizeof(*xmml)) != 0 ) + { + PERROR("Could not mlock"); + goto out1; + } + if ( mlock(xmml->extent_start, + xmml->max_extents * sizeof(unsigned long)) != 0 ) + { + PERROR("Could not mlock"); + safe_munlock(xmml, sizeof(*xmml)); + goto out1; + } + break; } ret = do_xen_hypercall(xc_handle, &hypercall); @@ -226,6 +241,11 @@ if ( reservation->extent_start != NULL ) safe_munlock(reservation->extent_start, reservation->nr_extents * sizeof(unsigned long)); + break; + case XENMEM_machphys_mfn_list: + safe_munlock(xmml, sizeof(*xmml)); + safe_munlock(xmml->extent_start, + xmml->max_extents * sizeof(unsigned long)); break; } diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/configure.ac --- a/tools/xm-test/configure.ac Sat Nov 26 01:13:51 2005 +++ b/tools/xm-test/configure.ac Sat Nov 26 01:21:55 2005 @@ -35,6 +35,7 @@ Makefile ramdisk/Makefile tests/Makefile + tests/_sanity/Makefile tests/block-list/Makefile tests/block-create/Makefile tests/block-destroy/Makefile diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/runtest.sh --- a/tools/xm-test/runtest.sh Sat Nov 26 01:13:51 2005 +++ b/tools/xm-test/runtest.sh Sat Nov 26 01:21:55 2005 @@ -14,6 +14,7 @@ echo " -q : run a quick test set" echo " -e <email> : set email address for report" echo " -s <report> : just submit report <report>" + echo " -h | --help : show this help" } # Just submit the report @@ -83,6 +84,15 @@ # See if xend is running if ! xm list >/dev/null 2>&1; then echo "'xm list' failed: is xend running?" + exit 1 + fi + + # Run a few sample tests to make sure things are working + # before we take the plunge + echo "Running sanity checks..." + make -C tests/_sanity check 2>&1 | grep REASON + if [ $? -eq 0 ]; then + echo "Sanity checks failed" exit 1 fi @@ -119,7 +129,7 @@ # Run the tests run_tests() { output=$1 - echo Running tests... + echo Running real tests... TEST_VERBOSE=1 make -k check > $output 2>&1 } @@ -209,6 +219,10 @@ -s) run=no ;; + -h|--help) + usage + exit 0 + ;; *) REPORT=$1 break diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/tests/network-attach/network_utils.py --- a/tools/xm-test/tests/network-attach/network_utils.py Sat Nov 26 01:13:51 2005 +++ b/tools/xm-test/tests/network-attach/network_utils.py Sat Nov 26 01:21:55 2005 @@ -10,7 +10,7 @@ run = console.runCmd("ifconfig -a | grep eth") except ConsoleError, e: FAIL(str(e)) - return = len(run['output'].splitlines()) + return len(run['output'].splitlines()) def network_attach(domain_name, console): eths_before = count_eth(console) diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/shadow32.c --- a/xen/arch/x86/shadow32.c Sat Nov 26 01:13:51 2005 +++ b/xen/arch/x86/shadow32.c Sat Nov 26 01:21:55 2005 @@ -800,13 +800,10 @@ /* * Then free monitor_table. - * Note: for VMX guest, only BSP need do this free. */ - if (!(VMX_DOMAIN(v) && v->vcpu_id)) { - mfn = pagetable_get_pfn(v->arch.monitor_table); - unmap_domain_page(v->arch.monitor_vtable); - free_domheap_page(&frame_table[mfn]); - } + mfn = pagetable_get_pfn(v->arch.monitor_table); + unmap_domain_page(v->arch.monitor_vtable); + free_domheap_page(&frame_table[mfn]); v->arch.monitor_table = mk_pagetable(0); v->arch.monitor_vtable = 0; diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/shadow_public.c --- a/xen/arch/x86/shadow_public.c Sat Nov 26 01:13:51 2005 +++ b/xen/arch/x86/shadow_public.c Sat Nov 26 01:21:55 2005 @@ -297,13 +297,11 @@ /* * free monitor_table. - * Note: for VMX guest, only BSP need do this free. */ - if (!(VMX_DOMAIN(v) && v->vcpu_id)) { - mfn = pagetable_get_pfn(v->arch.monitor_table); - unmap_domain_page(v->arch.monitor_vtable); - free_domheap_page(&frame_table[mfn]); - } + mfn = pagetable_get_pfn(v->arch.monitor_table); + unmap_domain_page(v->arch.monitor_vtable); + free_domheap_page(&frame_table[mfn]); + v->arch.monitor_table = mk_pagetable(0); v->arch.monitor_vtable = 0; } @@ -396,18 +394,15 @@ /* * Then free monitor_table. - * Note: for VMX guest, only BSP need do this free. */ - if (!(VMX_DOMAIN(v) && v->vcpu_id)) { - mfn = pagetable_get_pfn(v->arch.monitor_table); - unmap_domain_page(v->arch.monitor_vtable); - free_domheap_page(&frame_table[mfn]); - } + mfn = pagetable_get_pfn(v->arch.monitor_table); + unmap_domain_page(v->arch.monitor_vtable); + free_domheap_page(&frame_table[mfn]); v->arch.monitor_table = mk_pagetable(0); v->arch.monitor_vtable = 0; } -#endif +#endif static void shadow_free_snapshot(struct domain *d, struct out_of_sync_entry *entry) diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/x86_32/mm.c --- a/xen/arch/x86/x86_32/mm.c Sat Nov 26 01:13:51 2005 +++ b/xen/arch/x86/x86_32/mm.c Sat Nov 26 01:21:55 2005 @@ -27,6 +27,7 @@ #include <asm/page.h> #include <asm/flushtlb.h> #include <asm/fixmap.h> +#include <public/memory.h> extern l1_pgentry_t *mapcache; @@ -184,6 +185,41 @@ } } +long arch_memory_op(int op, void *arg) +{ + struct xen_machphys_mfn_list xmml; + unsigned long mfn; + unsigned int i, max; + long rc = 0; + + switch ( op ) + { + case XENMEM_machphys_mfn_list: + if ( copy_from_user(&xmml, arg, sizeof(xmml)) ) + return -EFAULT; + + max = min_t(unsigned int, xmml.max_extents, mpt_size >> 21); + + for ( i = 0; i < max; i++ ) + { + mfn = l2e_get_pfn(idle_pg_table_l2[l2_linear_offset( + RDWR_MPT_VIRT_START + (i << 21))]) + l1_table_offset(i << 21); + if ( put_user(mfn, &xmml.extent_start[i]) ) + return -EFAULT; + } + + if ( put_user(i, &((struct xen_machphys_mfn_list *)arg)->nr_extents) ) + return -EFAULT; + + break; + + default: + rc = -ENOSYS; + break; + } + + return rc; +} long do_stack_switch(unsigned long ss, unsigned long esp) { diff -r 3c21a174e8fc -r b9181b1c576f xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Sat Nov 26 01:13:51 2005 +++ b/xen/arch/x86/x86_64/mm.c Sat Nov 26 01:21:55 2005 @@ -28,6 +28,7 @@ #include <asm/flushtlb.h> #include <asm/fixmap.h> #include <asm/msr.h> +#include <public/memory.h> struct pfn_info *alloc_xen_pagetable(void) { @@ -172,6 +173,51 @@ page_set_owner(&frame_table[m2p_start_mfn+i], dom_xen); } } +} + +long arch_memory_op(int op, void *arg) +{ + struct xen_machphys_mfn_list xmml; + l3_pgentry_t l3e; + l2_pgentry_t l2e; + unsigned long mfn, v; + unsigned int i; + long rc = 0; + + switch ( op ) + { + case XENMEM_machphys_mfn_list: + if ( copy_from_user(&xmml, arg, sizeof(xmml)) ) + return -EFAULT; + + for ( v = RDWR_MPT_VIRT_START; v != RDWR_MPT_VIRT_END; v += 1 << 21 ) + { + l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[ + l3_table_offset(v)]; + if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) ) + break; + l2e = l3e_to_l2e(l3e)[l2_table_offset(v)]; + if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) ) + break; + mfn = l2e_get_pfn(l2e) + l1_table_offset(v); + if ( i == xmml.max_extents ) + break; + if ( put_user(mfn, &xmml.extent_start[i]) ) + return -EFAULT; + i++; + } + + if ( put_user(i, &((struct xen_machphys_mfn_list *)arg)->nr_extents) ) + return -EFAULT; + + break; + + default: + rc = -ENOSYS; + break; + } + + return rc; } long do_stack_switch(unsigned long ss, unsigned long esp) diff -r 3c21a174e8fc -r b9181b1c576f xen/common/memory.c --- a/xen/common/memory.c Sat Nov 26 01:13:51 2005 +++ b/xen/common/memory.c Sat Nov 26 01:21:55 2005 @@ -215,7 +215,7 @@ break; default: - rc = -ENOSYS; + rc = arch_memory_op(op, arg); break; } diff -r 3c21a174e8fc -r b9181b1c576f xen/include/asm-ia64/mm.h --- a/xen/include/asm-ia64/mm.h Sat Nov 26 01:13:51 2005 +++ b/xen/include/asm-ia64/mm.h Sat Nov 26 01:21:55 2005 @@ -440,4 +440,7 @@ #define __gpa_to_mpa(_d, gpa) \ ((__gpfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK)) +/* Arch-specific portion of memory_op hypercall. */ +#define arch_memory_op(op, arg) (-ENOSYS) + #endif /* __ASM_IA64_MM_H__ */ diff -r 3c21a174e8fc -r b9181b1c576f xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Sat Nov 26 01:13:51 2005 +++ b/xen/include/asm-x86/mm.h Sat Nov 26 01:21:55 2005 @@ -379,6 +379,9 @@ void propagate_page_fault(unsigned long addr, u16 error_code); -extern int __sync_lazy_execstate(void); +int __sync_lazy_execstate(void); + +/* Arch-specific portion of memory_op hypercall. */ +long arch_memory_op(int op, void *arg); #endif /* __ASM_X86_MM_H__ */ diff -r 3c21a174e8fc -r b9181b1c576f xen/include/public/memory.h --- a/xen/include/public/memory.h Sat Nov 26 01:13:51 2005 +++ b/xen/include/public/memory.h Sat Nov 26 01:21:55 2005 @@ -60,6 +60,34 @@ #define XENMEM_current_reservation 3 #define XENMEM_maximum_reservation 4 +/* + * Returns a list of MFN bases of 2MB extents comprising the machine_to_phys + * mapping table. Architectures which do not have a m2p table do not implement + * this command. + * arg == addr of xen_machphys_mfn_list_t. + */ +#define XENMEM_machphys_mfn_list 5 +typedef struct xen_machphys_mfn_list { + /* + * Size of the 'extent_start' array. Fewer entries will be filled if the + * machphys table is smaller than max_extents * 2MB. + */ + unsigned int max_extents; + + /* + * Pointer to buffer to fill with list of extent starts. If there are + * any large discontiguities in the machine address space, 2MB gaps in + * the machphys table will be represented by an MFN base of zero. + */ + unsigned long *extent_start; + + /* + * Number of extents written to the above array. This will be smaller + * than 'max_extents' if the machphys table is smaller than max_e * 2MB. + */ + unsigned int nr_extents; +} xen_machphys_mfn_list_t; + #endif /* __XEN_PUBLIC_MEMORY_H__ */ /* diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/tests/_sanity/01_domu_proc.py --- /dev/null Sat Nov 26 01:13:51 2005 +++ b/tools/xm-test/tests/_sanity/01_domu_proc.py Sat Nov 26 01:21:55 2005 @@ -0,0 +1,34 @@ +#!/usr/bin/python + +# Copyright (C) International Business Machines Corp., 2005 +# Author: Dan Smith <danms@xxxxxxxxxx> + +# +# Test that the library and ramdisk are working to the point +# that we can start a DomU and read /proc +# + +from XmTestLib import * + +import re + +domain = XmTestDomain() + +try: + domain.start() +except DomainError, e: + FAIL(str(e)) + +try: + console = XmConsole(domain.getName()) + console.sendInput("foo") + run = console.runCmd("cat /proc/cpuinfo") +except ConsoleError, e: + FAIL(str(e)) + +if run["return"] != 0: + FAIL("Unable to read /proc/cpuinfo") + +if not re.search("processor", run["output"]): + print run["output"] + FAIL("/proc/cpuinfo looks wrong!") diff -r 3c21a174e8fc -r b9181b1c576f tools/xm-test/tests/_sanity/Makefile.am --- /dev/null Sat Nov 26 01:13:51 2005 +++ b/tools/xm-test/tests/_sanity/Makefile.am Sat Nov 26 01:21:55 2005 @@ -0,0 +1,21 @@ + +SUBDIRS = + +TESTS = 01_domu_proc.test + +XFAIL_TESTS = + +EXTRA_DIST = $(TESTS) $(XFAIL_TESTS) + +TESTS_ENVIRONMENT=@TENV@ + +%.test: %.py + cp $< $@ + chmod +x $@ + +clean-local: am_config_clean-local + +am_config_clean-local: + rm -f *test + rm -f *log + rm -f *~ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |