This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


[Xen-devel] [PATCH] xen: don't leak IRQs over suspend/resume.

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] xen: don't leak IRQs over suspend/resume.
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Tue, 1 Dec 2009 16:15:30 +0000
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>, Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 01 Dec 2009 08:15:52 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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()

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

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

Xen-devel mailing list

<Prev in Thread] Current Thread [Next in Thread>