mirror of
https://github.com/adulau/aha.git
synced 2025-01-03 14:43:17 +00:00
x86, intr-remap: fix ack for interrupt remapping
Shouldn't call ack_apic_edge() in ir_ack_apic_edge(), because ack_apic_edge() does more than just ack: it also does irq migration in the non-interrupt-remapping case. But there is no such need for interrupt-remapping case, as irq migration is done in the process context. Similarly, ir_ack_apic_level() shouldn't call ack_apic_level, and instead should do the local cpu's EOI + directed EOI to the io-apic. ack_x2APIC_irq() is not neccessary, because ack_APIC_irq() will use MSR write for x2apic, and uncached write for non-x2apic. [ Impact: simplify/standardize intr-remap IRQ acking, fix on !x2apic ] Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Weidong Han <weidong.han@intel.com> Acked-by: David Woodhouse <David.Woodhouse@intel.com> Cc: iommu@lists.linux-foundation.org Cc: allen.m.kay@intel.com Cc: fenghua.yu@intel.com LKML-Reference: <1239957736-6161-3-git-send-email-weidong.han@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
2b2fd87a6e
commit
5d0ae2db6d
2 changed files with 5 additions and 35 deletions
|
@ -204,14 +204,6 @@ static inline int x2apic_enabled(void)
|
||||||
|
|
||||||
extern int get_physical_broadcast(void);
|
extern int get_physical_broadcast(void);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_X2APIC
|
|
||||||
static inline void ack_x2APIC_irq(void)
|
|
||||||
{
|
|
||||||
/* Docs say use 0 for future compatibility */
|
|
||||||
native_apic_msr_write(APIC_EOI, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void apic_disable(void);
|
extern void apic_disable(void);
|
||||||
extern int lapic_get_maxlvt(void);
|
extern int lapic_get_maxlvt(void);
|
||||||
extern void clear_local_APIC(void);
|
extern void clear_local_APIC(void);
|
||||||
|
|
|
@ -2552,20 +2552,6 @@ eoi_ioapic_irq(struct irq_desc *desc)
|
||||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
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);
|
|
||||||
ack_x2APIC_irq();
|
|
||||||
eoi_ioapic_irq(desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ack_x2apic_edge(unsigned int irq)
|
|
||||||
{
|
|
||||||
ack_x2APIC_irq();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void ack_apic_edge(unsigned int irq)
|
static void ack_apic_edge(unsigned int irq)
|
||||||
{
|
{
|
||||||
struct irq_desc *desc = irq_to_desc(irq);
|
struct irq_desc *desc = irq_to_desc(irq);
|
||||||
|
@ -2629,9 +2615,6 @@ static void ack_apic_level(unsigned int irq)
|
||||||
*/
|
*/
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
|
|
||||||
if (irq_remapped(irq))
|
|
||||||
eoi_ioapic_irq(desc);
|
|
||||||
|
|
||||||
/* Now we can move and renable the irq */
|
/* Now we can move and renable the irq */
|
||||||
if (unlikely(do_unmask_irq)) {
|
if (unlikely(do_unmask_irq)) {
|
||||||
/* Only migrate the irq if the ack has been received.
|
/* Only migrate the irq if the ack has been received.
|
||||||
|
@ -2680,20 +2663,15 @@ static void ack_apic_level(unsigned int irq)
|
||||||
#ifdef CONFIG_INTR_REMAP
|
#ifdef CONFIG_INTR_REMAP
|
||||||
static void ir_ack_apic_edge(unsigned int irq)
|
static void ir_ack_apic_edge(unsigned int irq)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_X2APIC
|
ack_APIC_irq();
|
||||||
if (x2apic_enabled())
|
|
||||||
return ack_x2apic_edge(irq);
|
|
||||||
#endif
|
|
||||||
return ack_apic_edge(irq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ir_ack_apic_level(unsigned int irq)
|
static void ir_ack_apic_level(unsigned int irq)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_X2APIC
|
struct irq_desc *desc = irq_to_desc(irq);
|
||||||
if (x2apic_enabled())
|
|
||||||
return ack_x2apic_level(irq);
|
ack_APIC_irq();
|
||||||
#endif
|
eoi_ioapic_irq(desc);
|
||||||
return ack_apic_level(irq);
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_INTR_REMAP */
|
#endif /* CONFIG_INTR_REMAP */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue