diff options
-rw-r--r-- | drivers/xen/evtchn.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c index 4ebd501f1f80..45c8efaa6b3e 100644 --- a/drivers/xen/evtchn.c +++ b/drivers/xen/evtchn.c | |||
@@ -269,6 +269,14 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port) | |||
269 | u->name, (void *)(unsigned long)port); | 269 | u->name, (void *)(unsigned long)port); |
270 | if (rc >= 0) | 270 | if (rc >= 0) |
271 | rc = evtchn_make_refcounted(port); | 271 | rc = evtchn_make_refcounted(port); |
272 | else { | ||
273 | /* bind failed, should close the port now */ | ||
274 | struct evtchn_close close; | ||
275 | close.port = port; | ||
276 | if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) | ||
277 | BUG(); | ||
278 | set_port_user(port, NULL); | ||
279 | } | ||
272 | 280 | ||
273 | return rc; | 281 | return rc; |
274 | } | 282 | } |
@@ -277,6 +285,8 @@ static void evtchn_unbind_from_user(struct per_user_data *u, int port) | |||
277 | { | 285 | { |
278 | int irq = irq_from_evtchn(port); | 286 | int irq = irq_from_evtchn(port); |
279 | 287 | ||
288 | BUG_ON(irq < 0); | ||
289 | |||
280 | unbind_from_irqhandler(irq, (void *)(unsigned long)port); | 290 | unbind_from_irqhandler(irq, (void *)(unsigned long)port); |
281 | 291 | ||
282 | set_port_user(port, NULL); | 292 | set_port_user(port, NULL); |