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] This patch changes the probe notifier, per Rusty's sugge

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] This patch changes the probe notifier, per Rusty's suggestion. It
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 06 Aug 2005 05:54:10 -0400
Delivery-date: Sat, 06 Aug 2005 09:54:41 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 968829eb17831d9bc33626ce3dd7dde08073175f
# Parent  0538ec1fe5b2bf7c185f6bb0590f6e780b78f674
This patch changes the probe notifier, per Rusty's suggestion.  It
also converts the balloon driver to use the notifier structure, and
removes the root-watch workaround.

Signed-off-by: Dan Smith <danms@xxxxxxxxxx>

diff -r 0538ec1fe5b2 -r 968829eb1783 
linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Sat Aug  6 09:48:47 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c     Sat Aug  6 09:49:22 2005
@@ -314,6 +314,9 @@
 
 static struct notifier_block xenstore_notifier;
 
+/* Setup our watcher
+   NB: Assumes xenbus_lock is held!
+*/
 static int setup_shutdown_watcher(struct notifier_block *notifier,
                                   unsigned long event,
                                   void *data)
@@ -323,12 +326,12 @@
     int err2 = 0;
 #endif
 
-    down(&xenbus_lock);
+    BUG_ON(down_trylock(&xenbus_lock) == 0);
+
     err1 = register_xenbus_watch(&shutdown_watch);
 #ifdef CONFIG_MAGIC_SYSRQ
     err2 = register_xenbus_watch(&sysrq_watch);
 #endif
-    up(&xenbus_lock);
 
     if (err1) {
         printk(KERN_ERR "Failed to set shutdown watcher\n");
@@ -348,11 +351,7 @@
     
     xenstore_notifier.notifier_call = setup_shutdown_watcher;
 
-    if (xen_start_info.store_evtchn) {
-        setup_shutdown_watcher(&xenstore_notifier, 0, NULL);
-    } else {
-        register_xenstore_notifier(&xenstore_notifier);
-    }
+    register_xenstore_notifier(&xenstore_notifier);
     
     return 0;
 }
diff -r 0538ec1fe5b2 -r 968829eb1783 
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
--- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c        Sat Aug  6 
09:48:47 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c        Sat Aug  6 
09:49:22 2005
@@ -81,9 +81,6 @@
 static DECLARE_WORK(balloon_worker, balloon_process, NULL);
 static struct timer_list balloon_timer;
 
-/* Flag for dom0 xenstore workaround */
-static int balloon_xenbus_init=0;
-
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 /* Use the private and mapping fields of struct page as a list. */
 #define PAGE_TO_LIST(p) ( (struct list_head *)&p->private )
@@ -304,15 +301,9 @@
     schedule_work(&balloon_worker);
 }
 
-static struct xenbus_watch xb_watch =
-{
-    .node = "memory"
-};
-
-/* FIXME: This is part of a dom0 sequencing workaround */
-static struct xenbus_watch root_watch =
-{
-    .node = "/"
+static struct xenbus_watch target_watch =
+{
+    .node = "memory/target"
 };
 
 /* React to a change in the target key */
@@ -320,30 +311,12 @@
 {
     unsigned long new_target;
     int err;
-
-    if(watch == &root_watch)
-    {
-        /* FIXME: This is part of a dom0 sequencing workaround */
-        if(register_xenbus_watch(&xb_watch) == 0)
-        {
-            /* 
-               We successfully set a watch on memory/target:
-               now we can stop watching root 
-            */
-            unregister_xenbus_watch(&root_watch);
-            balloon_xenbus_init=1;
-        } 
-        else 
-        {
-            return;
-        }
-    }
 
     err = xenbus_scanf("memory", "target", "%lu", &new_target);
         
     if(err != 1) 
     {
-        IPRINTK("Unable to read memory/target\n");
+        printk(KERN_ERR "Unable to read memory/target\n");
         return;
     } 
         
@@ -351,40 +324,26 @@
     
 }
 
-/* Init Function - Try to set up our watcher, if not already set. */
-void balloon_init_watcher(void)
+/* Setup our watcher
+   NB: Assumes xenbus_lock is held!
+*/
+int balloon_init_watcher(struct notifier_block *notifier,
+                         unsigned long event,
+                         void *data)
 {
     int err;
 
-    if (!xen_start_info.store_evtchn) {
-        IPRINTK("Delaying watcher init until xenstore is available\n");
-        return;
-    }
-
-    down(&xenbus_lock);
-
-    if (!balloon_xenbus_init) {
-        err = register_xenbus_watch(&xb_watch);
-        if (err) {
-            /* BIG FAT FIXME: dom0 sequencing workaround
-             * dom0 can't set a watch on memory/target until
-             * after the tools create it.  So, we have to watch
-             * the whole store until that happens.
-             *
-             * This will go away when we have the ability to watch
-             * non-existant keys
-             */
-            register_xenbus_watch(&root_watch);
-        } else {
-            IPRINTK("Balloon xenbus watcher initialized\n");
-            balloon_xenbus_init = 1;
-        }
-    }
-
-    up(&xenbus_lock);
-}
-
-EXPORT_SYMBOL(balloon_init_watcher);
+    BUG_ON(down_trylock(&xenbus_lock) == 0);
+
+    err = register_xenbus_watch(&target_watch);
+
+    if (err) {
+        printk(KERN_ERR "Failed to set balloon watcher\n");
+    }
+
+    return NOTIFY_DONE;
+    
+}
 
 static int balloon_write(struct file *file, const char __user *buffer,
                          unsigned long count, void *data)
@@ -439,6 +398,8 @@
     return len;
 }
 
+static struct notifier_block xenstore_notifier;
+
 static int __init balloon_init(void)
 {
     unsigned long pfn;
@@ -474,11 +435,11 @@
             balloon_append(page);
     }
 
-    xb_watch.callback = watch_target;
-    root_watch.callback = watch_target;
-
-    balloon_init_watcher();
-
+    target_watch.callback = watch_target;
+    xenstore_notifier.notifier_call = balloon_init_watcher;
+
+    register_xenstore_notifier(&xenstore_notifier);
+    
     return 0;
 }
 
diff -r 0538ec1fe5b2 -r 968829eb1783 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Sat Aug  6 
09:48:47 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Sat Aug  6 
09:49:22 2005
@@ -41,9 +41,6 @@
 
 #define streq(a, b) (strcmp((a), (b)) == 0)
 
-/* Protects notifier chain */
-DECLARE_MUTEX(xenstore_control);
-
 static struct notifier_block *xenstore_chain;
 
 /* If something in array of ids matches this device, return it. */
@@ -317,21 +314,27 @@
 
 int register_xenstore_notifier(struct notifier_block *nb)
 {
-       int ret;
-
-       if ((ret = down_interruptible(&xenstore_control)) != 0) 
-               return ret;
-       ret = notifier_chain_register(&xenstore_chain, nb);
-       up(&xenstore_control);
+       int ret = 0;
+
+       down(&xenbus_lock);
+
+       if (xen_start_info.store_evtchn) {
+               ret = nb->notifier_call(nb, 0, NULL);
+       } else {
+               notifier_chain_register(&xenstore_chain, nb);
+       }
+
+       up(&xenbus_lock);
+
        return ret;
 }
 EXPORT_SYMBOL(register_xenstore_notifier);
 
 void unregister_xenstore_notifier(struct notifier_block *nb)
 {
-       down(&xenstore_control);
+       down(&xenbus_lock);
        notifier_chain_unregister(&xenstore_chain, nb);
-       up(&xenstore_control);
+       up(&xenbus_lock);
 }
 EXPORT_SYMBOL(unregister_xenstore_notifier);
 
@@ -349,7 +352,10 @@
                return err;
        }
 
+       down(&xenbus_lock);
        err = notifier_call_chain(&xenstore_chain, 0, 0);
+       up(&xenbus_lock);
+
        if (err == NOTIFY_BAD) {
                printk("%s: calling xenstore notify chain failed\n",
                       __FUNCTION__);
@@ -358,9 +364,6 @@
 
        err = 0;
 
-       /* Initialize non-xenbus drivers */
-       balloon_init_watcher();
-
        down(&xenbus_lock);
        /* Enumerate devices in xenstore. */
        xenbus_probe_devices("device");
diff -r 0538ec1fe5b2 -r 968829eb1783 
linux-2.6-xen-sparse/include/asm-xen/balloon.h
--- a/linux-2.6-xen-sparse/include/asm-xen/balloon.h    Sat Aug  6 09:48:47 2005
+++ b/linux-2.6-xen-sparse/include/asm-xen/balloon.h    Sat Aug  6 09:49:22 2005
@@ -48,7 +48,4 @@
 #define balloon_lock(__flags)   spin_lock_irqsave(&balloon_lock, __flags)
 #define balloon_unlock(__flags) spin_unlock_irqrestore(&balloon_lock, __flags)
 
-/* Init Function - Try to set up our watcher, if not already set. */
-void balloon_init_watcher(void);
-
 #endif /* __ASM_BALLOON_H__ */

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] This patch changes the probe notifier, per Rusty's suggestion. It, Xen patchbot -unstable <=