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

[Xen-devel] [PATCH] RHEL3 2.4 domU kernel has load average of 2



The backport of the xenbus code for the 2.4 kernel changed
wait_event_interruptible() into wait_event() into a couple of places it
looks to deal with the fact that signals weren't being blocked. This
results in an idle domU showing a load-average of 2, which was messing
up some work-management tools.

The attached patch blocks all signals for the xenbus and xenwatch
daemons, instead.

Signed-off-by: John Byrne <john.l.byrne@xxxxxx>


diff -Nar -U4 linux-2.4.21/drivers/xen/xenbus/xenbus_comms.c 
linux-2.4.21/drivers/xen/xenbus/xenbus_comms.c
--- linux-2.4.21/drivers/xen/xenbus/xenbus_comms.c      2007-02-23 
14:46:17.000000000 -0600
+++ linux-2.4.21/drivers/xen/xenbus/xenbus_comms.c      2007-02-23 
14:54:55.000000000 -0600
@@ -149,9 +149,9 @@
        while (len != 0) {
                unsigned int avail;
                const char *src;
 
-               wait_event/*_interruptible*/(xb_waitq,
+               wait_event_interruptible(xb_waitq,
                                         intf->rsp_cons != intf->rsp_prod);
 
                /* Read indexes, then verify. */
                cons = intf->rsp_cons;
diff -Nar -U4 linux-2.4.21/drivers/xen/xenbus/xenbus_xs.c 
linux-2.4.21/drivers/xen/xenbus/xenbus_xs.c
--- linux-2.4.21/drivers/xen/xenbus/xenbus_xs.c 2007-02-23 14:46:17.000000000 
-0600
+++ linux-2.4.21/drivers/xen/xenbus/xenbus_xs.c 2007-02-23 14:53:53.000000000 
-0600
@@ -45,8 +45,21 @@
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
 #include <linux/module.h>
 #include <linux/uio.h>
 #define kvec iovec
+
+static void block_signals(void)
+{
+       sigset_t blocked;
+
+       sigfillset(&blocked);
+       spin_lock_irq(&current->sighand->siglock);
+       current->blocked = blocked;
+       recalc_sigpending();
+       spin_unlock_irq(&current->sighand->siglock);
+       flush_signals(current);
+}
+
 #endif
 
 /* xenbus_probe.c */
 extern char *kasprintf(const char *fmt, ...);
@@ -712,8 +722,9 @@
        struct xs_stored_msg *msg;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
        daemonize();
+       block_signals();
        memcpy(current->comm, "xenwatch", 10);
 #endif
 
 
@@ -724,11 +735,10 @@
                schedule();
 #endif
 
        for (;;) {
-               /* XXXAP _interruptable spins here after killall */
-               wait_event(watch_events_waitq,
-                          !list_empty(&watch_events));
+               wait_event_interruptible(watch_events_waitq,
+                                        !list_empty(&watch_events));
 
 #if 0                          /* XXXAP 2.4 */
                if (kthread_should_stop())
                        break;
@@ -827,8 +837,9 @@
        int err;
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
        daemonize();
+       block_signals();
        memcpy(current->comm, "xenbus", 8);
 #endif
 
 #ifdef CONFIG_HOTPLUG_CPU
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

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