diff options
author | Wei Liu <wei.liu2@citrix.com> | 2013-02-18 09:57:58 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-02-19 22:02:33 -0500 |
commit | e7e44e444876478d50630f57b0c31d29f6725020 (patch) | |
tree | 8b99f3a80c5ceaba647c5b64f59b0a1b5d5927d7 /drivers/xen/evtchn.c | |
parent | 18283ea7433c703d3fcce33d189b637a7aaf0a49 (diff) |
xen: close evtchn port if binding to irq fails
CC: stable@vger.kernel.org
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'drivers/xen/evtchn.c')
-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); |