--- /dev/null
+From: http://xenbits.xensource.com/linux-2.6.18-xen.hg?rev/79e82ae1bad0
+# HG changeset 769 patch
+# User Keir Fraser <keir.fraser@citrix.com>
+# Date 1231154982 0
+# Node ID 79e82ae1bad02c0dfb504db3153599e52a0affb3
+# Parent cfb171ddbb333df9671a1da62e40122a56213ab4
+Subject: evtchn: Fix CPU offlining to switch all affected ports
+belonging to a particular /dev/evcthn user.
+Patch-mainline: obsolete
+
+Original patch by James Harper <james.harper@bendigoit.com.au>
+
+Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
+Acked-by: jbeulich@novell.com
+
+--- head-2009-01-06.orig/drivers/xen/evtchn/evtchn.c 2008-09-01 12:20:11.000000000 +0200
++++ head-2009-01-06/drivers/xen/evtchn/evtchn.c 2009-01-05 12:29:42.000000000 +0100
+@@ -497,20 +497,22 @@ static int __cpuinit evtchn_cpu_notify(s
+ {
+ int hotcpu = (unsigned long)hcpu;
+ cpumask_t map = cpu_online_map;
+- int port, newcpu;
++ int i, j, newcpu;
+ struct per_user_data *u;
+
+ switch (action) {
+ case CPU_DOWN_PREPARE:
+ cpu_clear(hotcpu, map);
+ spin_lock_irq(&port_user_lock);
+- for (port = 0; port < NR_EVENT_CHANNELS; port++) {
+- if ((u = port_user[port]) != NULL &&
+- u->bind_cpu == hotcpu &&
+- (newcpu = next_bind_cpu(map)) < NR_CPUS) {
+- rebind_evtchn_to_cpu(port, newcpu);
+- u->bind_cpu = newcpu;
+- }
++ for (i = 0; i < NR_EVENT_CHANNELS; i++) {
++ u = port_user[i];
++ if ((u == NULL) || (u->bind_cpu != hotcpu))
++ continue;
++ newcpu = next_bind_cpu(map);
++ for (j = i; j < NR_EVENT_CHANNELS; j++)
++ if (port_user[j] == u)
++ rebind_evtchn_to_cpu(j, newcpu);
++ u->bind_cpu = newcpu;
+ }
+ spin_unlock_irq(&port_user_lock);
+ break;