--- /dev/null
+--- linux-2.6.22-630/kernel/sched.c.orig 2008-04-23 17:09:21.000000000 -0400
++++ linux-2.6.22-630/kernel/sched.c 2008-04-23 17:10:23.000000000 -0400
+@@ -3656,6 +3656,10 @@
+ /* CHOPSTIX */
+ #endif
+
++/* Bypass the vx_unhold infinite loop */
++unsigned int merry;
++EXPORT_SYMBOL(merry);
++
+ asmlinkage void __sched schedule(void)
+ {
+ struct task_struct *prev, *next;
+@@ -3740,14 +3744,22 @@
+
+ cpu = smp_processor_id();
+ vx_set_rq_time(rq, jiffies);
++
++ merry=0;
+ try_unhold:
+ vx_try_unhold(rq, cpu);
+ pick_next:
+
+ if (unlikely(!rq->nr_running)) {
+ /* can we skip idle time? */
+- if (vx_try_skip(rq, cpu))
++ if (vx_try_skip(rq, cpu) && merry<10) {
++ merry++;
+ goto try_unhold;
++ }
++ else if (merry==10) {
++ BUG();
++ }
++
+
+ idle_balance(cpu, rq);
+ if (!rq->nr_running) {