WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Merged.

# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 5019c8d034c42bc343000ff450ef90476846c2c3
# Parent  fa76c455af35d4129def2f846bfc7d6bdbb50b54
# Parent  9bf6f907b3ff0261902f06d261f76c1bd12af9f5
Merged.

diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c     Wed Nov 16 10:32:14 2005
@@ -752,7 +752,7 @@
                irq_bindcount[dynirq_to_irq(i)] = 0;
 
                irq_desc[dynirq_to_irq(i)].status  = IRQ_DISABLED;
-               irq_desc[dynirq_to_irq(i)].action  = 0;
+               irq_desc[dynirq_to_irq(i)].action  = NULL;
                irq_desc[dynirq_to_irq(i)].depth   = 1;
                irq_desc[dynirq_to_irq(i)].handler = &dynirq_type;
        }
@@ -770,7 +770,7 @@
 #endif
 
                irq_desc[pirq_to_irq(i)].status  = IRQ_DISABLED;
-               irq_desc[pirq_to_irq(i)].action  = 0;
+               irq_desc[pirq_to_irq(i)].action  = NULL;
                irq_desc[pirq_to_irq(i)].depth   = 1;
                irq_desc[pirq_to_irq(i)].handler = &pirq_type;
        }
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Wed Nov 16 10:32:14 2005
@@ -188,7 +188,7 @@
        xenbus_resume();
 
 #ifdef CONFIG_SMP
-       for_each_present_cpu(i)
+       for_each_cpu(i)
                vcpu_prepare(i);
 
  out_reenable_cpus:
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c    Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c    Wed Nov 16 10:32:14 2005
@@ -277,6 +277,18 @@
 
 #ifdef CONFIG_HOTPLUG_CPU
 
+/*
+ * Initialize cpu_present_map late to skip SMP boot code in init/main.c.
+ * But do it early enough to catch critical for_each_present_cpu() loops
+ * in i386-specific code.
+ */
+static int __init initialize_cpu_present_map(void)
+{
+       cpu_present_map = cpu_possible_map;
+       return 0;
+}
+core_initcall(initialize_cpu_present_map);
+
 static void vcpu_hotplug(unsigned int cpu)
 {
        int err;
@@ -293,7 +305,6 @@
        }
 
        if (strcmp(state, "online") == 0) {
-               cpu_set(cpu, cpu_present_map);
                (void)cpu_up(cpu);
        } else if (strcmp(state, "offline") == 0) {
                (void)cpu_down(cpu);
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/arch/xen/kernel/xen_proc.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/xen_proc.c   Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/xen_proc.c   Wed Nov 16 10:32:14 2005
@@ -1,6 +1,7 @@
 
 #include <linux/config.h>
 #include <linux/proc_fs.h>
+#include <asm-xen/xen_proc.h>
 
 static struct proc_dir_entry *xen_base;
 
diff -r fa76c455af35 -r 5019c8d034c4 linux-2.6-xen-sparse/drivers/acpi/tables.c
--- a/linux-2.6-xen-sparse/drivers/acpi/tables.c        Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/drivers/acpi/tables.c        Wed Nov 16 10:32:14 2005
@@ -565,7 +565,7 @@
  * 
  * result: sdt_entry[] is initialized
  */
-#ifdef CONFIG_XEN_X86
+#if defined(CONFIG_XEN_X86) || defined(CONFIG_XEN_X86_64)
 #define acpi_rsdp_phys_to_va(rsdp_phys) (__fix_to_virt(FIX_ACPI_RSDP_PAGE) + \
                                           (rsdp_phys & ~PAGE_MASK))
 #else
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c
--- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Wed Nov 16 10:31:57 2005
+++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c   Wed Nov 16 10:32:14 2005
@@ -438,7 +438,7 @@
        &dev_attr_pcrs.attr,
        &dev_attr_caps.attr,
        &dev_attr_cancel.attr,
-       0,
+       NULL,
 };
 
 static struct attribute_group xen_attr_grp = { .attrs = xen_attrs };
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Wed Nov 16 
10:31:57 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Wed Nov 16 
10:32:14 2005
@@ -543,7 +543,7 @@
        spin_lock_init(&blkio_schedule_list_lock);
        INIT_LIST_HEAD(&blkio_schedule_list);
 
-       ret = kernel_thread(blkio_schedule, 0, CLONE_FS | CLONE_FILES);
+       ret = kernel_thread(blkio_schedule, NULL, CLONE_FS | CLONE_FILES);
        BUG_ON(ret < 0);
 
        blkif_xenbus_init();
diff -r fa76c455af35 -r 5019c8d034c4 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Nov 16 
10:31:57 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Nov 16 
10:32:14 2005
@@ -854,7 +854,7 @@
 {
        int ret = 0;
 
-        if(xenstored_ready > 0) 
+       if (xenstored_ready > 0) 
                ret = nb->notifier_call(nb, 0, NULL);
        else 
                notifier_chain_register(&xenstore_chain, nb);
@@ -884,7 +884,7 @@
        register_xenbus_watch(&be_watch);
 
        /* Notify others that xenstore is up */
-       notifier_call_chain(&xenstore_chain, 0, 0);
+       notifier_call_chain(&xenstore_chain, 0, NULL);
 }
 
 
diff -r fa76c455af35 -r 5019c8d034c4 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Wed Nov 16 10:31:57 2005
+++ b/tools/python/xen/xend/XendDomain.py       Wed Nov 16 10:32:14 2005
@@ -36,6 +36,7 @@
 from xen.xend.XendError import XendError
 from xen.xend.XendLogging import log
 from xen.xend.server import relocate
+from xen.xend.xenstore.xswatch import xswatch
 
 
 xc = xen.lowlevel.xc.new()
@@ -58,9 +59,11 @@
         # to import XendDomain from XendDomainInfo causes unbounded recursion.
         # So we stuff the XendDomain instance (self) into xroot's components.
         xroot.add_component("xen.xend.XendDomain", self)
+
         self.domains = {}
         self.domains_lock = threading.RLock()
-        self.watchReleaseDomain()
+
+        xswatch("@releaseDomain", self.onReleaseDomain)
 
         self.domains_lock.acquire()
         try:
@@ -112,11 +115,7 @@
             self.refresh()
         finally:
             self.domains_lock.release()
-            
-
-    def watchReleaseDomain(self):
-        from xen.xend.xenstore.xswatch import xswatch
-        self.releaseDomain = xswatch("@releaseDomain", self.onReleaseDomain)
+        return 1
 
 
     def xen_domains(self):
diff -r fa76c455af35 -r 5019c8d034c4 
tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py     Wed Nov 16 10:31:57 2005
+++ b/tools/python/xen/xend/server/DevController.py     Wed Nov 16 10:32:14 2005
@@ -29,6 +29,12 @@
 HOTPLUG_STATUS_NODE = "hotplug-status"
 HOTPLUG_STATUS_ERROR = "error"
 
+Connected = 1
+Died      = 2
+Error     = 3
+Missing   = 4
+Timeout   = 5
+
 xenbusState = {
     'Unknown'      : 0,
     'Initialising' : 1,
@@ -87,18 +93,28 @@
     def waitForDevice(self, devid):
         log.debug("Waiting for %s.", devid)
         
-        status, fn_ret = self.waitForBackend(devid)
-        if status:
+        status = self.waitForBackend(devid)
+
+        if status == Timeout:
             self.destroyDevice(devid)
-            raise VmError( ("Device %s (%s) could not be connected. "
-                            "Hotplug scripts not working") 
-                            % (devid, self.deviceClass))
-
-        elif fn_ret == HOTPLUG_STATUS_ERROR:
+            raise VmError("Device %s (%s) could not be connected. "
+                          "Hotplug scripts not working" %
+                          (devid, self.deviceClass))
+
+        elif status == Error:
             self.destroyDevice(devid)
-            raise VmError( ("Device %s (%s) could not be connected. "
-                            "Backend device not found!") 
-                            % (devid, self.deviceClass))
+            raise VmError("Device %s (%s) could not be connected. "
+                          "Backend device not found" %
+                          (devid, self.deviceClass))
+
+        elif status == Missing:
+            raise VmError("Device %s (%s) could not be connected. "
+                          "Device not found" % (devid, self.deviceClass))
+
+        elif status == Died:
+            self.destroyDevice(devid)
+            raise VmError("Device %s (%s) could not be connected. "
+                          "Device has died" % (devid, self.deviceClass))
 
 
     def reconfigureDevice(self, devid, config):
@@ -302,35 +318,22 @@
                 raise
 
 
-    def waitForBackend(self,devid):
-        ev = Event()
-
-        def hotplugStatus():
-            log.debug("hotplugStatus %d", devid)
-            
-            try:
-                status = self.readBackend(devid, HOTPLUG_STATUS_NODE)
-            except VmError:
-                status = "died"
-            if status is not None:
-                watch.xs.unwatch(backpath, watch)
-                hotplugStatus.value = status
-                ev.set()
-
-        hotplugStatus.value = None
+    def waitForBackend(self, devid):
+
         frontpath = self.frontendPath(devid)
         backpath = xstransact.Read(frontpath, "backend")
 
         if backpath:
-            watch = xswatch(backpath, hotplugStatus)
+            statusPath = backpath + '/' + HOTPLUG_STATUS_NODE
+            ev = Event()
+            result = { 'status': Timeout }
+            
+            xswatch(statusPath, hotplugStatusCallback, statusPath, ev, result)
 
             ev.wait(DEVICE_CREATE_TIMEOUT)
-            if ev.isSet():
-                return (0, hotplugStatus.value)
-            else:
-                return (-1, hotplugStatus.value)
-        else:
-            return (-1, "missing")
+            return result['status']
+        else:
+            return Missing
 
 
     def backendPath(self, backdom, devid):
@@ -352,3 +355,25 @@
     def frontendMiscPath(self):
         return "%s/device-misc/%s" % (self.vm.getDomainPath(),
                                       self.deviceClass)
+
+
+def hotplugStatusCallback(statusPath, ev, result):
+    log.debug("hotplugStatusCallback %s.", statusPath)
+
+    try:
+        status = xstransact.Read(statusPath)
+
+        if status is not None:
+            if status == HOTPLUG_STATUS_ERROR:
+                result['status'] = Error
+            else:
+                result['status'] = Connected
+        else:
+            return 1
+    except VmError:
+        result['status'] = Died
+
+    log.debug("hotplugStatusCallback %d.", result['status'])
+
+    ev.set()
+    return 0
diff -r fa76c455af35 -r 5019c8d034c4 
tools/python/xen/xend/xenstore/xstransact.py
--- a/tools/python/xen/xend/xenstore/xstransact.py      Wed Nov 16 10:31:57 2005
+++ b/tools/python/xen/xend/xenstore/xstransact.py      Wed Nov 16 10:32:14 2005
@@ -177,18 +177,15 @@
                 (key, fn, defval) = tup
 
             val = self._read(key)
-            # If fn is str, then this will successfully convert None to
-            # 'None'.  If it is int, then it will throw TypeError on None, or
-            # on any other non-integer value.  We have to, therefore, both
-            # check explicitly for None, and catch TypeError.  Either failure
-            # will result in defval being used instead.
+            # If fn is str, then this will successfully convert None to 'None'
+            # (which we don't want).  If it is int or float, then it will
+            # throw ValueError on any non-convertible value.  We check
+            # explicitly for None, using defval instead, but allow ValueError
+            # to propagate.
             if val is None:
                 val = defval
             else:
-                try:
-                    val = fn(val)
-                except TypeError:
-                    val = defval
+                val = fn(val)
             ret.append(val)
         if len(ret) == 1:
             return ret[0]
diff -r fa76c455af35 -r 5019c8d034c4 tools/python/xen/xend/xenstore/xswatch.py
--- a/tools/python/xen/xend/xenstore/xswatch.py Wed Nov 16 10:31:57 2005
+++ b/tools/python/xen/xend/xenstore/xswatch.py Wed Nov 16 10:32:14 2005
@@ -5,9 +5,7 @@
 # Public License.  See the file "COPYING" in the main directory of
 # this archive for more details.
 
-import select
 import threading
-from xen.lowlevel import xs
 from xen.xend.xenstore.xsutil import xshandle
 
 from xen.xend.XendLogging import log
@@ -15,42 +13,45 @@
 
 class xswatch:
 
-    watchThread = None
-    xs = None
-    xslock = threading.Lock()
-    
     def __init__(self, path, fn, *args, **kwargs):
+        self.path = path
         self.fn = fn
         self.args = args
         self.kwargs = kwargs
-        xswatch.watchStart()
-        xswatch.xs.watch(path, self)
-
-    def watchStart(cls):
-        cls.xslock.acquire()
-        if cls.watchThread:
-            cls.xslock.release()
-            return
-        cls.xs = xshandle()
-        cls.watchThread = threading.Thread(name="Watcher",
-                                           target=cls.watchMain)
-        cls.watchThread.setDaemon(True)
-        cls.watchThread.start()
-        cls.xslock.release()
-
-    watchStart = classmethod(watchStart)
-
-    def watchMain(cls):
-        while True:
-            try:
-                we = cls.xs.read_watch()
-                watch = we[1]
-                watch.fn(*watch.args, **watch.kwargs)
-            except:
-                log.exception("read_watch failed")
-                # Ignore this exception -- there's no point throwing it
-                # further on because that will just kill the watcher thread,
-                # which achieves nothing.
+        watchStart()
+        xs.watch(path, self)
 
 
-    watchMain = classmethod(watchMain)
+watchThread = None
+xs = None
+xslock = threading.Lock()
+
+def watchStart():
+    global watchThread
+    global xs
+    
+    xslock.acquire()
+    try:
+        if watchThread:
+            return
+        xs = xshandle()
+        watchThread = threading.Thread(name="Watcher", target=watchMain)
+        watchThread.setDaemon(True)
+        watchThread.start()
+    finally:
+        xslock.release()
+
+
+def watchMain():
+    while True:
+        try:
+            we = xs.read_watch()
+            watch = we[1]
+            res = watch.fn(*watch.args, **watch.kwargs)
+            if not res:
+                xs.unwatch(watch.path, watch)
+        except:
+            log.exception("read_watch failed")
+            # Ignore this exception -- there's no point throwing it
+            # further on because that will just kill the watcher thread,
+            # which achieves nothing.

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

<Prev in Thread] Current Thread [Next in Thread>