xen/evtchn: don't do unbind_from_irqhandler under spinlock
[pandora-kernel.git] / drivers / xen / evtchn.c
index f79ac5c..6a3a129 100644 (file)
@@ -375,10 +375,12 @@ static long evtchn_ioctl(struct file *file,
                        break;
                }
 
-               evtchn_unbind_from_user(u, unbind.port);
+               disable_irq(irq_from_evtchn(unbind.port));
 
                spin_unlock_irq(&port_user_lock);
 
+               evtchn_unbind_from_user(u, unbind.port);
+
                rc = 0;
                break;
        }
@@ -484,11 +486,18 @@ static int evtchn_release(struct inode *inode, struct file *filp)
                if (get_port_user(i) != u)
                        continue;
 
-               evtchn_unbind_from_user(get_port_user(i), i);
+               disable_irq(irq_from_evtchn(i));
        }
 
        spin_unlock_irq(&port_user_lock);
 
+       for (i = 0; i < NR_EVENT_CHANNELS; i++) {
+               if (get_port_user(i) != u)
+                       continue;
+
+               evtchn_unbind_from_user(get_port_user(i), i);
+       }
+
        kfree(u->name);
        kfree(u);