Hello community, here is the log from the commit of package xen checked in at Thu Jul 13 17:08:11 CEST 2006. -------- --- arch/i386/xen/xen.changes 2006-06-14 21:25:19.000000000 +0200 +++ xen/xen.changes 2006-07-13 00:11:19.000000000 +0200 @@ -1,0 +2,82 @@ +Wed Jul 12 16:11:10 MDT 2006 - ccoffing@novell.com + +- Corrected and updated README. + +------------------------------------------------------------------- +Mon Jul 10 10:27:09 MDT 2006 - ccoffing@novell.com + +- Add Jeff Mahoney's block-sync.diff, to give control of + "losetup -y" to the user (and potentially yast). Defaults to + old async behavior. (#190869) + +------------------------------------------------------------------- +Wed Jul 5 12:10:04 MDT 2006 - ccoffing@novell.com + +- Do not open migration port by default. (#190170) +- Update patch for migration oops, to latest version in bug + #162865. + +------------------------------------------------------------------- +Mon Jul 3 19:58:01 CEST 2006 - okir@suse.de + +- xen-losetup-sync.diff: use the new "losetup -y" option to force + the loop device to use synchronous I/O (#189051) + +------------------------------------------------------------------- +Fri Jun 30 12:38:24 MDT 2006 - ccoffing@novell.com + +- Increase balloon timeout value. (#189815) +- Update to xen-3.0-testing tree, changeset 9762. + +------------------------------------------------------------------- +Thu Jun 29 12:42:25 MDT 2006 - ccoffing@novell.com + +- Fix some loopback races in domUloader. (#151105) + +------------------------------------------------------------------- +Tue Jun 27 13:47:32 MDT 2006 - ccoffing@novell.com + +- Add "max_para_memory" and "max_hvm_memory" to output of "xm info" + for bug #184727. +- Include Jan's patches for bug #184175. Improves PAE guest + support on HVM. + +------------------------------------------------------------------- +Mon Jun 26 11:21:49 MDT 2006 - ccoffing@novell.com + +- Include patch from HP to fix a domU migration failure ("Kernel + BUG at mm/mmap.c:1961"). Force L1/L2 page tables to be updated + at the end, to avoid them from being dirtied and not transferred. + (#162865) + +------------------------------------------------------------------- +Thu Jun 23 09:23:19 MDT 2006 - kallan@novell.com + +- Updated xen-bonding.diff to enable bonding again after the latest + patches to network-bridge etc. (#161888) + +------------------------------------------------------------------- +Wed Jun 21 15:16:47 MDT 2006 - ccoffing@novell.com + +- Clean up the useless "Nothing to flush" messages, from 'ip addr + flush', in /var/log/xen-hotplug.log +- Fix race condition in domUloader.py, when another process did + losetup -d while domUloader was running. This would result in + the mount failing, and so the VM would fail to start. + +------------------------------------------------------------------- +Tue Jun 20 14:42:28 MDT 2006 - ccoffing@novell.com + +- Revamp balloon.py to account for pages currently being + scrubbed. (#185135) + +------------------------------------------------------------------- +Mon Jun 19 09:55:04 MDT 2006 - ccoffing@novell.com + +- Update to xen-3.0-testing tree, changeset 9749. +- DomUs are getting starved for CPU (up to 40 seconds was seen) + when dom0 has a load. This can cause pathological behavior, and + can cause OCFS2 to fence (panic) the domain. (#179368, #178884) +- Import Gerd's fix to network-bridge script for bug #161888. + +------------------------------------------------------------------- @@ -6,0 +89,3 @@ +- Update from Jan on the console patch. Not all graphics cards / + drivers properly reflect the state in the register being tested. + Improved the check, to prevent screen corruption. (#161541) Old: ---- xen-udev.diff xen-xendomains-defaults.diff New: ---- block-sync.diff shadow-pae-idx-no-pgt-score.patch xen-config-defaults.diff xen-migration-oops.diff xen-no-incdec-writable-pte-prediction.patch xen-no-pgt-high-mfn.patch xen-no-pgt-score.patch xen-shadow-pae.patch xen-wider-mfn.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xen.spec ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:23.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:23.000000000 +0200 @@ -1,5 +1,5 @@ # -# spec file for package xen (Version 3.0.2_09738) +# spec file for package xen (Version 3.0.2_09762) # # Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine @@ -14,12 +14,12 @@ BuildRequires: LibVNCServer SDL-devel autoconf automake bin86 dev86 glibc-devel-32bit latex2html libjpeg-devel libreiserfs-devel python-devel te_ams te_latex tetex transfig %define xvers 3.0 %define xvermaj 3 -%define changeset 09738 +%define changeset 09762 %define build_xmtest 0 %define with_pygrub 1 %define xen_build_dir xen-3.0-testing -Version: 3.0.2_09738 -Release: 2 +Version: 3.0.2_09762 +Release: 1 License: GPL Group: System/Kernel Autoreqprov: on @@ -46,39 +46,47 @@ Patch6: xen-rpmoptflags.diff Patch7: xen-docs.diff Patch8: xen-xmexample.diff -Patch9: xen-udev.diff -Patch11: xen-changeset.diff -Patch12: xen-domUloader.diff -Patch13: xen-domUloader-pygrub.diff -Patch14: xen-messages.diff -Patch15: xen-pae-makefile.diff -Patch16: xen-network-bridge.diff -Patch17: xen-max-free-mem.diff -Patch18: xen-no-dummy-nfs-ip.diff -Patch19: xen-xendomains-defaults.diff -Patch20: xen-localtime.diff -Patch21: xen-xm-top-needs-root.diff -Patch22: xen-tightvnc.diff -Patch23: xen-balloon.diff -Patch25: xen-bonding.diff -Patch26: xen-hvm-localtime.diff -Patch27: xen-hvm-auto-balloon.diff -Patch28: xen-ioapic-ack-default.diff -Patch29: xen-lost-mouse.diff -Patch30: xen-hvm-memory-check.diff -Patch31: xen-load-pae-bin-kernel.diff -Patch32: xen-paths.diff -Patch33: xen-hvm-rep-movs.diff -Patch34: xen-lowmem-emergency-pool.diff -Patch35: xen-console.diff -Patch36: xen-removable.diff -Patch37: xen-fatal-trap-halt.diff -Patch38: xen-cpuid.diff -Patch39: xen-read-port-0x61.diff -Patch40: xen-genapic.diff -Patch122: xen-unstable-9967-summa.diff -Patch200: xen-enable-hvm-debug.diff -Patch201: xen-enable-debug +Patch10: xen-changeset.diff +Patch11: xen-domUloader.diff +Patch12: xen-domUloader-pygrub.diff +Patch13: xen-messages.diff +Patch14: xen-pae-makefile.diff +Patch15: xen-network-bridge.diff +Patch16: xen-no-dummy-nfs-ip.diff +Patch17: xen-config-defaults.diff +Patch18: xen-localtime.diff +Patch19: xen-xm-top-needs-root.diff +Patch20: xen-tightvnc.diff +Patch21: xen-balloon.diff +Patch22: xen-max-free-mem.diff +Patch23: xen-bonding.diff +Patch24: xen-hvm-localtime.diff +Patch25: xen-hvm-auto-balloon.diff +Patch26: xen-ioapic-ack-default.diff +Patch27: xen-lost-mouse.diff +Patch28: xen-hvm-memory-check.diff +Patch29: xen-load-pae-bin-kernel.diff +Patch30: xen-paths.diff +Patch31: xen-hvm-rep-movs.diff +Patch32: xen-lowmem-emergency-pool.diff +Patch33: xen-console.diff +Patch34: xen-removable.diff +Patch35: xen-fatal-trap-halt.diff +Patch36: xen-cpuid.diff +Patch37: xen-read-port-0x61.diff +Patch38: xen-genapic.diff +Patch39: xen-migration-oops.diff +# Patches 40-45 are for bug 184175 +Patch40: xen-shadow-pae.patch +Patch41: shadow-pae-idx-no-pgt-score.patch +Patch42: xen-no-incdec-writable-pte-prediction.patch +Patch43: xen-no-pgt-score.patch +Patch44: xen-no-pgt-high-mfn.patch +Patch45: xen-wider-mfn.patch +Patch46: block-sync.diff +Patch100: xen-unstable-9967-summa.diff +Patch200: xen-enable-debug +Patch201: xen-enable-hvm-debug.diff Patch202: xen-poweroff.diff URL: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/ Prefix: /usr @@ -424,7 +432,7 @@ %prep %setup -q -n %xen_build_dir # Apply upstream patches first... -%patch122 -p1 +%patch100 -p1 # Now our patches... %patch1 -p1 %patch2 -p1 @@ -434,12 +442,12 @@ %patch6 -p1 %patch7 -p1 %patch8 -p1 -%patch9 -p1 +%patch10 -p1 %patch11 -p1 -%patch12 -p1 %if %{?with_pygrub}0 -%patch13 -p1 +%patch12 -p1 %endif +%patch13 -p1 %patch14 -p1 %patch15 -p1 %patch16 -p1 @@ -450,6 +458,7 @@ %patch21 -p1 %patch22 -p1 %patch23 -p1 +%patch24 -p1 %patch25 -p1 %patch26 -p1 %patch27 -p1 @@ -466,12 +475,20 @@ %patch38 -p1 %patch39 -p1 %patch40 -p1 -#%patch200 -p1 +#%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 +%patch46 -p1 +# Debugging +%patch200 -p1 +#patch201 -p1 +#patch202 -p1 XEN_EXTRAVERSION=%version-%release XEN_EXTRAVERSION=${XEN_EXTRAVERSION#%{xvers}} sed -i "s/XEN_EXTRAVERSION[ ]*.=.*\$/XEN_EXTRAVERSION = $XEN_EXTRAVERSION/" xen/Makefile sed -i "s/XEN_CHANGESET[ ]*=.*\$/XEN_CHANGESET = %{changeset}/" xen/Makefile -%patch201 -p1 %build test ! -z "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != "/" && rm -rf $RPM_BUILD_ROOT @@ -514,7 +531,7 @@ rm $RPM_BUILD_ROOT/boot/xen-%{xvers}.gz; ln -s xen-dbg-%{version}-%{release}.gz $RPM_BUILD_ROOT/boot/xen-dbg-%{xvers}.gz rm $RPM_BUILD_ROOT/boot/xen-%{xvermaj}.gz; ln -s xen-dbg-%{version}-%{release}.gz $RPM_BUILD_ROOT/boot/xen-dbg-%{xvermaj}.gz mv $RPM_BUILD_ROOT/boot/xen-syms-%{version}-%{release} $RPM_BUILD_ROOT/boot/xen-syms-dbg-%{version}-%{release} -patch -p1 -R <%PATCH201 +patch -p1 -R <%PATCH200 %ifarch %ix86 # Build PAE, non-debug version make -C xen clean @@ -772,10 +789,59 @@ %{insserv_cleanup} %changelog -n xen +* Wed Jul 12 2006 - ccoffing@novell.com +- Corrected and updated README. +* Mon Jul 10 2006 - ccoffing@novell.com +- Add Jeff Mahoney's block-sync.diff, to give control of + "losetup -y" to the user (and potentially yast). Defaults to + old async behavior. (#190869) +* Wed Jul 05 2006 - ccoffing@novell.com +- Do not open migration port by default. (#190170) +- Update patch for migration oops, to latest version in bug + [#162865]. +* Mon Jul 03 2006 - okir@suse.de +- xen-losetup-sync.diff: use the new "losetup -y" option to force + the loop device to use synchronous I/O (#189051) +* Fri Jun 30 2006 - ccoffing@novell.com +- Increase balloon timeout value. (#189815) +- Update to xen-3.0-testing tree, changeset 9762. +* Thu Jun 29 2006 - ccoffing@novell.com +- Fix some loopback races in domUloader. (#151105) +* Tue Jun 27 2006 - ccoffing@novell.com +- Add "max_para_memory" and "max_hvm_memory" to output of "xm info" + for bug #184727. +- Include Jan's patches for bug #184175. Improves PAE guest + support on HVM. +* Mon Jun 26 2006 - ccoffing@novell.com +- Include patch from HP to fix a domU migration failure ("Kernel + BUG at mm/mmap.c:1961"). Force L1/L2 page tables to be updated + at the end, to avoid them from being dirtied and not transferred. + (#162865) +* Fri Jun 23 2006 - kallan@novell.com +- Updated xen-bonding.diff to enable bonding again after the latest + patches to network-bridge etc. (#161888) +* Wed Jun 21 2006 - ccoffing@novell.com +- Clean up the useless "Nothing to flush" messages, from 'ip addr + flush', in /var/log/xen-hotplug.log +- Fix race condition in domUloader.py, when another process did + losetup -d while domUloader was running. This would result in + the mount failing, and so the VM would fail to start. +* Tue Jun 20 2006 - ccoffing@novell.com +- Revamp balloon.py to account for pages currently being + scrubbed. (#185135) +* Mon Jun 19 2006 - ccoffing@novell.com +- Update to xen-3.0-testing tree, changeset 9749. +- DomUs are getting starved for CPU (up to 40 seconds was seen) + when dom0 has a load. This can cause pathological behavior, and + can cause OCFS2 to fence (panic) the domain. (#179368, #178884) +- Import Gerd's fix to network-bridge script for bug #161888. * Wed Jun 14 2006 - ccoffing@novell.com - Pull out accidentally-included debugging code. - Drop xenvers patch; this was for backwards compatibility for some early internal builds. +- Update from Jan on the console patch. Not all graphics cards / + drivers properly reflect the state in the register being tested. + Improved the check, to prevent screen corruption. (#161541) * Tue Jun 13 2006 - ccoffing@novell.com - Resync with new tarball from xen-3.0-testing; changeset 9738. * Mon Jun 12 2006 - ccoffing@novell.com ++++++ README.SuSE ++++++ --- arch/i386/xen/README.SuSE 2006-06-13 21:14:16.000000000 +0200 +++ xen/README.SuSE 2006-07-12 23:57:07.000000000 +0200 @@ -4,9 +4,12 @@ This file contains SUSE-specific instructions and suggestions for using Xen. For more in-depth documentation of using Xen on SUSE, consult the -virtualization chapter in the SLES or SUSE Linux manual. For more complete -documentation on Xen itself, please install one of the xen-doc-* packages -and read the documentation installed into /usr/share/doc/packages/xen/. +virtualization chapter in the SLES or SUSE Linux manual, or read up-to-date +virtualization information at http://www.novell.com/documentation/vmserver/. + +For more complete documentation on Xen itself, please install one of the +xen-doc-* packages and read the documentation installed into +/usr/share/doc/packages/xen/. About @@ -18,7 +21,7 @@ If you want to use Xen, you need to install the Xen hypervisor and a number of supporting packages. During the initial SUSE installation (or when installing -from YaST) check-mark the "XEN Virtualization" selection. If, instead, you +from YaST) check-mark the "XEN Virtualization" pattern. If, instead, you wish to install Xen manually later, install the following packages: bridge-utils kernel-xen or kernel-xenpae @@ -119,7 +122,7 @@ grub-speak, e.g., hda1 -> (hd0,0) and sda5 -> (hd2,4). Normally, xen.gz requires no parameters. If you want to add parameters, -see the documentation in the xen-doc-* packages for a complete discussion. +see below. Replace "<parameters>" with the kernel parameters that you want to pass to your kernel. These should be very similar, if not identical, to those passed @@ -129,6 +132,17 @@ a privileged kernel on top of it. +Xen Boot Parameters +------------------- +Normally, xen.gz requires no parameters. However, in special cases (such as +debugging or a dedicated VM server) you may wish to pass it parameters. + +FIXME: Document any parameters we added, plus some common xen ones. + +For a more complete discussion of possible parameters, see the user +documentation in the xen-doc-* packages. + + Start Scripts ------------- Before you can create additional VMs (or use any other xm command) xend must @@ -160,9 +174,9 @@ using a network installation source, a DVD, or a DVD ISO. CDs do, however, work as expected in fully-virtual mode. -Note that paravirtualized SUSE Linux will default to using VNC, so that the -installation is graphical. (This is due to the "vnc=1" parameter passed on -the "Installation Options" line.) See this page for further guidance on +Note that paravirtualized SUSE Linux will default to using a text-based +installation. To perform a graphical installation, add "vnc=1" to the +"Installation Options" line in YaST. See this page for further guidance on installing via VNC: http://www.novell.com/coolsolutions/feature/15568.html @@ -182,7 +196,7 @@ installation of the OS within the VM (for SUSE only). Perhaps the easiest way to create such a profile is to install a SUSE OS within a VM and "clone" the operating system in the final stage of the OS installation. Then copy the -resulting file (/root/autoyast.xml) into the VM server's filesystem, into the +resulting file (/root/autoinst.xml) into the VM server's filesystem, into the directory /var/lib/autoinstall/repository/. Start the AutoYaST tool (YaST > Miscellaneous > Autoinstall) and then open the profile. Select the "Virtual Machine Management (Xen)" heading, and add the settings for the VM. Save the @@ -564,6 +578,7 @@ to use UTC, then non-Linux VMs (such as NetWare) may use localtime without a problem. +Bugzilla #179409: When running mkinitrd for kernel-xen or kernel-xenpae, the following error message will be displayed: Cannot determine dependencies of module edd. Is modules.dep up to date? ++++++ block-sync.diff ++++++ Index: xen-3.0-testing/tools/examples/block =================================================================== --- xen-3.0-testing.orig/tools/examples/block +++ xen-3.0-testing/tools/examples/block @@ -42,6 +42,20 @@ canonicalise_mode() fi } +## +# sync_flags mode +# +sync_flags() +{ + local mode="$1" + if expr index "$mode" 'S' >/dev/null + then + echo "-y" + else + echo "" + fi +} + ## # check_sharing device mode @@ -259,6 +273,7 @@ case "$command" in # Canonicalise the file, for sharing check comparison, and the mode # for ease of use here. file=$(readlink -f "$p") || fatal "$p does not exist." + sync=$(sync_flags "$mode") mode=$(canonicalise_mode "$mode") claim_lock "block" @@ -364,7 +379,7 @@ mount it read-write in a guest domain." fatal 'Failed to find an unused loop device' fi - do_or_die losetup "$loopdev" "$file" + do_or_die losetup $sync "$loopdev" "$file" xenstore_write "$XENBUS_PATH/node" "$loopdev" write_dev "$loopdev" release_lock "block" ++++++ domUloader.py ++++++ --- arch/i386/xen/domUloader.py 2006-06-13 17:37:41.000000000 +0200 +++ xen/domUloader.py 2006-07-12 22:52:48.000000000 +0200 @@ -39,6 +39,7 @@ import os, sys, getopt from xen.xend import sxp import tempfile +import time # Global options quiet = False @@ -69,16 +70,6 @@ "Determines whether dev is a wholedisk dev" return not domUname[-1:].isdigit() -def freeLoopDev(): - "Finds a free loop device; racy!" - loops = [] - fd = os.popen("losetup -a") - for ln in fd.readlines(): - loops.append(ln.split(':')[0]) - for nr in range(0,256): - if "/dev/loop%i" % nr not in loops: - return "/dev/loop%i" % nr - return None def findPart(dev): "Find device dev in list of partitions" @@ -102,31 +93,46 @@ def loopsetup(self): "Setup the loop mapping" if self.loopfile and not self.physdev: - ldev = freeLoopDev() - if not ldev: + # Loops through all loopback devices, attempting to + # find a free one to set up. Don't scan for free and + # then try to set it up as a separate step - too racy! + i = 0 + while True: + ldev = '/dev/loop%i' % (i) + if not os.path.exists(ldev): + break + i += 1 + fd = os.popen("losetup %s %s 2> /dev/null" % (ldev, self.loopfile)) + if not fd.close(): + if verbose: + print "domUloader: losetup %s %s" % (ldev, self.loopfile) + self.physdev = ldev + break + if not self.physdev: raise RuntimeError("domUloader: No free loop device found") - if verbose: - print "domUloader: losetup %s %s" % (ldev, self.loopfile) - fd = os.popen("losetup %s %s" % (ldev, self.loopfile)) - if fd.close(): - raise RuntimeError("domUloader: Failure setting up loop dev") - self.physdev = ldev def loopclean(self): "Delete the loop mapping" if self.loopfile and self.physdev: if verbose: print "domUloader: losetup -d %s" % self.physdev - fd = os.popen("losetup -d %s" % self.physdev) - self.physdev = None - return fd.close() + # Even seemingly innocent queries like "losetup /dev/loop0" + # can temporarily block the loopback and cause transient + # failures deleting the loopback, hence the retry logic. + retries = 10 + while retries: + fd = os.popen("losetup -d %s" % self.physdev) + if not fd.close(): + self.physdev = None + break + else: + time.sleep(0.1) + retries -= 1 def scanpartitions(self): """Scan device for partitions (kpartx -l) and set up data structures, Returns number of partitions found.""" self.loopsetup() - if not self.physdev: - raise RuntimeError("domUloader: No physical device? %s" % self.__repr__()) # TODO: We could use fdisk -l instead and look at the type of # partitions; this way we could also detect LVM and support it. fd = os.popen("kpartx -l %s" % self.physdev) @@ -148,7 +154,6 @@ else: ref = None partitions.append(Partition(ref, self.domname, self.physdev)) - self.loopclean() return pcount def activatepartitions(self): ++++++ shadow-pae-idx-no-pgt-score.patch ++++++ Stripped down from -unstable c/s 9626 and 10451. Index: 2006-06-20/xen/arch/x86/Makefile =================================================================== --- 2006-06-20.orig/xen/arch/x86/Makefile 2006-06-22 08:59:24.000000000 +0200 +++ 2006-06-20/xen/arch/x86/Makefile 2006-06-26 10:39:01.000000000 +0200 @@ -78,6 +78,7 @@ boot/mkelf32: boot/mkelf32.c $(HOSTCC) $(HOSTCFLAGS) -o $@ $< shadow_guest32.o: shadow.c +shadow_guest32pae.o: shadow.c clean:: FORCE rm -f asm-offsets.s xen.lds boot/*.o boot/*~ boot/core boot/mkelf32 Index: 2006-06-20/xen/arch/x86/audit.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/audit.c 2006-04-06 17:50:25.000000000 +0200 +++ 2006-06-20/xen/arch/x86/audit.c 2006-06-26 10:36:48.000000000 +0200 @@ -923,8 +923,8 @@ void _audit_domain(struct domain *d, int d->domain_id, page_to_mfn(page), page->u.inuse.type_info, page->count_info); - printk("a->gpfn_and_flags=%p\n", - (void *)a->gpfn_and_flags); + printk("a->gpfn_and_flags=%"PRIx64"\n", + (u64)a->gpfn_and_flags); errors++; } break; Index: 2006-06-20/xen/arch/x86/shadow.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow.c 2006-06-22 08:59:25.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow.c 2006-06-26 10:37:46.000000000 +0200 @@ -222,6 +222,7 @@ alloc_shadow_page(struct domain *d, unsigned long smfn, real_gpfn; int pin = 0; void *l1, *lp; + u64 index = 0; // Currently, we only keep pre-zero'ed pages around for use as L1's... // This will change. Soon. @@ -354,6 +355,9 @@ alloc_shadow_page(struct domain *d, if ( d->arch.ops->guest_paging_levels == PAGING_L2 ) pin = 1; #endif + + if ( d->arch.ops->guest_paging_levels == PAGING_L3 ) + index = get_cr3_idxval(current); break; #if CONFIG_PAGING_LEVELS >= 4 @@ -393,7 +404,7 @@ alloc_shadow_page(struct domain *d, // ASSERT( (psh_type == PGT_snapshot) || !mfn_out_of_sync(gmfn) ); - set_shadow_status(d, gpfn, gmfn, smfn, psh_type); + set_shadow_status(d, gpfn, gmfn, smfn, psh_type, index); if ( pin ) shadow_pin(smfn); @@ -1324,7 +1335,7 @@ increase_writable_pte_prediction(struct prediction = (prediction & PGT_mfn_mask) | score; //printk("increase gpfn=%lx pred=%lx create=%d\n", gpfn, prediction, create); - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred); + set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); if ( create ) perfc_incr(writable_pte_predictions); @@ -1345,10 +1356,10 @@ decrease_writable_pte_prediction(struct //printk("decrease gpfn=%lx pred=%lx score=%lx\n", gpfn, prediction, score); if ( score ) - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred); + set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); else { - delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred); + delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred, 0); perfc_decr(writable_pte_predictions); } } @@ -1538,15 +1549,11 @@ static void resync_pae_guest_l3(struct d continue; idx = get_cr3_idxval(v); - smfn = __shadow_status( - d, ((unsigned long)(idx << PGT_score_shift) | entry->gpfn), PGT_l4_shadow); -#ifndef NDEBUG + smfn = __shadow_status(d, entry->gpfn, PGT_l4_shadow); + if ( !smfn ) - { - BUG(); - } -#endif + continue; guest = (pgentry_64_t *)map_domain_page(entry->gmfn); snapshot = (pgentry_64_t *)map_domain_page(entry->snapshot_mfn); @@ -2374,17 +2431,6 @@ static void shadow_update_pagetables(str v->arch.guest_vtable = map_domain_page_global(gmfn); } -#if CONFIG_PAGING_LEVELS >= 3 - /* - * Handle 32-bit PAE enabled guest - */ - if ( SH_GUEST_32PAE && d->arch.ops->guest_paging_levels == PAGING_L3 ) - { - u32 index = get_cr3_idxval(v); - gpfn = (index << PGT_score_shift) | gpfn; - } -#endif - /* * arch.shadow_table */ Index: 2006-06-20/xen/arch/x86/shadow32.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow32.c 2006-06-22 08:59:25.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow32.c 2006-06-26 10:36:48.000000000 +0200 @@ -306,7 +306,7 @@ alloc_shadow_page(struct domain *d, // ASSERT( (psh_type == PGT_snapshot) || !mfn_out_of_sync(gmfn) ); - set_shadow_status(d, gpfn, gmfn, smfn, psh_type); + set_shadow_status(d, gpfn, gmfn, smfn, psh_type, 0); if ( pin ) shadow_pin(smfn); @@ -395,7 +395,7 @@ void free_shadow_page(unsigned long smfn ASSERT( ! IS_INVALID_M2P_ENTRY(gpfn) ); - delete_shadow_status(d, gpfn, gmfn, type); + delete_shadow_status(d, gpfn, gmfn, type, 0); switch ( type ) { @@ -2312,7 +2312,7 @@ increase_writable_pte_prediction(struct prediction = (prediction & PGT_mfn_mask) | score; //printk("increase gpfn=%lx pred=%lx create=%d\n", gpfn, prediction, create); - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred); + set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); if ( create ) perfc_incr(writable_pte_predictions); @@ -2333,10 +2333,10 @@ decrease_writable_pte_prediction(struct //printk("decrease gpfn=%lx pred=%lx score=%lx\n", gpfn, prediction, score); if ( score ) - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred); + set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); else { - delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred); + delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred, 0); perfc_decr(writable_pte_predictions); } } @@ -2374,7 +2374,7 @@ free_writable_pte_predictions(struct dom * keep an accurate count of writable_pte_predictions to keep it * happy. */ - delete_shadow_status(d, gpfn_list[count], 0, PGT_writable_pred); + delete_shadow_status(d, gpfn_list[count], 0, PGT_writable_pred, 0); perfc_decr(writable_pte_predictions); } Index: 2006-06-20/xen/arch/x86/shadow_public.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow_public.c 2006-06-22 08:59:25.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow_public.c 2006-06-26 10:37:46.000000000 +0200 @@ -697,11 +715,11 @@ void free_fake_shadow_l2(struct domain * void free_shadow_page(unsigned long smfn) { struct page_info *page = mfn_to_page(smfn); - unsigned long gmfn = page->u.inuse.type_info & PGT_mfn_mask; struct domain *d = page_get_owner(mfn_to_page(gmfn)); unsigned long gpfn = mfn_to_gmfn(d, gmfn); unsigned long type = page->u.inuse.type_info & PGT_type_mask; + u64 index = 0; SH_VVLOG("%s: free'ing smfn=%lx", __func__, smfn); @@ -714,11 +732,11 @@ void free_shadow_page(unsigned long smfn } if (d->arch.ops->guest_paging_levels == PAGING_L3) if (type == PGT_l4_shadow ) { - gpfn = ((unsigned long)page->tlbflush_timestamp << PGT_score_shift) | gpfn; + index = page->tlbflush_timestamp; } #endif - delete_shadow_status(d, gpfn, gmfn, type); + delete_shadow_status(d, gpfn, gmfn, type, index); switch ( type ) { @@ -813,7 +849,7 @@ free_writable_pte_predictions(struct dom while ( count ) { count--; - delete_shadow_status(d, gpfn_list[count], 0, PGT_writable_pred); + delete_shadow_status(d, gpfn_list[count], 0, PGT_writable_pred, 0); } xfree(gpfn_list); @@ -1021,8 +1057,8 @@ void __shadow_mode_disable(struct domain { if ( d->arch.shadow_ht[i].gpfn_and_flags != 0 ) { - printk("%s: d->arch.shadow_ht[%x].gpfn_and_flags=%lx\n", - __FILE__, i, d->arch.shadow_ht[i].gpfn_and_flags); + printk("%s: d->arch.shadow_ht[%x].gpfn_and_flags=%"PRIx64"\n", + __FILE__, i, (u64)d->arch.shadow_ht[i].gpfn_and_flags); BUG(); } } Index: 2006-06-20/xen/include/asm-x86/shadow.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/shadow.h 2006-06-22 08:59:23.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/shadow.h 2006-06-26 10:36:48.000000000 +0200 @@ -112,6 +112,22 @@ do { } while (0) #endif +#if defined(GUEST_32PAE) +static inline unsigned long get_cr3_idxval(struct vcpu *v) +{ + unsigned long pae_cr3 = hvm_get_guest_ctrl_reg(v, 3); /* get CR3 */ + + return (pae_cr3 >> PAE_CR3_ALIGN) & PAE_CR3_IDX_MASK; +} + +#define shadow_key_t u64 +#define index_to_key(x) ((u64)(x) << 32) +#else +#define get_cr3_idxval(v) (0) +#define shadow_key_t unsigned long +#define index_to_key(x) (0) +#endif + #define SHADOW_ENCODE_MIN_MAX(_min, _max) ((((GUEST_L1_PAGETABLE_ENTRIES - 1) - (_max)) << 16) | (_min)) #define SHADOW_MIN(_encoded) ((_encoded) & ((1u<<16) - 1)) #define SHADOW_MAX(_encoded) ((GUEST_L1_PAGETABLE_ENTRIES - 1) - ((_encoded) >> 16)) @@ -309,7 +333,7 @@ extern unsigned long get_mfn_from_gpfn_f struct shadow_status { struct shadow_status *next; /* Pull-to-front list per hash bucket. */ - unsigned long gpfn_and_flags; /* Guest pfn plus flags. */ + shadow_key_t gpfn_and_flags; /* Guest pfn plus flags. */ unsigned long smfn; /* Shadow mfn. */ }; @@ -1180,7 +1204,13 @@ static inline unsigned long __shadow_sta struct domain *d, unsigned long gpfn, unsigned long stype) { struct shadow_status *p, *x, *head; - unsigned long key = gpfn | stype; + shadow_key_t key; +#if CONFIG_PAGING_LEVELS >= 3 + if ( d->arch.ops->guest_paging_levels == PAGING_L3 && stype == PGT_l4_shadow ) + key = gpfn | stype | index_to_key(get_cr3_idxval(current)); + else +#endif + key = gpfn | stype; ASSERT(shadow_lock_is_acquired(d)); ASSERT(gpfn == (gpfn & PGT_mfn_mask)); @@ -1295,10 +1325,11 @@ shadow_max_pgtable_type(struct domain *d } static inline void delete_shadow_status( - struct domain *d, unsigned long gpfn, unsigned long gmfn, unsigned int stype) + struct domain *d, unsigned long gpfn, unsigned long gmfn, unsigned int stype, u64 index) { struct shadow_status *p, *x, *n, *head; - unsigned long key = gpfn | stype; + + shadow_key_t key = gpfn | stype | index_to_key(index); ASSERT(shadow_lock_is_acquired(d)); ASSERT(!(gpfn & ~PGT_mfn_mask)); @@ -1374,11 +1405,12 @@ static inline void delete_shadow_status( static inline void set_shadow_status( struct domain *d, unsigned long gpfn, unsigned long gmfn, - unsigned long smfn, unsigned long stype) + unsigned long smfn, unsigned long stype, u64 index) { struct shadow_status *x, *head, *extra; int i; - unsigned long key = gpfn | stype; + + shadow_key_t key = gpfn | stype | index_to_key(index); SH_VVLOG("set gpfn=%lx gmfn=%lx smfn=%lx t=%lx", gpfn, gmfn, smfn, stype); Index: 2006-06-20/xen/include/asm-x86/shadow_64.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/shadow_64.h 2006-04-06 17:50:27.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/shadow_64.h 2006-06-26 10:37:46.000000000 +0200 @@ -65,10 +65,6 @@ typedef struct { intpte_t l4; } l4_pgent #define ESH_LOG(_f, _a...) ((void)0) #endif -#define PAGING_L4 4UL -#define PAGING_L3 3UL -#define PAGING_L2 2UL -#define PAGING_L1 1UL #define L_MASK 0xff #define PAE_PAGING_LEVELS 3 @@ -108,9 +104,6 @@ typedef struct { intpte_t lo; } pgentry_ /* * The macro and inlines are for 32-bit PAE guest on 64-bit host */ -#define PAE_CR3_ALIGN 5 -#define PAE_CR3_IDX_MASK 0x7f -#define PAE_CR3_IDX_NO 128 /******************************************************************************/ static inline int table_offset_64(unsigned long va, int level) @@ -184,19 +178,10 @@ static inline int guest_table_offset_64( } } -static inline unsigned long get_cr3_idxval(struct vcpu *v) -{ - unsigned long pae_cr3 = hvm_get_guest_ctrl_reg(v, 3); /* get CR3 */ - - return (pae_cr3 >> PAE_CR3_ALIGN) & PAE_CR3_IDX_MASK; -} - - #define SH_GUEST_32PAE 1 #else #define guest_table_offset_64(va, level, index) \ table_offset_64((va),(level)) -#define get_cr3_idxval(v) 0 #define SH_GUEST_32PAE 0 #endif Index: 2006-06-20/xen/include/asm-x86/shadow_ops.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/shadow_ops.h 2006-04-06 17:50:27.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/shadow_ops.h 2006-06-26 10:36:48.000000000 +0200 @@ -22,6 +22,14 @@ #ifndef _XEN_SHADOW_OPS_H #define _XEN_SHADOW_OPS_H +#define PAGING_L4 4UL +#define PAGING_L3 3UL +#define PAGING_L2 2UL +#define PAGING_L1 1UL + +#define PAE_CR3_ALIGN 5 +#define PAE_CR3_IDX_MASK 0x7f + #if defined( GUEST_PGENTRY_32 ) #define GUEST_L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_32 ++++++ xen-3.0-testing-src.tar.bz2 ++++++ ++++ 4144 lines of diff (skipped) ++++++ xen-balloon.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,42 +1,294 @@ +From: Charles Coffing <ccoffing@novell.com> +Upstream: xen-unstable 10501, 10481 + +10501 Make the domain0 ballooning logic in xend aware of pages that are on the page scrub list +10481 Increases the retry limit to allow xend more time before issuing a balloon + + +Index: xen-3.0-testing/tools/python/xen/lowlevel/xc/xc.c +=================================================================== +--- xen-3.0-testing.orig/tools/python/xen/lowlevel/xc/xc.c ++++ xen-3.0-testing/tools/python/xen/lowlevel/xc/xc.c +@@ -582,6 +582,12 @@ static PyObject *pyxc_readconsolering(Xc + } + + ++static unsigned long pages_to_kib(unsigned long pages) ++{ ++ return pages * (XC_PAGE_SIZE / 1024); ++} ++ ++ + static PyObject *pyxc_pages_to_kib(XcObject *self, PyObject *args) + { + unsigned long pages; +@@ -589,13 +595,7 @@ static PyObject *pyxc_pages_to_kib(XcObj + if (!PyArg_ParseTuple(args, "l", &pages)) + return NULL; + +- return PyLong_FromUnsignedLong(pages * (XC_PAGE_SIZE / 1024)); +-} +- +- +-static unsigned long pages_to_mb(unsigned long pages) +-{ +- return (pages * (XC_PAGE_SIZE / 1024) + 1023) / 1024; ++ return PyLong_FromUnsignedLong(pages_to_kib(pages)); + } + + +@@ -618,13 +618,14 @@ static PyObject *pyxc_physinfo(XcObject + if(q>cpu_cap) + *(q-1)=0; + +- return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:i,s:s}", ++ return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s}", + "threads_per_core", info.threads_per_core, + "cores_per_socket", info.cores_per_socket, + "sockets_per_node", info.sockets_per_node, + "nr_nodes", info.nr_nodes, +- "total_memory", pages_to_mb(info.total_pages), +- "free_memory", pages_to_mb(info.free_pages), ++ "total_memory", pages_to_kib(info.total_pages), ++ "free_memory", pages_to_kib(info.free_pages), ++ "scrub_memory", pages_to_kib(info.scrub_pages), + "cpu_khz", info.cpu_khz, + "hw_caps", cpu_cap); + } Index: xen-3.0-testing/tools/python/xen/xend/balloon.py =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xend/balloon.py +++ xen-3.0-testing/tools/python/xen/xend/balloon.py -@@ -31,6 +31,9 @@ PROC_XEN_BALLOON = '/proc/xen/balloon' +@@ -29,9 +29,7 @@ from XendError import VmError + + PROC_XEN_BALLOON = '/proc/xen/balloon' - BALLOON_OUT_SLACK = 1 # MiB. We need this because the physinfo details are - # rounded. -+RETURN_OVERSHOOT = 16 # MiB. Overshooting the target free memory by less -+ # than this amount is okay; more than this is returned -+ # to domain 0 (other domains may have died, freeing mem.) - RETRY_LIMIT = 10 +-BALLOON_OUT_SLACK = 1 # MiB. We need this because the physinfo details are +- # rounded. +-RETRY_LIMIT = 10 ++RETRY_LIMIT = 20 RETRY_LIMIT_INCR = 5 ## -@@ -128,7 +131,7 @@ def free(required): + # The time to sleep between retries grows linearly, using this value (in +@@ -68,22 +66,22 @@ def _get_proc_balloon(label): + f.close() + + def get_dom0_current_alloc(): +- """Returns the current memory allocation (in MiB) of dom0.""" ++ """Returns the current memory allocation (in KiB) of dom0.""" + + kb = _get_proc_balloon(labels['current']) + if kb == None: + raise VmError('Failed to query current memory allocation of dom0.') +- return kb / 1024 ++ return kb + + def get_dom0_target_alloc(): +- """Returns the target memory allocation (in MiB) of dom0.""" ++ """Returns the target memory allocation (in KiB) of dom0.""" + + kb = _get_proc_balloon(labels['target']) + if kb == None: + raise VmError('Failed to query target memory allocation of dom0.') +- return kb / 1024 ++ return kb + +-def free(required): ++def free(need_mem): + """Balloon out memory from the privileged domain so that there is the + specified required amount (in KiB) free. + """ +@@ -92,9 +90,10 @@ def free(required): + # to balloon out to free some up. Memory freed by a destroyed domain may + # not appear in the free_memory field immediately, because it needs to be + # scrubbed before it can be released to the free list, which is done +- # asynchronously by Xen; ballooning is asynchronous also. No matter where +- # we expect the free memory to come from, therefore, we need to wait for +- # it to become available. ++ # asynchronously by Xen; ballooning is asynchronous also. Such memory ++ # does, however, need to be accounted for when calculating how much dom0 ++ # needs to balloon. No matter where we expect the free memory to come ++ # from, we need to wait for it to become available. + # + # We are not allowed to balloon below dom0_min_mem, or if dom0_min_mem + # is 0, we cannot balloon at all. Memory can still become available +@@ -108,43 +107,49 @@ def free(required): + # usage, so we recheck the required alloc each time around the loop, but + # track the last used value so that we don't trigger too many watches. + +- need_mem = (required + 1023) / 1024 + BALLOON_OUT_SLACK +- + xroot = XendRoot.instance() + xc = xen.lowlevel.xc.xc() + + try: +- dom0_min_mem = xroot.get_dom0_min_mem() ++ dom0_min_mem = xroot.get_dom0_min_mem() * 1024 retries = 0 sleep_time = SLEEP_TIME_GROWTH -- last_new_alloc = None -+ last_new_alloc = float('inf') + last_new_alloc = None rlimit = RETRY_LIMIT while retries < rlimit: - free_mem = xc.physinfo()['free_memory'] -@@ -148,7 +151,8 @@ def free(required): - new_alloc = dom0_alloc - (need_mem - free_mem) +- free_mem = xc.physinfo()['free_memory'] ++ physinfo = xc.physinfo() ++ free_mem = physinfo['free_memory'] ++ scrub_mem = physinfo['scrub_memory'] + + if free_mem >= need_mem: +- log.debug("Balloon: free %d; need %d; done.", free_mem, +- need_mem) ++ log.debug("Balloon: %d KiB free; need %d; done.", ++ free_mem, need_mem) + return - if (new_alloc >= dom0_min_mem and + if retries == 0: +- rlimit += ((need_mem - free_mem)/1024) * RETRY_LIMIT_INCR +- log.debug("Balloon: free %d; need %d; retries: %d.", +- free_mem, need_mem, rlimit) ++ rlimit += ((need_mem - free_mem)/1024/1024) * RETRY_LIMIT_INCR ++ log.debug("Balloon: %d KiB free; %d to scrub; need %d; retries: %d.", ++ free_mem, scrub_mem, need_mem, rlimit) + + if dom0_min_mem > 0: + dom0_alloc = get_dom0_current_alloc() +- new_alloc = dom0_alloc - (need_mem - free_mem) ++ new_alloc = dom0_alloc - (need_mem - free_mem - scrub_mem) + +- if (new_alloc >= dom0_min_mem and - new_alloc != last_new_alloc): -+ (new_alloc < last_new_alloc or -+ new_alloc > last_new_alloc + RETURN_OVERSHOOT)): - log.debug("Balloon: setting dom0 target to %d.", - new_alloc) - dom0 = XendDomain.instance().privilegedDomain() -@@ -162,7 +166,7 @@ def free(required): - retries += 1 +- log.debug("Balloon: setting dom0 target to %d.", +- new_alloc) +- dom0 = XendDomain.instance().privilegedDomain() +- dom0.setMemoryTarget(new_alloc) +- last_new_alloc = new_alloc +- # Continue to retry, waiting for ballooning. ++ if free_mem + scrub_mem >= need_mem: ++ if last_new_alloc == None: ++ log.debug("Balloon: waiting on scrubbing") ++ last_new_alloc = dom0_alloc ++ else: ++ if (new_alloc >= dom0_min_mem and ++ new_alloc != last_new_alloc): ++ new_alloc_mb = new_alloc / 1024 # Round down ++ log.debug("Balloon: setting dom0 target to %d MiB.", ++ new_alloc_mb) ++ dom0 = XendDomain.instance().privilegedDomain() ++ dom0.setMemoryTarget(new_alloc_mb) ++ last_new_alloc = new_alloc ++ # Continue to retry, waiting for ballooning or scrubbing. + time.sleep(sleep_time) + if retries < 2 * RETRY_LIMIT: +@@ -154,15 +159,15 @@ def free(required): # Not enough memory; diagnose the problem. -- if dom0_min_mem == 0: -+ if dom0_min_mem <= 0: + if dom0_min_mem == 0: raise VmError(('Not enough free memory and dom0_min_mem is 0, so ' - 'I cannot release any more. I need %d MiB but ' +- 'I cannot release any more. I need %d MiB but ' ++ 'I cannot release any more. I need %d KiB but ' 'only have %d.') % + (need_mem, free_mem)) + elif new_alloc < dom0_min_mem: + raise VmError( +- ('I need %d MiB, but dom0_min_mem is %d and shrinking to ' +- '%d MiB would leave only %d MiB free.') % ++ ('I need %d KiB, but dom0_min_mem is %d and shrinking to ' ++ '%d KiB would leave only %d KiB free.') % + (need_mem, dom0_min_mem, dom0_min_mem, +- free_mem + dom0_alloc - dom0_min_mem)) ++ free_mem + scrub_mem + dom0_alloc - dom0_min_mem)) + else: + raise VmError('The privileged domain did not balloon!') + +Index: xen-3.0-testing/xen/arch/x86/dom0_ops.c +=================================================================== +--- xen-3.0-testing.orig/xen/arch/x86/dom0_ops.c ++++ xen-3.0-testing/xen/arch/x86/dom0_ops.c +@@ -193,7 +193,10 @@ long arch_do_dom0_op(struct dom0_op *op, + + pi->nr_nodes = 1; + pi->total_pages = total_pages; ++// lock + pi->free_pages = avail_domheap_pages(); ++ pi->scrub_pages = avail_scrub_pages(); ++// unlock + pi->cpu_khz = cpu_khz; + memset(pi->hw_cap, 0, sizeof(pi->hw_cap)); + memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4); +Index: xen-3.0-testing/xen/include/public/dom0_ops.h +=================================================================== +--- xen-3.0-testing.orig/xen/include/public/dom0_ops.h ++++ xen-3.0-testing/xen/include/public/dom0_ops.h +@@ -218,6 +218,7 @@ typedef struct dom0_physinfo { + uint32_t cpu_khz; + uint64_t total_pages; + uint64_t free_pages; ++ uint64_t scrub_pages; + uint32_t hw_cap[8]; + } dom0_physinfo_t; + DEFINE_GUEST_HANDLE(dom0_physinfo_t); +Index: xen-3.0-testing/xen/common/page_alloc.c +=================================================================== +--- xen-3.0-testing.orig/xen/common/page_alloc.c ++++ xen-3.0-testing/xen/common/page_alloc.c +@@ -61,6 +61,7 @@ custom_param("lowmem_emergency_pool", pa + + static spinlock_t page_scrub_lock = SPIN_LOCK_UNLOCKED; + LIST_HEAD(page_scrub_list); ++static unsigned long scrub_pages; + + /********************* + * ALLOCATION BITMAP +@@ -696,6 +697,7 @@ void free_domheap_pages(struct page_info + { + spin_lock(&page_scrub_lock); + list_add(&pg[i].list, &page_scrub_list); ++ scrub_pages ++; + spin_unlock(&page_scrub_lock); + } + } +@@ -784,6 +786,7 @@ static void page_scrub_softirq(void) + /* Remove peeled pages from the list. */ + ent->next->prev = &page_scrub_list; + page_scrub_list.next = ent->next; ++ scrub_pages -= (i+1); + + spin_unlock(&page_scrub_lock); + +@@ -800,6 +803,11 @@ static void page_scrub_softirq(void) + } while ( (NOW() - start) < MILLISECS(1) ); + } + ++unsigned long avail_scrub_pages(void) ++{ ++ return scrub_pages; ++} ++ + static __init int page_scrub_init(void) + { + open_softirq(PAGE_SCRUB_SOFTIRQ, page_scrub_softirq); +Index: xen-3.0-testing/xen/include/xen/mm.h +=================================================================== +--- xen-3.0-testing.orig/xen/include/xen/mm.h ++++ xen-3.0-testing/xen/include/xen/mm.h +@@ -88,6 +88,7 @@ extern struct list_head page_scrub_list; + if ( !list_empty(&page_scrub_list) ) \ + raise_softirq(PAGE_SCRUB_SOFTIRQ); \ + } while ( 0 ) ++unsigned long avail_scrub_pages(void); + + #include <asm/mm.h> + +Index: xen-3.0-testing/tools/python/xen/xend/XendNode.py +=================================================================== +--- xen-3.0-testing.orig/tools/python/xen/xend/XendNode.py ++++ xen-3.0-testing/tools/python/xen/xend/XendNode.py +@@ -64,6 +64,8 @@ class XendNode: + info['cores_per_socket'] * + info['threads_per_core']) + info['cpu_mhz'] = info['cpu_khz'] / 1000 ++ info['total_memory'] = info['total_memory'] / 1024 ++ info['free_memory'] = info['free_memory'] / 1024 + + ITEM_ORDER = ['nr_cpus', + 'nr_nodes', ++++++ xen-bonding.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -2,7 +2,29 @@ =================================================================== --- xen-3.0-testing.orig/tools/examples/network-bridge +++ xen-3.0-testing/tools/examples/network-bridge -@@ -210,10 +210,11 @@ using loopback.nloopbacks=<N> on the dom +@@ -145,6 +145,21 @@ antispoofing () { + iptables -A FORWARD -m physdev --physdev-in ${vif0} -j ACCEPT + } + ++# Find the netdev that is associated with the bridge by matching MAC addresses. ++find_bridged_netdev () { ++ local bridge=$1 ++ ++ bmac=`ip link show ${bridge} | grep 'link\/ether' | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/'` ++ for i in `ls /sys/class/net/${bridge}/brif` ; do ++ mac=`ip link show ${i} | grep 'link\/ether' | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/'` ++ if [ "${bmac}" = "${mac}" ] && [ ! "${bridge}" = "${i}" ] ; then ++ netdev=${i} ++ return 0 ++ fi ++ done ++ return 1 ++} ++ + # Usage: show_status dev bridge + # Print ifconfig and routes. + show_status () { +@@ -187,10 +202,11 @@ using loopback.nloopbacks=<N> on the dom create_bridge ${bridge} @@ -16,20 +38,27 @@ transfer_addrs ${netdev} ${vdev} ifdown ${netdev} ip link set ${netdev} name ${pdev} -@@ -231,6 +232,9 @@ using loopback.nloopbacks=<N> on the dom +@@ -205,6 +221,13 @@ using loopback.nloopbacks=<N> on the dom + add_to_bridge2 ${bridge} ${pdev} + ip link set ${netdev} up ifup ${hwddev} - else - # old style without ${vdev} ++ elif [ "$BONDING_MASTER" = yes ]; then ++ ip link set ${bridge} arp on + add_to_bridge ${bridge} ${vif0} + ip link set ${vif0} up + add_to_bridge2 ${bridge} ${netdev} ++ transfer_addrs ${netdev} ${bridge} ++ transfer_routes ${netdev} ${bridge} + else + # old style without ${vdev} transfer_addrs ${netdev} ${bridge} - transfer_routes ${netdev} ${bridge} - fi -@@ -267,6 +271,7 @@ op_stop () { +@@ -243,6 +266,10 @@ op_stop () { ip link set ${pdev} name ${netdev} ifup ${netdev} else ++ if [ ${netdev} = ${bridge} ]; then ++ find_bridged_netdev ${bridge} ++ fi + ip link set dev ${vif0} down transfer_routes ${bridge} ${netdev} ip link set ${bridge} down ++++++ xen-config-defaults.diff ++++++ Index: xen-3.0-testing/tools/examples/init.d/sysconfig.xendomains =================================================================== --- xen-3.0-testing.orig/tools/examples/init.d/sysconfig.xendomains +++ xen-3.0-testing/tools/examples/init.d/sysconfig.xendomains @@ -111,7 +111,7 @@ XENDOMAINS_AUTO=/etc/xen/auto # all running domains will be. # Note that the name matching is somewhat fuzzy. # -XENDOMAINS_AUTO_ONLY=false +XENDOMAINS_AUTO_ONLY=true ## Type: integer ## Default: 300 Index: xen-3.0-testing/tools/examples/xend-config.sxp =================================================================== --- xen-3.0-testing.orig/tools/examples/xend-config.sxp +++ xen-3.0-testing/tools/examples/xend-config.sxp @@ -19,7 +19,6 @@ #(xend-tcp-xmlrpc-server no) #(xend-unix-xmlrpc-server yes) #(xend-relocation-server no) -(xend-relocation-server yes) #(xend-unix-path /var/lib/xend/xend-socket) @@ -54,7 +53,6 @@ # (xend-relocation-hosts-allow '^localhost$ ^.*\.example\.org$') # #(xend-relocation-hosts-allow '') -(xend-relocation-hosts-allow '^localhost$') # The limit (in kilobytes) on the size of the console buffer #(console-limit 1024) ++++++ xen-console.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -14,7 +14,7 @@ spinlock_t console_lock = SPIN_LOCK_UNLOCKED; -@@ -112,6 +113,25 @@ static int detect_vga(void) +@@ -112,6 +113,30 @@ static int detect_vga(void) detect_video(__va(0xB8000))); } @@ -22,25 +22,30 @@ +{ + unsigned char idx, data; + -+#if 0 -+ inb(0x3da); -+ outb(0x10, 0x3c0); -+ data = inb(0x3c1); -+ inb(0x3da); -+ outb(0x20, 0x3c0); -+#else + idx = inb(0x3ce); + outb(0x06, 0x3ce); + data = inb(0x3cf); + outb(idx, 0x3ce); -+#endif -+ return data & 0x01; ++ ++ if ( data & 0x01 ) ++ return 1; ++ ++ /* Unfortunately many cards don't reflect their mode in the GDC ++ * miscellaneous register, bit 0 (and even fewer reflect it in the ++ * ATC mode control register, bit 0). Therefore we further check ++ * horizontal display width against our original setting. */ ++ idx = inb(0x3d4); ++ outb(0x01, 0x3d4); ++ data = inb(0x3d5); ++ outb(idx, 0x3d4); ++ ++ return data != COLUMNS - 1; +} + /* This is actually code from vgaHWRestore in an old version of XFree86 :-) */ static void init_vga(void) { -@@ -191,12 +211,27 @@ static void put_newline(void) +@@ -191,14 +216,28 @@ static void put_newline(void) static void putchar_console(int c) { @@ -54,8 +59,6 @@ + case 2: + if ( vga_in_gfx < 0 ) + vga_in_gfx = gfx_vga(); -+ if ( vga_in_gfx ) -+ return; + break; + case 3: + return; @@ -63,12 +66,17 @@ + if ( c == '\n' ) { - put_newline(); +- put_newline(); ++ if ( vga_in_gfx <= 0 ) ++ put_newline(); + vga_in_gfx = -1; } - else +- else ++ else if ( vga_in_gfx <= 0 ) { -@@ -474,6 +509,10 @@ void init_console(void) + video[(xpos + ypos * COLUMNS) * 2] = c & 0xFF; + video[(xpos + ypos * COLUMNS) * 2 + 1] = ATTRIBUTE; +@@ -474,6 +513,10 @@ void init_console(void) sercon_handle = serial_parse_handle(p); else if ( strncmp(p, "vga", 3) == 0 ) vgacon_enabled = 1; @@ -79,10 +87,10 @@ } init_vga(); -@@ -500,8 +539,7 @@ void init_console(void) +@@ -529,8 +572,7 @@ void console_endboot(int disable_vga) + printk("\n"); + } - void console_endboot(int disable_vga) - { - if ( disable_vga ) - vgacon_enabled = 0; + yield_vgacon |= 2; ++++++ xen-fatal-trap-halt.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,4 +1,5 @@ -From: Jan Beulich +From: Jan Beulich <jbeulich@novell.com> +Upstream: xen-unstable 9564 Index: xen-3.0-testing/xen/arch/x86/traps.c =================================================================== ++++++ xen-hvm-auto-balloon.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,3 +1,10 @@ +Fix XenSource bug #521. +Partially accepted upstream. + +Also a partial work-around for #180133 - remove 4MB hack when shadow pt +code is overhauled. + + Index: xen-3.0-testing/tools/python/xen/xend/image.py =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xend/image.py ++++++ xen-hvm-memory-check.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -26,6 +26,44 @@ =================================================================== --- xen-3.0-testing.orig/xen/arch/x86/shadow32.c +++ xen-3.0-testing/xen/arch/x86/shadow32.c +@@ -217,25 +217,25 @@ alloc_shadow_page(struct domain *d, + // Currently, we only keep pre-zero'ed pages around for use as L1's... + // This will change. Soon. + // +- if ( psh_type == PGT_l1_shadow ) ++ int empty = list_empty(&d->arch.free_shadow_frames); ++ if ( psh_type == PGT_l1_shadow && !empty ) + { +- if ( !list_empty(&d->arch.free_shadow_frames) ) +- { +- struct list_head *entry = d->arch.free_shadow_frames.next; +- page = list_entry(entry, struct page_info, list); +- list_del(entry); +- perfc_decr(free_l1_pages); +- } +- else ++ struct list_head *entry = d->arch.free_shadow_frames.next; ++ page = list_entry(entry, struct page_info, list); ++ list_del(entry); ++ perfc_decr(free_l1_pages); ++ } ++ else ++ { ++ page = alloc_domheap_page(NULL); ++ ++ if ( empty && likely(page != NULL) ) + { +- page = alloc_domheap_page(NULL); + l1 = map_domain_page(page_to_mfn(page)); + memset(l1, 0, PAGE_SIZE); + unmap_domain_page(l1); + } + } +- else +- page = alloc_domheap_page(NULL); + + if ( unlikely(page == NULL) ) + { @@ -246,7 +246,8 @@ alloc_shadow_page(struct domain *d, perfc_value(shadow_l2_pages), perfc_value(hl2_table_pages), ++++++ xen-hvm-rep-movs.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,3 +1,6 @@ +From: Gerd Hoffman <kraxel@suse.de> +Upstream: Submitted 2006-05-18; need to re-submit + Index: xen-3.0-testing/xen/arch/x86/hvm/platform.c =================================================================== --- xen-3.0-testing.orig/xen/arch/x86/hvm/platform.c ++++++ xen-load-pae-bin-kernel.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,8 +1,12 @@ +From: Bruce Rogers <brogers@novell.com> +Upstream: Submitted upstream 2006-05-11; need to resubmit + + Index: xen-3.0-testing/tools/libxc/xg_private.h =================================================================== --- xen-3.0-testing.orig/tools/libxc/xg_private.h +++ xen-3.0-testing/tools/libxc/xg_private.h -@@ -127,7 +127,7 @@ do { +@@ -137,7 +137,7 @@ do { errno = __saved_errno; \ } while (0) @@ -11,7 +15,7 @@ struct domain_setup_info { unsigned long v_start; -@@ -137,7 +137,7 @@ struct domain_setup_info +@@ -147,7 +147,7 @@ struct domain_setup_info unsigned long v_kernentry; unsigned int load_symtab; @@ -24,7 +28,7 @@ =================================================================== --- xen-3.0-testing.orig/tools/libxc/xc_load_elf.c +++ xen-3.0-testing/tools/libxc/xc_load_elf.c -@@ -132,7 +132,13 @@ static int parseelfimage(const char *ima +@@ -131,7 +131,13 @@ static int parseelfimage(const char *ima return -EINVAL; } if ( (strstr(guestinfo, "PAE=yes") != NULL) ) ++++++ xen-localtime.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -47,7 +47,7 @@ ] ROUNDTRIPPING_CONFIG_ENTRIES += VM_CONFIG_PARAMS -@@ -1227,6 +1228,10 @@ class XendDomainInfo: +@@ -1206,6 +1207,10 @@ class XendDomainInfo: self.info['image'], self.info['device']) ++++++ xen-lost-mouse.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,3 +1,6 @@ +From: ? +Upstream: xen-unstable + Qemu was not releasing the mouse, so added sdl_grab_end. atexit was not being called, so don't do SIGKILL. But that caused a deadlock between qemu and xm, so qemu shouldn't ++++++ xen-max-free-mem.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -2,28 +2,46 @@ =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xend/XendNode.py +++ xen-3.0-testing/tools/python/xen/xend/XendNode.py -@@ -65,6 +65,16 @@ class XendNode: +@@ -64,8 +64,30 @@ class XendNode: + info['cores_per_socket'] * info['threads_per_core']) info['cpu_mhz'] = info['cpu_khz'] / 1000 - +- info['total_memory'] = info['total_memory'] / 1024 +- info['free_memory'] = info['free_memory'] / 1024 + import XendRoot + xroot = XendRoot.instance() -+ dom0_min_mem = xroot.get_dom0_min_mem() ++ dom0_min_mem = xroot.get_dom0_min_mem() * 1024 + from xen.xend.balloon import get_dom0_current_alloc + dom0_mem = get_dom0_current_alloc() + extra_mem = 0 + if dom0_min_mem > 0 and dom0_mem > dom0_min_mem: + extra_mem = dom0_mem - dom0_min_mem -+ info['max_free_memory'] = info['free_memory'] + extra_mem; ++ info['free_memory'] = info['free_memory'] + info['scrub_memory'] ++ info['max_free_memory'] = info['free_memory'] + extra_mem ++ ++ # Convert KiB to MiB, rounding down to be conservative ++ info['total_memory'] = info['total_memory'] / 1024 ++ info['free_memory'] = info['free_memory'] / 1024 ++ info['max_free_memory'] = info['max_free_memory'] / 1024 + ++ # FIXME: These are hard-coded to be the inverse of the getXenMemory ++ # functions in image.py. Find a cleaner way. ++ info['max_para_memory'] = info['max_free_memory'] - 4 ++ if info['max_para_memory'] < 0: ++ info['max_para_memory'] = 0 ++ info['max_hvm_memory'] = int((info['max_free_memory']-12) * (1-2.4/1024)) ++ if info['max_hvm_memory'] < 0: ++ info['max_hvm_memory'] = 0 + ITEM_ORDER = ['nr_cpus', 'nr_nodes', - 'sockets_per_node', -@@ -74,6 +84,7 @@ class XendNode: +@@ -76,6 +98,9 @@ class XendNode: 'hw_caps', 'total_memory', 'free_memory', + 'max_free_memory', ++ 'max_para_memory', ++ 'max_hvm_memory', ] return [[k, info[k]] for k in ITEM_ORDER] @@ -31,7 +49,7 @@ =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xend/balloon.py +++ xen-3.0-testing/tools/python/xen/xend/balloon.py -@@ -45,6 +45,7 @@ SLEEP_TIME_GROWTH = 0.1 +@@ -43,6 +43,7 @@ SLEEP_TIME_GROWTH = 0.1 # label actually shown in the PROC_XEN_BALLOON file. labels = { 'current' : 'Current allocation', 'target' : 'Requested target', @@ -39,27 +57,27 @@ 'low-balloon' : 'Low-mem balloon', 'high-balloon' : 'High-mem balloon', 'limit' : 'Xen hard limit' } -@@ -83,6 +84,15 @@ def get_dom0_target_alloc(): +@@ -81,6 +82,15 @@ def get_dom0_target_alloc(): raise VmError('Failed to query target memory allocation of dom0.') - return kb / 1024 + return kb +def get_dom0_max_target(): -+ """Returns the maximum amount of memory (in MiB) that is potentially visible -+ to dom0.""" ++ """Returns the maximum amount of memory (in KiB) that is potentially ++ visible to dom0.""" + + kb = _get_proc_balloon(labels['max-target']) + if kb == None: + raise VmError('Failed to query maximum target memory allocation of dom0.') -+ return kb / 1024 ++ return kb + - def free(required): + def free(need_mem): """Balloon out memory from the privileged domain so that there is the specified required amount (in KiB) free. Index: xen-3.0-testing/tools/python/xen/xend/XendDomainInfo.py =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py +++ xen-3.0-testing/tools/python/xen/xend/XendDomainInfo.py -@@ -940,6 +940,27 @@ class XendDomainInfo: +@@ -941,6 +941,27 @@ class XendDomainInfo: ## public: @@ -73,7 +91,7 @@ + if self.domid == 0: + try: + from balloon import get_dom0_max_target -+ max_target = get_dom0_max_target() ++ max_target = get_dom0_max_target() / 1024 + except: + # It's nice to cap the max at sane values, but harmless to set + # them high. Carry on. ++++++ xen-messages.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -18,3 +18,17 @@ def check_user(): """Check that the effective user id is 0 (root). +Index: xen-3.0-testing/tools/python/xen/xend/XendCheckpoint.py +=================================================================== +--- xen-3.0-testing.orig/tools/python/xen/xend/XendCheckpoint.py ++++ xen-3.0-testing/tools/python/xen/xend/XendCheckpoint.py +@@ -54,6 +54,9 @@ def read_exact(fd, size, errmsg): + + + def save(fd, dominfo, live): ++ if dominfo.readVm('image/ostype') == "hvm": ++ raise XendError("Save is not currently supported for fully virtualized guests") ++ + write_exact(fd, SIGNATURE, "could not write guest state file: signature") + + config = sxp.to_string(dominfo.sxpr()) ++++++ xen-migration-oops.diff ++++++ Bug #162865 Patch from john.l.byrne@hp.com Index: xen-3.0-testing/tools/libxc/xc_linux_save.c =================================================================== --- xen-3.0-testing.orig/tools/libxc/xc_linux_save.c +++ xen-3.0-testing/tools/libxc/xc_linux_save.c @@ -90,12 +90,12 @@ static inline int test_bit (int nr, vola static inline void clear_bit (int nr, volatile void * addr) { - BITMAP_ENTRY(nr, addr) &= ~(1 << BITMAP_SHIFT(nr)); + BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr)); } static inline void set_bit ( int nr, volatile void * addr) { - BITMAP_ENTRY(nr, addr) |= (1 << BITMAP_SHIFT(nr)); + BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr)); } /* Returns the hamming weight (i.e. the number of bits set) in a N-bit word */ @@ -979,6 +979,8 @@ int xc_linux_save(int xc_handle, int io_ if (pagetype >= L1TAB && pagetype <= L4TAB) { + /* Force page tables to be updated at end. */ + set_bit(pfn, to_fix); /* We have a pagetable page: need to rewrite it. */ canonicalize_pagetable(pagetype, pfn, spage, page); ++++++ xen-network-bridge.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -37,25 +37,37 @@ # Usage: transfer_addrs src dst # Copy all IP addresses (including aliases) from device $src to device $dst. transfer_addrs () { -@@ -156,7 +141,7 @@ create_bridge () { - local bridge=$1 +@@ -151,29 +136,6 @@ link_exists() + } + - # Don't create the bridge if it already exists. +-# Usage: create_bridge bridge +-create_bridge () { +- local bridge=$1 +- +- # Don't create the bridge if it already exists. - if ! brctl show | grep -q ${bridge} ; then -+ if [ ! -e "/sys/class/net/${bridge}/bridge" ]; then - brctl addbr ${bridge} - brctl stp ${bridge} off - brctl setfd ${bridge} 0 -@@ -169,7 +154,7 @@ add_to_bridge () { - local bridge=$1 - local dev=$2 - # Don't add $dev to $bridge if it's already on a bridge. +- brctl addbr ${bridge} +- brctl stp ${bridge} off +- brctl setfd ${bridge} 0 +- fi +- ip link set ${bridge} up +-} +- +-# Usage: add_to_bridge bridge dev +-add_to_bridge () { +- local bridge=$1 +- local dev=$2 +- # Don't add $dev to $bridge if it's already on a bridge. - if ! brctl show | grep -q ${dev} ; then -+ if [ ! -e "/sys/class/net/${bridge}/brif/${dev}" ]; then - brctl addif ${bridge} ${dev} - fi - } -@@ -227,14 +212,10 @@ using loopback.nloopbacks=<N> on the dom +- brctl addif ${bridge} ${dev} +- fi +-} +- + # Set the default forwarding policy for $dev to drop. + # Allow forwarding to the bridge. + antispoofing () { +@@ -227,26 +189,22 @@ using loopback.nloopbacks=<N> on the dom if link_exists "$vdev"; then mac=`ip link show ${netdev} | grep 'link\/ether' | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/'` @@ -72,10 +84,19 @@ + ifdown ${netdev} ip link set ${netdev} name ${pdev} ip link set ${vdev} name ${netdev} - ip link set ${pdev} down arp off -@@ -246,7 +227,8 @@ using loopback.nloopbacks=<N> on the dom - ip link set ${vif0} up - ip link set ${pdev} up +- ip link set ${pdev} down arp off +- ip link set ${pdev} addr fe:ff:ff:ff:ff:ff +- ip addr flush ${pdev} ++ ++ setup_bridge_port ${pdev} ++ setup_bridge_port ${vif0} + ip link set ${netdev} addr ${mac} arp on +- add_to_bridge ${bridge} ${vif0} ++ + ip link set ${bridge} up +- ip link set ${vif0} up +- ip link set ${pdev} up ++ add_to_bridge ${bridge} ${vif0} add_to_bridge2 ${bridge} ${pdev} - do_ifup ${netdev} + ip link set ${netdev} up @@ -83,7 +104,7 @@ else # old style without ${vdev} transfer_addrs ${netdev} ${bridge} -@@ -270,9 +252,7 @@ op_stop () { +@@ -270,9 +228,7 @@ op_stop () { ip link set dev ${vif0} down mac=`ip link show ${netdev} | grep 'link\/ether' | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/'` transfer_addrs ${netdev} ${pdev} @@ -94,7 +115,7 @@ ip link set ${netdev} down arp off ip link set ${netdev} addr fe:ff:ff:ff:ff:ff ip link set ${pdev} down -@@ -285,7 +265,7 @@ op_stop () { +@@ -285,7 +241,7 @@ op_stop () { ip link set ${netdev} name ${vdev} ip link set ${pdev} name ${netdev} @@ -103,6 +124,14 @@ else transfer_routes ${bridge} ${netdev} ip link set ${bridge} down +@@ -300,6 +256,7 @@ add_to_bridge2() { + local maxtries=10 + + echo -n "Waiting for ${dev} to negotiate link." ++ ip link set ${dev} up + for i in `seq ${maxtries}` ; do + if ifconfig ${dev} | grep -q RUNNING ; then + break Index: xen-3.0-testing/tools/examples/xen-network-common.sh =================================================================== --- xen-3.0-testing.orig/tools/examples/xen-network-common.sh @@ -213,3 +242,75 @@ } +@@ -104,3 +67,48 @@ find_dhcpd_init_file() + { + first_file -x /etc/init.d/{dhcp3-server,dhcp,dhcpd} + } ++ ++# configure interfaces which act as pure bridge ports: ++# - make quiet: no arp, no multicast (ipv6 autoconf) ++# - set mac address to fe:ff:ff:ff:ff:ff ++setup_bridge_port() { ++ local dev="$1" ++ ++ # take interface down ... ++ ip link set ${dev} down ++ ++ # ... and configure it ++ ip link set ${dev} arp off ++ ip link set ${dev} multicast off ++ ip link set ${dev} addr fe:ff:ff:ff:ff:ff ++ ip addr flush ${dev} 2>&1 > /dev/null ++} ++ ++# Usage: create_bridge bridge ++create_bridge () { ++ local bridge=$1 ++ ++ # Don't create the bridge if it already exists. ++ if [ ! -e "/sys/class/net/${bridge}/bridge" ]; then ++ brctl addbr ${bridge} ++ brctl stp ${bridge} off ++ brctl setfd ${bridge} 0 ++ fi ++ ip link set ${bridge} arp off ++ ip link set ${bridge} multicast off ++ ip link set ${bridge} up ++} ++ ++# Usage: add_to_bridge bridge dev ++add_to_bridge () { ++ local bridge=$1 ++ local dev=$2 ++ ++ # Don't add $dev to $bridge if it's already on a bridge. ++ if [ -e "/sys/class/net/${bridge}/brif/${dev}" ]; then ++ return ++ fi ++ brctl addif ${bridge} ${dev} ++ ip link set ${dev} up ++} ++ +Index: xen-3.0-testing/tools/examples/vif-bridge +=================================================================== +--- xen-3.0-testing.orig/tools/examples/vif-bridge ++++ xen-3.0-testing/tools/examples/vif-bridge +@@ -48,16 +48,8 @@ fi + + case "$command" in + online) +- if brctl show | grep -q "$vif" +- then +- log debug "$vif already attached to a bridge" +- exit 0 +- fi +- +- brctl addif "$bridge" "$vif" || +- fatal "brctl addif $bridge $vif failed" +- +- ifconfig "$vif" up || fatal "ifconfig $vif up failed" ++ setup_bridge_port "$vif" ++ add_to_bridge "$bridge" "$vif" + ;; + + offline) ++++++ xen-no-incdec-writable-pte-prediction.patch ++++++ Index: 2006-06-20/xen/arch/x86/shadow.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow.c 2006-06-26 11:50:53.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow.c 2006-06-26 11:52:16.000000000 +0200 @@ -1322,48 +1322,6 @@ predict_writable_pte_page(struct domain return __shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), PGT_writable_pred); } -static inline void -increase_writable_pte_prediction(struct domain *d, unsigned long gpfn, unsigned long prediction) -{ - unsigned long score = prediction & PGT_score_mask; - int create = (score == 0); - - // saturating addition - score = (score + (1u << PGT_score_shift)) & PGT_score_mask; - score = score ? score : PGT_score_mask; - - prediction = (prediction & PGT_mfn_mask) | score; - - //printk("increase gpfn=%lx pred=%lx create=%d\n", gpfn, prediction, create); - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); - - if ( create ) - perfc_incr(writable_pte_predictions); -} - -static inline void -decrease_writable_pte_prediction(struct domain *d, unsigned long gpfn, unsigned long prediction) -{ - unsigned long score = prediction & PGT_score_mask; - ASSERT(score); - - // divide score by 2... We don't like bad predictions. - // - score = (score >> 1) & PGT_score_mask; - - prediction = (prediction & PGT_mfn_mask) | score; - - //printk("decrease gpfn=%lx pred=%lx score=%lx\n", gpfn, prediction, score); - - if ( score ) - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); - else - { - delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred, 0); - perfc_decr(writable_pte_predictions); - } -} - static int fix_entry( struct domain *d, l1_pgentry_t *pt, u32 *found, int is_l1_shadow, u32 max_refs_to_find) Index: 2006-06-20/xen/arch/x86/shadow32.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow32.c 2006-06-26 11:50:53.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow32.c 2006-06-26 11:52:23.000000000 +0200 @@ -2299,48 +2299,6 @@ predict_writable_pte_page(struct domain return __shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), PGT_writable_pred); } -static inline void -increase_writable_pte_prediction(struct domain *d, unsigned long gpfn, unsigned long prediction) -{ - unsigned long score = prediction & PGT_score_mask; - int create = (score == 0); - - // saturating addition - score = (score + (1u << PGT_score_shift)) & PGT_score_mask; - score = score ? score : PGT_score_mask; - - prediction = (prediction & PGT_mfn_mask) | score; - - //printk("increase gpfn=%lx pred=%lx create=%d\n", gpfn, prediction, create); - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); - - if ( create ) - perfc_incr(writable_pte_predictions); -} - -static inline void -decrease_writable_pte_prediction(struct domain *d, unsigned long gpfn, unsigned long prediction) -{ - unsigned long score = prediction & PGT_score_mask; - ASSERT(score); - - // divide score by 2... We don't like bad predictions. - // - score = (score >> 1) & PGT_score_mask; - - prediction = (prediction & PGT_mfn_mask) | score; - - //printk("decrease gpfn=%lx pred=%lx score=%lx\n", gpfn, prediction, score); - - if ( score ) - set_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, prediction, PGT_writable_pred, 0); - else - { - delete_shadow_status(d, GPFN_TO_GPTEPAGE(gpfn), 0, PGT_writable_pred, 0); - perfc_decr(writable_pte_predictions); - } -} - static void free_writable_pte_predictions(struct domain *d) { ++++++ xen-no-pgt-high-mfn.patch ++++++ Index: 2006-06-20/xen/arch/x86/shadow.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow.c 2006-06-26 12:03:45.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow.c 2006-06-26 12:08:16.000000000 +0200 @@ -3541,7 +3541,7 @@ static inline int l2e_rw_fault( if (l2e_get_flags(gl2e) & _PAGE_NX) { l2e_remove_flags(tmp_l2e, _PAGE_NX); #ifdef __x86_64__ - nx = PGT_high_mfn_nx; + nx = PGT_nx; #endif } Index: 2006-06-20/xen/include/asm-x86/mm.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/mm.h 2006-06-26 12:03:10.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/mm.h 2006-06-26 12:16:46.000000000 +0200 @@ -99,15 +99,13 @@ struct page_info #define PGT_count_mask ((1U<<16)-1) #ifdef __x86_64__ -#define PGT_high_mfn_shift 52 -#define PGT_high_mfn_mask (0xfffUL << PGT_high_mfn_shift) -#define PGT_mfn_mask (((1U<<23)-1) | PGT_high_mfn_mask) -#define PGT_high_mfn_nx (0x800UL << PGT_high_mfn_shift) +#define PGT_mfn_mask ((1UL<<23)-1) +#define PGT_nx (1UL<<63) #else /* 23-bit mfn mask for shadow types: good for up to 32GB RAM. */ #define PGT_mfn_mask ((1U<<23)-1) /* NX for PAE xen is not supported yet */ -#define PGT_high_mfn_nx (1ULL << 63) +#define PGT_nx (1ULL<<63) #endif #define _PGT_xen_l2 26 ++++++ xen-no-pgt-score.patch ++++++ Index: 2006-06-20/xen/arch/x86/shadow.c =================================================================== --- 2006-06-20.orig/xen/arch/x86/shadow.c 2006-06-26 11:52:16.000000000 +0200 +++ 2006-06-20/xen/arch/x86/shadow.c 2006-06-26 12:03:45.000000000 +0200 @@ -3177,10 +3177,9 @@ static unsigned long shadow_l3_table( /* * When we free L2 pages, we need to tell if the page contains - * Xen private mappings. Use the va_mask part. + * Xen private mappings. */ - mfn_to_page(s2mfn)->u.inuse.type_info |= - (unsigned long) 3 << PGT_score_shift; + mfn_to_page(s2mfn)->u.inuse.type_info |= PGT_xen_l2; memset(spl2e, 0, (L2_PAGETABLE_FIRST_XEN_SLOT & (L2_PAGETABLE_ENTRIES-1)) * sizeof(l2_pgentry_t)); Index: 2006-06-20/xen/include/asm-x86/mm.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/mm.h 2006-06-26 11:49:50.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/mm.h 2006-06-26 12:03:10.000000000 +0200 @@ -110,8 +110,8 @@ struct page_info #define PGT_high_mfn_nx (1ULL << 63) #endif -#define PGT_score_shift 23 -#define PGT_score_mask (((1U<<4)-1)<<PGT_score_shift) +#define _PGT_xen_l2 26 +#define PGT_xen_l2 (1U<<_PGT_xen_l2) /* Cleared when the owning guest 'frees' this page. */ #define _PGC_allocated 31 Index: 2006-06-20/xen/include/asm-x86/shadow.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/shadow.h 2006-06-26 11:50:53.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/shadow.h 2006-06-26 12:02:30.000000000 +0200 @@ -174,7 +174,7 @@ extern void shadow_l2_normal_pt_update(s * Use the score area for for now. */ #define is_xen_l2_slot(t,s) \ - ( ((((t) & PGT_score_mask) >> PGT_score_shift) == 3) && \ + ( ((t) & PGT_xen_l2) && \ ((s) >= (L2_PAGETABLE_FIRST_XEN_SLOT & (L2_PAGETABLE_ENTRIES - 1))) ) extern unsigned long gva_to_gpa(unsigned long gva); ++++++ xen-removable.diff ++++++ ++++ 909 lines (skipped) ++++ between arch/i386/xen/xen-removable.diff ++++ and xen/xen-removable.diff ++++++ xen-shadow-pae.patch ++++++ ++++ 921 lines (skipped) ++++++ xen-wider-mfn.patch ++++++ Index: 2006-06-20/xen/include/asm-x86/mm.h =================================================================== --- 2006-06-20.orig/xen/include/asm-x86/mm.h 2006-06-26 12:16:46.000000000 +0200 +++ 2006-06-20/xen/include/asm-x86/mm.h 2006-06-26 13:45:44.000000000 +0200 @@ -71,45 +71,51 @@ struct page_info #define PGT_fl1_shadow (5U<<29) #define PGT_type_mask (7U<<29) /* Bits 29-31. */ - /* Has this page been validated for use as its current type? */ -#define _PGT_validated 28 -#define PGT_validated (1U<<_PGT_validated) - /* Owning guest has pinned this page to its current type? */ -#define _PGT_pinned 27 -#define PGT_pinned (1U<<_PGT_pinned) #if defined(__i386__) /* The 11 most significant bits of virt address if this is a page table. */ #define PGT_va_shift 16 -#define PGT_va_mask (((1U<<11)-1)<<PGT_va_shift) - /* Is the back pointer still mutable (i.e. not fixed yet)? */ -#define PGT_va_mutable (((1U<<11)-1)<<PGT_va_shift) - /* Is the back pointer unknown (e.g., p.t. is mapped at multiple VAs)? */ -#define PGT_va_unknown (((1U<<11)-2)<<PGT_va_shift) +#define _PGT_va_bits 11 #elif defined(__x86_64__) /* The 27 most significant bits of virt address if this is a page table. */ #define PGT_va_shift 32 -#define PGT_va_mask ((unsigned long)((1U<<28)-1)<<PGT_va_shift) - /* Is the back pointer still mutable (i.e. not fixed yet)? */ -#define PGT_va_mutable ((unsigned long)((1U<<28)-1)<<PGT_va_shift) - /* Is the back pointer unknown (e.g., p.t. is mapped at multiple VAs)? */ -#define PGT_va_unknown ((unsigned long)((1U<<28)-2)<<PGT_va_shift) +#define _PGT_va_bits 27 #endif /* 16-bit count of uses of this frame as its current type. */ #define PGT_count_mask ((1U<<16)-1) #ifdef __x86_64__ -#define PGT_mfn_mask ((1UL<<23)-1) + /* 28-bit mfn mask for shadow types: good for up to 1TB RAM. */ +#define _PGT_mfn_bits 28 +#define _PGT_validated 28 + /* bits 59 and 60 available */ +#define _PGT_pinned 61 +#define _PGT_xen_l2 62 #define PGT_nx (1UL<<63) #else - /* 23-bit mfn mask for shadow types: good for up to 32GB RAM. */ -#define PGT_mfn_mask ((1U<<23)-1) + /* 24-bit mfn mask for shadow types: good for up to 64GB RAM. */ +#define _PGT_mfn_bits 24 + /* bits 24 and 25 available */ +#define _PGT_xen_l2 26 +#define _PGT_pinned 27 +#define _PGT_validated 28 /* NX for PAE xen is not supported yet */ #define PGT_nx (1ULL<<63) #endif -#define _PGT_xen_l2 26 -#define PGT_xen_l2 (1U<<_PGT_xen_l2) + /* Has this page been validated for use as its current type? */ +#define PGT_validated (1UL<<_PGT_validated) + /* Owning guest has pinned this page to its current type? */ +#define PGT_pinned (1UL<<_PGT_pinned) + +#define PGT_va_mask (((1UL<<_PGT_va_bits)-1)<<PGT_va_shift) + /* Is the back pointer still mutable (i.e. not fixed yet)? */ +#define PGT_va_mutable PGT_va_mask + /* Is the back pointer unknown (e.g., p.t. is mapped at multiple VAs)? */ +#define PGT_va_unknown (PGT_va_mutable-(1UL<<PGT_va_shift)) + +#define PGT_mfn_mask ((1UL<<_PGT_mfn_bits)-1) +#define PGT_xen_l2 (1UL<<_PGT_xen_l2) /* Cleared when the owning guest 'frees' this page. */ #define _PGC_allocated 31 ++++++ xen-xm-top-needs-root.diff ++++++ --- /var/tmp/diff_new_pack.cLjS9M/_old 2006-07-13 17:06:35.000000000 +0200 +++ /var/tmp/diff_new_pack.cLjS9M/_new 2006-07-13 17:06:35.000000000 +0200 @@ -1,3 +1,6 @@ +From: Charles Coffing <ccoffing@novell.com> +Upstream: no + Index: xen-3.0-testing/tools/python/xen/xm/main.py =================================================================== --- xen-3.0-testing.orig/tools/python/xen/xm/main.py ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit-unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit-help@opensuse.org