lkml.org 
[lkml]   [2009]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[094/151] xen: dont leak IRQs over suspend/resume.
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Ian Campbell <ian.campbell@citrix.com>

    commit fed5ea87e02aaf902ff38c65b4514233db03dc09 upstream.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/xen/events.c | 3 +++
    1 file changed, 3 insertions(+)

    --- a/drivers/xen/events.c
    +++ b/drivers/xen/events.c
    @@ -474,6 +474,9 @@ static void unbind_from_irq(unsigned int
    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);



    \
     
     \ /
      Last update: 2009-12-17 05:25    [W:4.554 / U:2.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site