lkml.org 
[lkml]   [2009]   [Apr]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] x86, intr-remap: fix eoi for interrupt remapping without x2apic
    Date
    To simplify level irq migration in the presence of interrupt-remapping,
    Suresh used a virtual vector (io-apic pin number) to eliminate io-apic
    RTE modification. level triggered interrupt will appear as an edge to
    the local apic cpu but still as level to the IO-APIC. So in addition to
    do the local apic EOI, it still needs to do IO-APIC directed EOI to clear
    the remote IRR bit in the IO-APIC RTE. Pls refer to Suresh's patch for
    more details (commit 0280f7c416c652a2fd95d166f52b199ae61122c0).

    Now interrupt remapping is decoupled from x2apic, it also needs to do the
    directed EOI for apic. Otherwise, apic interrupts won't work correctly.

    Signed-off-by: Weidong Han <weidong.han@intel.com>
    ---
    arch/x86/kernel/apic/io_apic.c | 5 ++++-
    1 files changed, 4 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
    index 767fe7e..a2789e4 100644
    --- a/arch/x86/kernel/apic/io_apic.c
    +++ b/arch/x86/kernel/apic/io_apic.c
    @@ -2524,7 +2524,6 @@ static void irq_complete_move(struct irq_desc **descp)
    static inline void irq_complete_move(struct irq_desc **descp) {}
    #endif

    -#ifdef CONFIG_X86_X2APIC
    static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
    {
    int apic, pin;
    @@ -2558,6 +2557,7 @@ eoi_ioapic_irq(struct irq_desc *desc)
    spin_unlock_irqrestore(&ioapic_lock, flags);
    }

    +#ifdef CONFIG_X86_X2APIC
    static void ack_x2apic_level(unsigned int irq)
    {
    struct irq_desc *desc = irq_to_desc(irq);
    @@ -2634,6 +2634,9 @@ static void ack_apic_level(unsigned int irq)
    */
    ack_APIC_irq();

    + if (irq_remapped(irq))
    + eoi_ioapic_irq(desc);
    +
    /* Now we can move and renable the irq */
    if (unlikely(do_unmask_irq)) {
    /* Only migrate the irq if the ack has been received.
    --
    1.6.0.4


    \
     
     \ /
      Last update: 2009-04-10 11:19    [W:4.729 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site