lkml.org 
[lkml]   [2005]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: 2.6.13-rc6-rt9
    From
    Date
    On Thu, 2005-08-18 at 08:01 +0200, Ingo Molnar wrote:
    > i have released the 2.6.13-rc6-rt9 tree, which can be downloaded from
    > the usual place:

    Hi Ingo,

    finally found the deadlock. It was caused by IRQ flood, which was
    introduced by the end_irq() changes.

    They change the semantics in two ways - both wrong.

    1. The condition is different
    2. ->end() can contain different code than ->enable()

    That's the code in end_8259A_irq():

    if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) &&
    irq_desc[irq].action)
    enable_8259A_irq(irq);

    The code in end_irq():

    if (!(desc->status & IRQ_DISABLED))
    desc->handler->enable(irq);


    What was the reason for those changes ?

    tglx


    diff -uprN --exclude-from=/usr/local/bin/diffit.exclude
    linux-2.6.13-rc6-rt8/kernel/irq/handle.c
    linux-2.6.13-rc6-rt-debug/kernel/irq/handle.c
    --- linux-2.6.13-rc6-rt8/kernel/irq/handle.c 2005-08-17
    17:53:13.000000000 +0200
    +++ linux-2.6.13-rc6-rt-debug/kernel/irq/handle.c 2005-08-18
    16:32:54.000000000 +0200
    @@ -171,7 +171,7 @@ fastcall notrace unsigned int __do_IRQ(u
    */
    desc->handler->ack(irq);
    action_ret = handle_IRQ_event(irq, regs, desc->action);
    - end_irq(desc, irq);
    + desc->handler->end(irq);
    return 1;
    }

    @@ -241,7 +241,7 @@ out:
    * The end-handler has to deal with interrupts which got
    * disabled while the handler was running:
    */
    - end_irq(desc, irq);
    + desc->handler->end(irq);
    out_no_end:
    spin_unlock(&desc->lock);
    diff -uprN --exclude-from=/usr/local/bin/diffit.exclude linux-2.6.13-rc6-rt8/kernel/irq/internals.h linux-2.6.13-rc6-rt-debug/kernel/irq/internals.h
    --- linux-2.6.13-rc6-rt8/kernel/irq/internals.h 2005-08-17 17:53:13.000000000 +0200
    +++ linux-2.6.13-rc6-rt-debug/kernel/irq/internals.h 2005-08-18 16:39:56.000000000 +0200
    @@ -6,21 +6,6 @@ extern int noirqdebug;

    void recalculate_desc_flags(struct irq_desc *desc);

    -/*
    - * On PREEMPT_HARDIRQS, the ->ack handler masks interrupts, so that
    - * they can be redirected to an IRQ thread, if needed. So here we
    - * have to unmask the interrupt line, if needed:
    - */
    -static inline void end_irq(irq_desc_t *desc, unsigned int irq)
    -{
    -#ifdef CONFIG_PREEMPT_HARDIRQS
    - if (!(desc->status & IRQ_DISABLED))
    - desc->handler->enable(irq);
    -#else
    - desc->handler->end(irq);
    -#endif
    -}
    -
    #ifdef CONFIG_PROC_FS
    extern void register_irq_proc(unsigned int irq);
    extern void register_handler_proc(unsigned int irq, struct irqaction *action);
    diff -uprN --exclude-from=/usr/local/bin/diffit.exclude linux-2.6.13-rc6-rt8/kernel/irq/manage.c linux-2.6.13-rc6-rt-debug/kernel/irq/manage.c
    --- linux-2.6.13-rc6-rt8/kernel/irq/manage.c 2005-08-17 17:53:13.000000000 +0200
    +++ linux-2.6.13-rc6-rt-debug/kernel/irq/manage.c 2005-08-18 16:31:46.000000000 +0200
    @@ -442,7 +442,7 @@ static void do_hardirq(struct irq_desc *
    * The end-handler has to deal with interrupts which got
    * disabled while the handler was running:
    */
    - end_irq(desc, irq);
    + desc->handler->end(irq);
    }
    spin_unlock_irq(&desc->lock);


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-08-18 17:44    [W:3.393 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site