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

[Xen-changelog] [xen-unstable] merge with xen-unstable.hg



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 3bed37b2c599c74ba3ca9f90f5e948f13b3b2891
# Parent  5791030e6473138d37ce346a84859d1921b47a86
# Parent  7acaba46e15edc6a07613c833097f662da351552
merge with xen-unstable.hg
---
 docs/man/xm.pod.1                                        |    7 
 docs/src/user.tex                                        |   64 ++++--
 linux-2.6-xen-sparse/drivers/xen/console/console.c       |   20 +-
 linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c  |   18 +
 linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c        |    8 
 tools/blktap/drivers/block-qcow.c                        |   29 ++
 tools/blktap/drivers/tapdisk.c                           |   23 --
 tools/console/client/main.c                              |    3 
 tools/examples/vtpm-common.sh                            |    5 
 tools/examples/vtpm-impl                                 |    3 
 tools/python/xen/xend/XendDomain.py                      |    4 
 tools/python/xen/xend/XendDomainInfo.py                  |   60 ++++--
 tools/python/xen/xend/image.py                           |   45 +++-
 tools/python/xen/xend/server/pciquirk.py                 |    2 
 tools/python/xen/xm/create.py                            |    3 
 tools/python/xen/xm/tests/test_create.py                 |    4 
 tools/xenmon/xenmon.py                                   |    3 
 unmodified_drivers/linux-2.6/platform-pci/platform-pci.c |   32 +--
 xen/arch/x86/mm/shadow/multi.c                           |    6 
 xen/common/grant_table.c                                 |  148 +++++++--------
 xen/include/asm-x86/bitops.h                             |   57 ++---
 21 files changed, 345 insertions(+), 199 deletions(-)

diff -r 5791030e6473 -r 3bed37b2c599 docs/man/xm.pod.1
--- a/docs/man/xm.pod.1 Sun Sep 10 14:31:54 2006 -0600
+++ b/docs/man/xm.pod.1 Sun Sep 10 14:52:57 2006 -0600
@@ -432,7 +432,6 @@ Sample xen domain info looks as follows 
 Sample xen domain info looks as follows (lines wrapped manually to
 make the man page more readable):
 
- system                 : Linux
  host                   : talon
  release                : 2.6.12.6-xen0
  version                : #1 Mon Nov 14 14:26:26 EST 2005
@@ -444,13 +443,14 @@ make the man page more readable):
  threads_per_core       : 1
  cpu_mhz                : 696
  hw_caps                : 0383fbff:00000000:00000000:00000040
- memory                 : 767
+ total_memory           : 767
  free_memory            : 37
  xen_major              : 3
  xen_minor              : 0
  xen_extra              : -devel
  xen_caps               : xen-3.0-x86_32
- xen_params             : virt_start=0xfc000000
+ xen_pagesize           : 4096
+ platform_params        : virt_start=0xfc000000
  xen_changeset          : Mon Nov 14 18:13:38 2005 +0100 
                           7793:090e44133d40
  cc_compiler            : gcc version 3.4.3 (Mandrakelinux 
@@ -458,6 +458,7 @@ make the man page more readable):
  cc_compile_by          : sdague
  cc_compile_domain      : (none)
  cc_compile_date        : Mon Nov 14 14:16:48 EST 2005
+ xend_config_format     : 2
 
 B<FIELDS>
 
diff -r 5791030e6473 -r 3bed37b2c599 docs/src/user.tex
--- a/docs/src/user.tex Sun Sep 10 14:31:54 2006 -0600
+++ b/docs/src/user.tex Sun Sep 10 14:52:57 2006 -0600
@@ -1654,26 +1654,58 @@ Now unmount (this is important!):
 
 In the configuration file set:
 \begin{quote}
+  \verb_disk = ['tap:aio:/full/path/to/vm1disk,sda1,w']_
+\end{quote}
+
+As the virtual machine writes to its `disk', the sparse file will be
+filled in and consume more space up to the original 2GB.
+
+{\em{Note:}} Users that have worked with file-backed VBDs on Xen in previous
+versions will be interested to know that this support is now provided through
+the blktap driver instead of the loopback driver.  This change results in
+file-based block devices that are higher-performance, more scalable, and which
+provide better safety properties for VBD data.  All that is required to update
+your existing file-backed VM configurations is to change VBD configuration
+lines from:
+\begin{quote}
   \verb_disk = ['file:/full/path/to/vm1disk,sda1,w']_
 \end{quote}
-
-As the virtual machine writes to its `disk', the sparse file will be
-filled in and consume more space up to the original 2GB.
-
-{\bf Note that file-backed VBDs may not be appropriate for backing
-  I/O-intensive domains.}  File-backed VBDs are known to experience
+to:
+\begin{quote}
+  \verb_disk = ['tap:aio:/full/path/to/vm1disk,sda1,w']_
+\end{quote}
+
+
+\subsection{Loopback-mounted file-backed VBDs (deprecated)}
+
+{\em{{\bf{Note:}} Loopback mounted VBDs have now been replaced with
+    blktap-based support for raw image files, as described above.  This
+    section remains to detail a configuration that was used by older Xen
+    versions.}}
+
+Raw image file-backed VBDs amy also be attached to VMs using the 
+Linux loopback driver.  The only required change to the raw file 
+instructions above are to specify the configuration entry as:
+\begin{quote}
+  \verb_disk = ['file:/full/path/to/vm1disk,sda1,w']_
+\end{quote}
+
+{\bf Note that loopback file-backed VBDs may not be appropriate for backing
+  I/O-intensive domains.}  This approach is known to experience
 substantial slowdowns under heavy I/O workloads, due to the I/O
 handling by the loopback block device used to support file-backed VBDs
-in dom0.  Better I/O performance can be achieved by using either
-LVM-backed VBDs (Section~\ref{s:using-lvm-backed-vbds}) or physical
-devices as VBDs (Section~\ref{s:exporting-physical-devices-as-vbds}).
-
-Linux supports a maximum of eight file-backed VBDs across all domains
-by default.  This limit can be statically increased by using the
-\emph{max\_loop} module parameter if CONFIG\_BLK\_DEV\_LOOP is
-compiled as a module in the dom0 kernel, or by using the
-\emph{max\_loop=n} boot option if CONFIG\_BLK\_DEV\_LOOP is compiled
-directly into the dom0 kernel.
+in dom0.  Loopbach support remains for old Xen installations, and users
+are strongly encouraged to use the blktap-based file support (using 
+``{\tt{tap:aio}}'' as described above).
+
+Additionally, Linux supports a maximum of eight loopback file-backed 
+VBDs across all domains by default.  This limit can be statically 
+increased by using the \emph{max\_loop} module parameter if 
+CONFIG\_BLK\_DEV\_LOOP is compiled as a module in the dom0 kernel, or 
+by using the \emph{max\_loop=n} boot option if CONFIG\_BLK\_DEV\_LOOP 
+is compiled directly into the dom0 kernel.  Again, users are encouraged
+to use the blktap-based file support described above which scales to much 
+larger number of active VBDs.
 
 
 \section{Using LVM-backed VBDs}
diff -r 5791030e6473 -r 3bed37b2c599 
linux-2.6-xen-sparse/drivers/xen/console/console.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/console.c        Sun Sep 10 
14:31:54 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c        Sun Sep 10 
14:52:57 2006 -0600
@@ -182,17 +182,18 @@ static struct console kcons_info = {
        .index  = -1,
 };
 
-#define __RETCODE 0
 static int __init xen_console_init(void)
 {
        if (!is_running_on_xen())
-               return __RETCODE;
+               goto out;
 
        if (is_initial_xendomain()) {
                if (xc_mode == XC_DEFAULT)
                        xc_mode = XC_SERIAL;
                kcons_info.write = kcons_write_dom0;
        } else {
+               if (!xen_start_info->console.domU.evtchn)
+                       goto out;
                if (xc_mode == XC_DEFAULT)
                        xc_mode = XC_TTY;
                kcons_info.write = kcons_write;
@@ -212,14 +213,15 @@ static int __init xen_console_init(void)
                break;
 
        default:
-               return __RETCODE;
+               goto out;
        }
 
        wbuf = alloc_bootmem(wbuf_size);
 
        register_console(&kcons_info);
 
-       return __RETCODE;
+ out:
+       return 0;
 }
 console_initcall(xen_console_init);
 
@@ -247,7 +249,9 @@ void xencons_force_flush(void)
        int sz;
 
        /* Emergency console is synchronous, so there's nothing to flush. */
-       if (is_initial_xendomain())
+       if (!is_running_on_xen() ||
+           is_initial_xendomain() ||
+           !xen_start_info->console.domU.evtchn)
                return;
 
        /* Spin until console data is flushed through to the daemon. */
@@ -582,7 +586,11 @@ static int __init xencons_init(void)
        if (xc_mode == XC_OFF)
                return 0;
 
-       xencons_ring_init();
+       if (!is_initial_xendomain()) {
+               rc = xencons_ring_init();
+               if (rc)
+                       return rc;
+       }
 
        xencons_driver = alloc_tty_driver((xc_mode == XC_SERIAL) ?
                                          1 : MAX_NR_CONSOLES);
diff -r 5791030e6473 -r 3bed37b2c599 
linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c
--- a/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Sun Sep 10 
14:31:54 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/console/xencons_ring.c   Sun Sep 10 
14:52:57 2006 -0600
@@ -110,24 +110,26 @@ static irqreturn_t handle_input(int irq,
 
 int xencons_ring_init(void)
 {
-       int err;
+       int irq;
 
        if (xencons_irq)
                unbind_from_irqhandler(xencons_irq, NULL);
        xencons_irq = 0;
 
-       if (!xen_start_info->console.domU.evtchn)
-               return 0;
+       if (!is_running_on_xen() ||
+           is_initial_xendomain() ||
+           !xen_start_info->console.domU.evtchn)
+               return -ENODEV;
 
-       err = bind_evtchn_to_irqhandler(
+       irq = bind_evtchn_to_irqhandler(
                xen_start_info->console.domU.evtchn,
                handle_input, 0, "xencons", NULL);
-       if (err <= 0) {
-               printk(KERN_ERR "XEN console request irq failed %i\n", err);
-               return err;
+       if (irq < 0) {
+               printk(KERN_ERR "XEN console request irq failed %i\n", irq);
+               return irq;
        }
 
-       xencons_irq = err;
+       xencons_irq = irq;
 
        /* In case we have in-flight data after save/restore... */
        notify_daemon();
diff -r 5791030e6473 -r 3bed37b2c599 
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Sun Sep 10 14:31:54 
2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c Sun Sep 10 14:52:57 
2006 -0600
@@ -427,6 +427,14 @@ static int connect_rings(struct backend_
                be->netif->dev->features |= NETIF_F_TSO;
        }
 
+       if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
+                        "%d", &val) < 0)
+               val = 0;
+       if (val) {
+               be->netif->features &= ~NETIF_F_IP_CSUM;
+               be->netif->dev->features &= ~NETIF_F_IP_CSUM;
+       }
+
        /* Map the shared frame, irq etc. */
        err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
        if (err) {
diff -r 5791030e6473 -r 3bed37b2c599 tools/blktap/drivers/block-qcow.c
--- a/tools/blktap/drivers/block-qcow.c Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/blktap/drivers/block-qcow.c Sun Sep 10 14:52:57 2006 -0600
@@ -235,6 +235,25 @@ static uint32_t gen_cksum(char *ptr, int
        memcpy(&ret, md, sizeof(uint32_t));
        free(md);
        return ret;
+}
+
+static int get_filesize(char *filename, uint64_t *size, struct stat *st)
+{
+       int blockfd;
+
+       /*Set to the backing file size*/
+       if(S_ISBLK(st->st_mode)) {
+               blockfd = open(filename, O_RDONLY);
+               if (blockfd < 0)
+                       return -1;
+               if (ioctl(blockfd,BLKGETSIZE,size)!=0) {
+                       printf("Unable to get Block device size\n");
+                       close(blockfd);
+                       return -1;
+               }
+               close(blockfd);
+       } else *size = (st->st_size >> SECTOR_SHIFT);   
+       return 0;
 }
 
 static int qcow_set_key(struct td_state *bs, const char *key)
@@ -1204,12 +1223,14 @@ int qcow_create(const char *filename, ui
                        header_size += backing_filename_len;
                        
                        /*Set to the backing file size*/
-                       size = (st.st_size >> SECTOR_SHIFT);
+                       if(get_filesize(backing_filename, &size, &st)) {
+                               return -1;
+                       }
                        DPRINTF("Backing file size detected: %lld sectors" 
                                "(total %lld [%lld MB])\n", 
-                               (long long)total_size, 
-                               (long long)(total_size << SECTOR_SHIFT), 
-                               (long long)(total_size >> 11));
+                               (long long)size, 
+                               (long long)(size << SECTOR_SHIFT), 
+                               (long long)(size >> 11));
                } else {
                        backing_file = NULL;
                        DPRINTF("Setting file size: %lld (total %lld)\n", 
diff -r 5791030e6473 -r 3bed37b2c599 tools/blktap/drivers/tapdisk.c
--- a/tools/blktap/drivers/tapdisk.c    Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/blktap/drivers/tapdisk.c    Sun Sep 10 14:52:57 2006 -0600
@@ -127,18 +127,15 @@ static inline int LOCAL_FD_SET(fd_set *r
 static inline int LOCAL_FD_SET(fd_set *readfds)
 {
        fd_list_entry_t *ptr;
-       int i;
 
        ptr = fd_start;
        while (ptr != NULL) {
                if (ptr->tap_fd) {
                        FD_SET(ptr->tap_fd, readfds);
-                       for (i = 0; i < MAX_IOFD; i++) {
-                               if (ptr->io_fd[i]) 
-                                       FD_SET(ptr->io_fd[i], readfds);
-                               maxfds = (ptr->io_fd[i] > maxfds ? 
-                                         ptr->io_fd[i]: maxfds);
-                       }
+                       if (ptr->io_fd[READ]) 
+                               FD_SET(ptr->io_fd[READ], readfds);
+                       maxfds = (ptr->io_fd[READ] > maxfds ? 
+                                       ptr->io_fd[READ]: maxfds);
                        maxfds = (ptr->tap_fd > maxfds ? ptr->tap_fd: maxfds);
                }
                ptr = ptr->next;
@@ -580,7 +577,7 @@ static void get_io_request(struct td_sta
 
 int main(int argc, char *argv[])
 {
-       int len, msglen, ret, i;
+       int len, msglen, ret;
        char *p, *buf;
        fd_set readfds, writefds;
        struct timeval timeout;
@@ -633,16 +630,14 @@ int main(int argc, char *argv[])
                             (fd_set *) 0, &timeout);
 
                if (ret > 0) 
-                {
+               {
                        ptr = fd_start;
                        while (ptr != NULL) {
                                if (FD_ISSET(ptr->tap_fd, &readfds)) 
                                        get_io_request(ptr->s);
-                               for (i = 0; i < MAX_IOFD; i++) {
-                                       if (ptr->io_fd[i] && 
-                                          FD_ISSET(ptr->io_fd[i], &readfds)) 
-                                               io_done(ptr->s, i);
-                               }
+                               if (ptr->io_fd[READ] && 
+                                               FD_ISSET(ptr->io_fd[READ], 
&readfds)) 
+                                       io_done(ptr->s, READ);
 
                                ptr = ptr->next;
                        }
diff -r 5791030e6473 -r 3bed37b2c599 tools/console/client/main.c
--- a/tools/console/client/main.c       Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/console/client/main.c       Sun Sep 10 14:52:57 2006 -0600
@@ -220,7 +220,8 @@ int main(int argc, char **argv)
           user friendly, we'll bail out here since no data will ever show
           up on domain-0. */
        if (domid == 0) {
-               err(errno, "Could not read tty from store");
+               fprintf(stderr, "Can't specify Domain-0\n");
+               exit(EINVAL);
        }
 
        /* Wait a little bit for tty to appear.  There is a race
diff -r 5791030e6473 -r 3bed37b2c599 tools/examples/vtpm-common.sh
--- a/tools/examples/vtpm-common.sh     Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/examples/vtpm-common.sh     Sun Sep 10 14:52:57 2006 -0600
@@ -47,6 +47,9 @@ else
        }
        function vtpm_migrate() {
                echo "Error: vTPM migration accross machines not implemented."
+       }
+       function vtpm_migrate_local() {
+               echo "Error: local vTPM migration not supported"
        }
        function vtpm_migrate_recover() {
                true
@@ -353,6 +356,8 @@ function vtpm_migration_step() {
        local res=$(vtpm_isLocalAddress $1)
        if [ "$res" == "0" ]; then
                vtpm_migrate $1 $2 $3
+       else
+               vtpm_migrate_local
        fi
 }
 
diff -r 5791030e6473 -r 3bed37b2c599 tools/examples/vtpm-impl
--- a/tools/examples/vtpm-impl  Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/examples/vtpm-impl  Sun Sep 10 14:52:57 2006 -0600
@@ -184,3 +184,6 @@ function vtpm_migrate_recover() {
  echo "Error: Recovery not supported yet" 
 }
 
+function vtpm_migrate_local() {
+ echo "Error: local vTPM migration not supported"
+}
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xend/XendDomain.py       Sun Sep 10 14:52:57 2006 -0600
@@ -420,6 +420,10 @@ class XendDomain:
         """ The following call may raise a XendError exception """
         dominfo.testMigrateDevices(True, dst)
 
+        if live:
+            """ Make sure there's memory free for enabling shadow mode """
+            dominfo.checkLiveMigrateMemory()
+
         if port == 0:
             port = xroot.get_xend_relocation_port()
         try:
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xend/XendDomainInfo.py   Sun Sep 10 14:52:57 2006 -0600
@@ -49,6 +49,7 @@ from xen.xend.xenstore.xsutil import Get
 from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain
 from xen.xend.xenstore.xswatch import xswatch
 
+from xen.xend import arch
 
 """Shutdown code for poweroff."""
 DOMAIN_POWEROFF = 0
@@ -1087,6 +1088,15 @@ class XendDomainInfo:
     ## public:
 
     def destroyDevice(self, deviceClass, devid):
+       if type(devid) is str:
+           devicePath = '%s/device/%s' % (self.dompath, deviceClass)
+           for entry in xstransact.List(devicePath):
+               backend = xstransact.Read('%s/%s' % (devicePath, entry), 
"backend")
+               devName = xstransact.Read(backend, "dev")
+               if devName == devid:
+                   # We found the integer matching our devid, use it instead
+                   devid = entry
+                   break
         return self.getDeviceController(deviceClass).destroyDevice(devid)
 
 
@@ -1285,28 +1295,37 @@ class XendDomainInfo:
                 for v in range(0, self.info['max_vcpu_id']+1):
                     xc.vcpu_setaffinity(self.domid, v, self.info['cpus'])
 
+            # Use architecture- and image-specific calculations to determine
+            # the various headrooms necessary, given the raw configured
+            # values.
+            # reservation, maxmem, memory, and shadow are all in KiB.
+            reservation = self.image.getRequiredInitialReservation(
+                self.info['memory'] * 1024)
+            maxmem = self.image.getRequiredAvailableMemory(
+                self.info['maxmem'] * 1024)
+            memory = self.image.getRequiredAvailableMemory(
+                self.info['memory'] * 1024)
+            shadow = self.image.getRequiredShadowMemory(
+                self.info['shadow_memory'] * 1024,
+                self.info['maxmem'] * 1024)
+
+            # Round shadow up to a multiple of a MiB, as shadow_mem_control
+            # takes MiB and we must not round down and end up under-providing.
+            shadow = ((shadow + 1023) / 1024) * 1024
+
             # set memory limit
-            maxmem = self.image.getRequiredMemory(self.info['maxmem'] * 1024)
             xc.domain_setmaxmem(self.domid, maxmem)
 
-            mem_kb = self.image.getRequiredMemory(self.info['memory'] * 1024)
-
-            # get the domain's shadow memory requirement
-            shadow_kb = self.image.getRequiredShadowMemory(mem_kb)
-            shadow_kb_req = self.info['shadow_memory'] * 1024
-            if shadow_kb_req > shadow_kb:
-                shadow_kb = shadow_kb_req
-            shadow_mb = (shadow_kb + 1023) / 1024
-
             # Make sure there's enough RAM available for the domain
-            balloon.free(mem_kb + shadow_mb * 1024)
+            balloon.free(memory + shadow)
 
             # Set up the shadow memory
-            shadow_cur = xc.shadow_mem_control(self.domid, shadow_mb)
+            shadow_cur = xc.shadow_mem_control(self.domid, shadow / 1024)
             self.info['shadow_memory'] = shadow_cur
 
-            # initial memory allocation
-            xc.domain_memory_increase_reservation(self.domid, mem_kb, 0, 0)
+            # initial memory reservation
+            xc.domain_memory_increase_reservation(self.domid, reservation, 0,
+                                                  0)
 
             self.createChannels()
 
@@ -1484,6 +1503,19 @@ class XendDomainInfo:
             self.image.createDeviceModel()
 
     ## public:
+
+    def checkLiveMigrateMemory(self):
+        """ Make sure there's enough memory to migrate this domain """
+        overhead_kb = 0
+        if arch.type == "x86":
+            # 1MB per vcpu plus 4Kib/Mib of RAM.  This is higher than 
+            # the minimum that Xen would allocate if no value were given.
+            overhead_kb = self.info['vcpus'] * 1024 + self.info['maxmem'] * 4
+            overhead_kb = ((overhead_kb + 1023) / 1024) * 1024
+            # The domain might already have some shadow memory
+            overhead_kb -= xc.shadow_mem_control(self.domid) * 1024
+        if overhead_kb > 0:
+            balloon.free(overhead_kb)
 
     def testMigrateDevices(self, network, dst):
         """ Notify all device about intention of migration
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xend/image.py    Sun Sep 10 14:52:57 2006 -0600
@@ -143,12 +143,27 @@ class ImageHandler:
             raise VmError('Building domain failed: ostype=%s dom=%d err=%s'
                           % (self.ostype, self.vm.getDomid(), str(result)))
 
-    def getRequiredMemory(self, mem_kb):
+    def getRequiredAvailableMemory(self, mem_kb):
+        """@param mem_kb The configured maxmem or memory, in KiB.
+        @return The corresponding required amount of memory for the domain,
+        also in KiB.  This is normally the given mem_kb, but architecture- or
+        image-specific code may override this to add headroom where
+        necessary."""
         return mem_kb
 
-    def getRequiredShadowMemory(self, mem_kb):
-        """@return The minimum shadow memory required, in KiB, for a domain 
-        with mem_kb KiB of RAM."""
+    def getRequiredInitialReservation(self, mem_kb):
+        """@param mem_kb The configured memory, in KiB.
+        @return The corresponding required amount of memory to be free, also
+        in KiB. This is normally the same as getRequiredAvailableMemory, but
+        architecture- or image-specific code may override this to
+        add headroom where necessary."""
+        return self.getRequiredAvailableMemory(mem_kb)
+
+    def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb):
+        """@param shadow_mem_kb The configured shadow memory, in KiB.
+        @param maxmem_kb The configured maxmem, in KiB.
+        @return The corresponding required amount of shadow memory, also in
+        KiB."""
         # PV domains don't need any shadow memory
         return 0
 
@@ -418,7 +433,7 @@ class IA64_HVM_ImageHandler(HVMImageHand
 
     ostype = "hvm"
 
-    def getRequiredMemory(self, mem_kb):
+    def getRequiredAvailableMemory(self, mem_kb):
         page_kb = 16
         # ROM size for guest firmware, ioreq page and xenstore page
         extra_pages = 1024 + 2
@@ -432,19 +447,29 @@ class X86_HVM_ImageHandler(HVMImageHandl
 
     ostype = "hvm"
 
-    def getRequiredMemory(self, mem_kb):
+    def getRequiredAvailableMemory(self, mem_kb):
+        # Add 8 MiB overhead for QEMU's video RAM.
+        return self.getRequiredInitialReservation(mem_kb) + 8192
+
+    def getRequiredInitialReservation(self, mem_kb):
         page_kb = 4
         # This was derived emperically:
-        #   2.4 MB overhead per 1024 MB RAM + 8 MB constant
+        #   2.4 MB overhead per 1024 MB RAM
         #   + 4 to avoid low-memory condition
-        extra_mb = (2.4/1024) * (mem_kb/1024.0) + 12;
+        extra_mb = (2.4/1024) * (mem_kb/1024.0) + 4;
         extra_pages = int( math.ceil( extra_mb*1024 / page_kb ))
         return mem_kb + extra_pages * page_kb
 
-    def getRequiredShadowMemory(self, mem_kb):
+    def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb):
+        # The given value is the configured value -- we need to include the
+        # overhead due to getRequiredInitialReservation.
+        maxmem_kb = self.getRequiredInitialReservation(maxmem_kb)
+
         # 1MB per vcpu plus 4Kib/Mib of RAM.  This is higher than 
         # the minimum that Xen would allocate if no value were given.
-        return 1024 * self.vm.getVCpuCount() + mem_kb / 256
+        return max(1024 * self.vm.getVCpuCount() + maxmem_kb / 256,
+                   shadow_mem_kb)
+
 
 _handlers = {
     "powerpc": {
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xend/server/pciquirk.py
--- a/tools/python/xen/xend/server/pciquirk.py  Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xend/server/pciquirk.py  Sun Sep 10 14:52:57 2006 -0600
@@ -1,5 +1,5 @@ from xen.xend.XendLogging import log
 from xen.xend.XendLogging import log
-from xen.xend.XendError import XendError
+from xen.xend.XendError import XendError, VmError
 import sys
 import os.path
 from xen.xend.sxp import *
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xm/create.py     Sun Sep 10 14:52:57 2006 -0600
@@ -1169,6 +1169,9 @@ def main(argv):
     if not opts:
         return
 
+    if type(config) == str:
+            config = sxp.parse(file(config))[0]
+
     if opts.vals.dryrun:
         PrettyPrint.prettyprint(config)
     else:
diff -r 5791030e6473 -r 3bed37b2c599 tools/python/xen/xm/tests/test_create.py
--- a/tools/python/xen/xm/tests/test_create.py  Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/python/xen/xm/tests/test_create.py  Sun Sep 10 14:52:57 2006 -0600
@@ -51,6 +51,7 @@ class test_create(unittest.TestCase):
                  'path'      : '.:/etc/xen',
                  'builder'   : 'linux',
                  'nics'      : -1,
+                 'vncunused' : 1,
                  'xauthority': xen.xm.create.get_xauthority(),
                  })
 
@@ -101,6 +102,7 @@ on_crash    = 'destroy'
                  'path'        : '.:/etc/xen',
                  'builder'     : 'linux',
 
+                 'vncunused'   : 1,
                  'xauthority'  : xen.xm.create.get_xauthority(),
                })
 
@@ -140,6 +142,7 @@ cpu_weight = 0.75
                  'builder'    : 'linux',
                  'nics'       : -1,
 
+                 'vncunused'   : 1,
                  'xauthority' : xen.xm.create.get_xauthority(),
                  })
             
@@ -182,6 +185,7 @@ ne2000=0
                                    xen.xm.create.VNC_BASE_PORT +
                                    xen.xm.create.choose_vnc_display())),
                  'vnc'         : 1,
+                 'vncunused'   : 1,
                  'vncviewer'   : 1,
 
                  'xm_file'     : fname,
diff -r 5791030e6473 -r 3bed37b2c599 tools/xenmon/xenmon.py
--- a/tools/xenmon/xenmon.py    Sun Sep 10 14:31:54 2006 -0600
+++ b/tools/xenmon/xenmon.py    Sun Sep 10 14:52:57 2006 -0600
@@ -672,6 +672,9 @@ def main():
 
     parser = setup_cmdline_parser()
     (options, args) = parser.parse_args()
+    if options.mspersample < 0:
+        parser.error("option --ms_per_sample: invalid negative value: '%d'" %
+                     options.mspersample)
     
     start_xenbaked()
     if options.live:
diff -r 5791030e6473 -r 3bed37b2c599 
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Sun Sep 10 
14:31:54 2006 -0600
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Sun Sep 10 
14:52:57 2006 -0600
@@ -17,6 +17,7 @@
  * Place - Suite 330, Boston, MA 02111-1307 USA.
  *
  */
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -25,6 +26,8 @@
 #include <linux/init.h>
 #include <linux/version.h>
 #include <linux/interrupt.h>
+#include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include <asm/system.h>
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -47,7 +50,6 @@ MODULE_DESCRIPTION("Xen platform PCI dev
 MODULE_DESCRIPTION("Xen platform PCI device");
 MODULE_LICENSE("GPL");
 
-
 unsigned long *phys_to_machine_mapping;
 EXPORT_SYMBOL(phys_to_machine_mapping);
 
@@ -118,7 +120,7 @@ unsigned long alloc_xen_mmio(unsigned lo
 /* Lifted from hvmloader.c */
 static int get_hypercall_stubs(void)
 {
-       uint32_t eax, ebx, ecx, edx, pages, msr, order, i;
+       uint32_t eax, ebx, ecx, edx, pages, msr, i;
        char signature[13];
 
        cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
@@ -141,22 +143,22 @@ static int get_hypercall_stubs(void)
 
        cpuid(0x40000002, &pages, &msr, &ecx, &edx);
 
-       i = pages - 1;
-       for (order = 0; i != 0; order++)
-               i >>= 1;
-
-       printk(KERN_INFO "Hypercall area is %u pages (order %u allocation)\n",
-              pages, order);
-
-       hypercall_stubs = (void *)__get_free_pages(GFP_KERNEL, order);
+       printk(KERN_INFO "Hypercall area is %u pages.\n", pages);
+
+       /* Use __vmalloc() because vmalloc_exec() is not an exported symbol. */
+       /* PAGE_KERNEL_EXEC also is not exported, hence we use PAGE_KERNEL. */
+       /* hypercall_stubs = vmalloc_exec(pages * PAGE_SIZE); */
+       hypercall_stubs = __vmalloc(pages * PAGE_SIZE,
+                                   GFP_KERNEL | __GFP_HIGHMEM,
+                                   __pgprot(__PAGE_KERNEL & ~_PAGE_NX));
        if (hypercall_stubs == NULL)
                return -ENOMEM;
 
-       for (i = 0; i < pages; i++)
-               wrmsrl(ebx,
-                      virt_to_phys(hypercall_stubs) +  /* base address      */
-                      (i << PAGE_SHIFT) +              /* offset of page @i */
-                      i);                              /* request page @i   */
+       for (i = 0; i < pages; i++) {
+               unsigned long pfn;
+               pfn = vmalloc_to_pfn((char *)hypercall_stubs + i*PAGE_SIZE);
+               wrmsrl(msr, ((u64)pfn << PAGE_SHIFT) + i);
+       }
 
        return 0;
 }
diff -r 5791030e6473 -r 3bed37b2c599 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Sun Sep 10 14:31:54 2006 -0600
+++ b/xen/arch/x86/mm/shadow/multi.c    Sun Sep 10 14:52:57 2006 -0600
@@ -1792,8 +1792,10 @@ void sh_install_xen_entries_in_l2h(struc
         for ( i = 0; i < MACHPHYS_MBYTES>>1; i++ )
         {
             sl2e[shadow_l2_table_offset(RO_MPT_VIRT_START) + i] =
-                shadow_l2e_from_mfn(_mfn(l3e_get_pfn(p2m[i])),
-                                    __PAGE_HYPERVISOR);
+                (l3e_get_flags(p2m[i]) & _PAGE_PRESENT)
+                ? shadow_l2e_from_mfn(_mfn(l3e_get_pfn(p2m[i])),
+                                      __PAGE_HYPERVISOR)
+                : shadow_l2e_empty();
         }
         sh_unmap_domain_page(p2m);
     }
diff -r 5791030e6473 -r 3bed37b2c599 xen/common/grant_table.c
--- a/xen/common/grant_table.c  Sun Sep 10 14:31:54 2006 -0600
+++ b/xen/common/grant_table.c  Sun Sep 10 14:52:57 2006 -0600
@@ -90,11 +90,8 @@ __gnttab_map_grant_ref(
     unsigned long  frame = 0;
     int            rc = GNTST_okay;
     struct active_grant_entry *act;
-
-    /* Entry details from @rd's shared grant table. */
     grant_entry_t *sha;
-    domid_t        sdom;
-    u16            sflags;
+    union grant_combo scombo, prev_scombo, new_scombo;
 
     /*
      * We bound the number of times we retry CMPXCHG on memory locations that
@@ -159,7 +156,10 @@ __gnttab_map_grant_ref(
 
         memcpy(new_mt, lgt->maptrack, PAGE_SIZE << lgt->maptrack_order);
         for ( i = lgt->maptrack_limit; i < (lgt->maptrack_limit << 1); i++ )
+        {
             new_mt[i].ref = i+1;
+            new_mt[i].flags = 0;
+        }
 
         free_xenheap_pages(lgt->maptrack, lgt->maptrack_order);
         lgt->maptrack          = new_mt;
@@ -175,12 +175,19 @@ __gnttab_map_grant_ref(
 
     spin_lock(&rd->grant_table->lock);
 
+    /* If already pinned, check the active domid and avoid refcnt overflow. */
+    if ( act->pin &&
+         ((act->domid != ld->domain_id) ||
+          (act->pin & 0x80808080U) != 0) )
+        PIN_FAIL(unlock_out, GNTST_general_error,
+                 "Bad domain (%d != %d), or risk of counter overflow %08x\n",
+                 act->domid, ld->domain_id, act->pin);
+
     if ( !act->pin ||
          (!(op->flags & GNTMAP_readonly) &&
           !(act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask))) )
     {
-        sflags = sha->flags;
-        sdom   = sha->domid;
+        scombo.word = *(u32 *)&sha->flags;
 
         /*
          * This loop attempts to set the access (reading/writing) flags
@@ -190,33 +197,29 @@ __gnttab_map_grant_ref(
          */
         for ( ; ; )
         {
-            union grant_combo scombo, prev_scombo, new_scombo;
-
-            if ( unlikely((sflags & GTF_type_mask) != GTF_permit_access) ||
-                 unlikely(sdom != led->domain->domain_id) )
-                PIN_FAIL(unlock_out, GNTST_general_error,
-                         "Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
-                         sflags, sdom, led->domain->domain_id);
-
-            /* Merge two 16-bit values into a 32-bit combined update. */
-            scombo.shorts.flags = sflags;
-            scombo.shorts.domid = sdom;
-            
+            /* If not already pinned, check the grant domid and type. */
+            if ( !act->pin &&
+                 (((scombo.shorts.flags & GTF_type_mask) !=
+                   GTF_permit_access) ||
+                  (scombo.shorts.domid != ld->domain_id)) )
+                 PIN_FAIL(unlock_out, GNTST_general_error,
+                          "Bad flags (%x) or dom (%d). (expected dom %d)\n",
+                          scombo.shorts.flags, scombo.shorts.domid,
+                          ld->domain_id);
+
             new_scombo = scombo;
             new_scombo.shorts.flags |= GTF_reading;
 
             if ( !(op->flags & GNTMAP_readonly) )
             {
                 new_scombo.shorts.flags |= GTF_writing;
-                if ( unlikely(sflags & GTF_readonly) )
+                if ( unlikely(scombo.shorts.flags & GTF_readonly) )
                     PIN_FAIL(unlock_out, GNTST_general_error,
                              "Attempt to write-pin a r/o grant entry.\n");
             }
 
             prev_scombo.word = cmpxchg((u32 *)&sha->flags,
                                        scombo.word, new_scombo.word);
-
-            /* Did the combined update work (did we see what we expected?). */
             if ( likely(prev_scombo.word == scombo.word) )
                 break;
 
@@ -224,20 +227,15 @@ __gnttab_map_grant_ref(
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "Shared grant entry is unstable.\n");
 
-            /* Didn't see what we expected. Split out the seen flags & dom. */
-            sflags = prev_scombo.shorts.flags;
-            sdom   = prev_scombo.shorts.domid;
+            scombo = prev_scombo;
         }
 
         if ( !act->pin )
         {
-            act->domid = sdom;
+            act->domid = scombo.shorts.domid;
             act->frame = gmfn_to_mfn(rd, sha->frame);
         }
     }
-    else if ( (act->pin & 0x80808080U) != 0 )
-        PIN_FAIL(unlock_out, ENOSPC,
-                 "Risk of counter overflow %08x\n", act->pin);
 
     if ( op->flags & GNTMAP_device_map )
         act->pin += (op->flags & GNTMAP_readonly) ?
@@ -545,9 +543,7 @@ gnttab_prepare_for_transfer(
 {
     struct grant_table *rgt;
     struct grant_entry *sha;
-    domid_t             sdom;
-    u16                 sflags;
-    union grant_combo   scombo, prev_scombo, tmp_scombo;
+    union grant_combo   scombo, prev_scombo, new_scombo;
     int                 retries = 0;
 
     if ( unlikely((rgt = rd->grant_table) == NULL) ||
@@ -562,29 +558,24 @@ gnttab_prepare_for_transfer(
 
     sha = &rgt->shared[ref];
     
-    sflags = sha->flags;
-    sdom   = sha->domid;
+    scombo.word = *(u32 *)&sha->flags;
 
     for ( ; ; )
     {
-        if ( unlikely(sflags != GTF_accept_transfer) ||
-             unlikely(sdom != ld->domain_id) )
+        if ( unlikely(scombo.shorts.flags != GTF_accept_transfer) ||
+             unlikely(scombo.shorts.domid != ld->domain_id) )
         {
             DPRINTK("Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
-                    sflags, sdom, ld->domain_id);
+                    scombo.shorts.flags, scombo.shorts.domid,
+                    ld->domain_id);
             goto fail;
         }
 
-        /* Merge two 16-bit values into a 32-bit combined update. */
-        scombo.shorts.flags = sflags;
-        scombo.shorts.domid = sdom;
-
-        tmp_scombo = scombo;
-        tmp_scombo.shorts.flags |= GTF_transfer_committed;
+        new_scombo = scombo;
+        new_scombo.shorts.flags |= GTF_transfer_committed;
+
         prev_scombo.word = cmpxchg((u32 *)&sha->flags,
-                                   scombo.word, tmp_scombo.word);
-
-        /* Did the combined update work (did we see what we expected?). */
+                                   scombo.word, new_scombo.word);
         if ( likely(prev_scombo.word == scombo.word) )
             break;
 
@@ -594,9 +585,7 @@ gnttab_prepare_for_transfer(
             goto fail;
         }
 
-        /* Didn't see what we expected. Split out the seen flags & dom. */
-        sflags = prev_scombo.shorts.flags;
-        sdom   = prev_scombo.shorts.domid;
+        scombo = prev_scombo;
     }
 
     spin_unlock(&rgt->lock);
@@ -734,16 +723,21 @@ __release_grant_for_copy(
         gnttab_mark_dirty(rd, r_frame);
 
     spin_lock(&rd->grant_table->lock);
+
     if ( readonly )
+    {
         act->pin -= GNTPIN_hstr_inc;
+    }
     else
+    {
         act->pin -= GNTPIN_hstw_inc;
-
-    if ( !(act->pin & GNTPIN_hstw_mask) && !readonly )
-        gnttab_clear_flag(_GTF_writing, &sha->flags);
+        if ( !(act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask)) )
+            gnttab_clear_flag(_GTF_writing, &sha->flags);
+    }
 
     if ( !act->pin )
         gnttab_clear_flag(_GTF_reading, &sha->flags);
+
     spin_unlock(&rd->grant_table->lock);
 }
 
@@ -759,8 +753,7 @@ __acquire_grant_for_copy(
     struct active_grant_entry *act;
     s16 rc = GNTST_okay;
     int retries = 0;
-    u16 sflags;
-    domid_t sdom;
+    union grant_combo scombo, prev_scombo, new_scombo;
 
     if ( unlikely(gref >= NR_GRANT_ENTRIES) )
         PIN_FAIL(error_out, GNTST_bad_gntref,
@@ -771,36 +764,42 @@ __acquire_grant_for_copy(
 
     spin_lock(&rd->grant_table->lock);
     
+    /* If already pinned, check the active domid and avoid refcnt overflow. */
+    if ( act->pin &&
+         ((act->domid != current->domain->domain_id) ||
+          (act->pin & 0x80808080U) != 0) )
+        PIN_FAIL(unlock_out, GNTST_general_error,
+                 "Bad domain (%d != %d), or risk of counter overflow %08x\n",
+                 act->domid, current->domain->domain_id, act->pin);
+
     if ( !act->pin ||
-         (!readonly && !(act->pin & GNTPIN_hstw_mask)) )
-    {
-        sflags = sha->flags;
-        sdom = sha->domid;
+         (!readonly && !(act->pin & (GNTPIN_devw_mask|GNTPIN_hstw_mask))) )
+    {
+        scombo.word = *(u32 *)&sha->flags;
 
         for ( ; ; )
         {
-            union grant_combo scombo, prev_scombo, new_scombo;
-
-            if ( unlikely((sflags & GTF_type_mask) != GTF_permit_access ||
-                          sdom != current->domain->domain_id ) )
-                PIN_FAIL(unlock_out, GNTST_general_error,
-                         "Bad flags (%x) or dom (%d). (NB. expected dom %d)\n",
-                         sflags, sdom, current->domain->domain_id);
-
-            /* Merge two 16-bit values into a 32-bit combined update. */
-            scombo.shorts.flags = sflags;
-            scombo.shorts.domid = sdom;
-            
+            /* If not already pinned, check the grant domid and type. */
+            if ( !act->pin &&
+                 (((scombo.shorts.flags & GTF_type_mask) !=
+                   GTF_permit_access) ||
+                  (scombo.shorts.domid != current->domain->domain_id)) )
+                 PIN_FAIL(unlock_out, GNTST_general_error,
+                          "Bad flags (%x) or dom (%d). (expected dom %d)\n",
+                          scombo.shorts.flags, scombo.shorts.domid,
+                          current->domain->domain_id);
+
             new_scombo = scombo;
             new_scombo.shorts.flags |= GTF_reading;
 
             if ( !readonly )
             {
                 new_scombo.shorts.flags |= GTF_writing;
-                if ( unlikely(sflags & GTF_readonly) )
+                if ( unlikely(scombo.shorts.flags & GTF_readonly) )
                     PIN_FAIL(unlock_out, GNTST_general_error,
                              "Attempt to write-pin a r/o grant entry.\n");
             }
+
             prev_scombo.word = cmpxchg((u32 *)&sha->flags,
                                        scombo.word, new_scombo.word);
             if ( likely(prev_scombo.word == scombo.word) )
@@ -809,19 +808,16 @@ __acquire_grant_for_copy(
             if ( retries++ == 4 )
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "Shared grant entry is unstable.\n");
-            sflags = prev_scombo.shorts.flags;
-            sdom = prev_scombo.shorts.flags;
+
+            scombo = prev_scombo;
         }
 
         if ( !act->pin )
         {
-            act->domid = sdom;
+            act->domid = scombo.shorts.domid;
             act->frame = gmfn_to_mfn(rd, sha->frame);
         }
     }
-    else if ( (act->pin & 0x80808080U) != 0 )
-        PIN_FAIL(unlock_out, ENOSPC,
-                 "Risk of counter overflow %08x\n", act->pin);
 
     act->pin += readonly ? GNTPIN_hstr_inc : GNTPIN_hstw_inc;
 
diff -r 5791030e6473 -r 3bed37b2c599 xen/include/asm-x86/bitops.h
--- a/xen/include/asm-x86/bitops.h      Sun Sep 10 14:31:54 2006 -0600
+++ b/xen/include/asm-x86/bitops.h      Sun Sep 10 14:52:57 2006 -0600
@@ -6,14 +6,6 @@
  */
 
 #include <xen/config.h>
-
-/*
- * These have to be done with inline assembly: that way the bit-setting
- * is guaranteed to be atomic. All bit operations return 0 if the bit
- * was cleared before the operation and != 0 if it was not.
- *
- * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
- */
 
 #ifdef CONFIG_SMP
 #define LOCK_PREFIX "lock ; "
@@ -21,6 +13,13 @@
 #define LOCK_PREFIX ""
 #endif
 
+/*
+ * We use the "+m" constraint because the memory operand is both read from
+ * and written to. Since the operand is in fact a word array, we also
+ * specify "memory" in the clobbers list to indicate that words other than
+ * the one directly addressed by the memory operand may be modified.
+ */
+
 #define ADDR (*(volatile long *) addr)
 
 /**
@@ -37,8 +36,8 @@ static __inline__ void set_bit(int nr, v
 {
        __asm__ __volatile__( LOCK_PREFIX
                "btsl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 /**
@@ -54,8 +53,8 @@ static __inline__ void __set_bit(int nr,
 {
        __asm__(
                "btsl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 /**
@@ -72,8 +71,8 @@ static __inline__ void clear_bit(int nr,
 {
        __asm__ __volatile__( LOCK_PREFIX
                "btrl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 /**
@@ -89,8 +88,8 @@ static __inline__ void __clear_bit(int n
 {
        __asm__(
                "btrl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 #define smp_mb__before_clear_bit()     barrier()
@@ -109,8 +108,8 @@ static __inline__ void __change_bit(int 
 {
        __asm__ __volatile__(
                "btcl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 /**
@@ -126,8 +125,8 @@ static __inline__ void change_bit(int nr
 {
        __asm__ __volatile__( LOCK_PREFIX
                "btcl %1,%0"
-               :"=m" (ADDR)
-               :"dIr" (nr));
+               :"+m" (ADDR)
+               :"dIr" (nr) : "memory");
 }
 
 /**
@@ -144,7 +143,7 @@ static __inline__ int test_and_set_bit(i
 
        __asm__ __volatile__( LOCK_PREFIX
                "btsl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
+               :"=r" (oldbit),"+m" (ADDR)
                :"dIr" (nr) : "memory");
        return oldbit;
 }
@@ -164,8 +163,8 @@ static __inline__ int __test_and_set_bit
 
        __asm__(
                "btsl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
-               :"dIr" (nr));
+               :"=r" (oldbit),"+m" (ADDR)
+               :"dIr" (nr) : "memory");
        return oldbit;
 }
 
@@ -183,7 +182,7 @@ static __inline__ int test_and_clear_bit
 
        __asm__ __volatile__( LOCK_PREFIX
                "btrl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
+               :"=r" (oldbit),"+m" (ADDR)
                :"dIr" (nr) : "memory");
        return oldbit;
 }
@@ -203,8 +202,8 @@ static __inline__ int __test_and_clear_b
 
        __asm__(
                "btrl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
-               :"dIr" (nr));
+               :"=r" (oldbit),"+m" (ADDR)
+               :"dIr" (nr) : "memory");
        return oldbit;
 }
 
@@ -215,7 +214,7 @@ static __inline__ int __test_and_change_
 
        __asm__ __volatile__(
                "btcl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
+               :"=r" (oldbit),"+m" (ADDR)
                :"dIr" (nr) : "memory");
        return oldbit;
 }
@@ -234,7 +233,7 @@ static __inline__ int test_and_change_bi
 
        __asm__ __volatile__( LOCK_PREFIX
                "btcl %2,%1\n\tsbbl %0,%0"
-               :"=r" (oldbit),"=m" (ADDR)
+               :"=r" (oldbit),"+m" (ADDR)
                :"dIr" (nr) : "memory");
        return oldbit;
 }
@@ -242,7 +241,7 @@ static __inline__ int test_and_change_bi
 
 static __inline__ int constant_test_bit(int nr, const volatile void * addr)
 {
-       return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr 
>> 5])) != 0;
+       return ((1U << (nr & 31)) & (((const volatile unsigned int *) addr)[nr 
>> 5])) != 0;
 }
 
 static __inline__ int variable_test_bit(int nr, volatile void * addr)

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


 


Rackspace

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