|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] [PATCH] xen: don't leak IRQs over suspend/resume.
On resume irq_info[*].evtchn is reset to 0 since event channel mappings are not
preserved over suspend/resume. The other contents of irq_info is preserved to
allow rebind_evtchn_irq() to function.
However when a device resumes it will try to unbind from the previous IRQ (e.g.
blkfront goes blkfront_resume() -> blkif_free() -> unbind_from_irqhandler() ->
unbind_from_irq()). This will fail due to the check for VALID_EVTCHN in
unbind_from_irq() and the IRQ is leaked. The device will then continue to
resume and allocate a new IRQ, eventually leading to find_unbound_irq()
panic()ing.
Fix this by changing unbind_from_irq() to handle teardown of interrupts which
have type!=IRQT_UNBOUND but are not currently bound to a specific event
channel.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
---
drivers/xen/events.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index adc8c09..951f993 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -888,6 +888,9 @@ static void unbind_from_irq(unsigned int irq)
bind_evtchn_to_cpu(evtchn, 0);
evtchn_to_irq[evtchn] = -1;
+ }
+
+ if (irq_info[irq].type != IRQT_UNBOUND) {
irq_info[irq] = mk_unbound_info();
dynamic_irq_cleanup(irq);
--
1.5.6.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
<Prev in Thread] |
Current Thread |
[Next in Thread>
|
- [Xen-devel] [PATCH] xen: don't leak IRQs over suspend/resume.,
Ian Campbell <=
|
|
|
|
|