mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
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@citrix.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Stable Kernel <stable@kernel.org>
This commit is contained in:
parent
f6eafe3665
commit
fed5ea87e0
1 changed files with 3 additions and 0 deletions
|
@ -474,6 +474,9 @@ static void unbind_from_irq(unsigned int irq)
|
||||||
bind_evtchn_to_cpu(evtchn, 0);
|
bind_evtchn_to_cpu(evtchn, 0);
|
||||||
|
|
||||||
evtchn_to_irq[evtchn] = -1;
|
evtchn_to_irq[evtchn] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (irq_info[irq].type != IRQT_UNBOUND) {
|
||||||
irq_info[irq] = mk_unbound_info();
|
irq_info[irq] = mk_unbound_info();
|
||||||
|
|
||||||
dynamic_irq_cleanup(irq);
|
dynamic_irq_cleanup(irq);
|
||||||
|
|
Loading…
Reference in a new issue