|
@@ -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);
|
|
|
|