Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 19785
b: refs/heads/master
c: 3777a95
h: refs/heads/master
i:
  19783: 9d47ac5
v: v3
  • Loading branch information
Andi Kleen authored and Linus Torvalds committed Feb 5, 2006
1 parent 23108c1 commit c5f0f13
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 21 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7f66ae48de27bc9506cff0f2991d74901a0c2f8d
refs/heads/master: 3777a95903953c55f2309a89679b73c19ae5535b
5 changes: 4 additions & 1 deletion trunk/arch/i386/kernel/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,10 @@ void ack_bad_irq(unsigned int irq)
* holds up an irq slot - in excessive cases (when multiple
* unexpected vectors occur) that might lock up the APIC
* completely.
* But only ack when the APIC is enabled -AK
*/
ack_APIC_irq();
if (!cpu_has_apic)
ack_APIC_irq();
}

void __init apic_intr_init(void)
Expand Down Expand Up @@ -1303,6 +1305,7 @@ int __init APIC_init_uniprocessor (void)
if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
boot_cpu_physical_apicid);
clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
return -1;
}

Expand Down
20 changes: 20 additions & 0 deletions trunk/arch/x86_64/kernel/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,26 @@ int get_maxlvt(void)
return maxlvt;
}

/*
* 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves.
*/
void ack_bad_irq(unsigned int irq)
{
printk("unexpected IRQ trap at vector %02x\n", irq);
/*
* Currently unexpected vectors happen only on SMP and APIC.
* We _must_ ack these because every local APIC has only N
* irq slots per priority level, and a 'hanging, unacked' IRQ
* holds up an irq slot - in excessive cases (when multiple
* unexpected vectors occur) that might lock up the APIC
* completely.
* But don't ack when the APIC is disabled. -AK
*/
if (!disable_apic)
ack_APIC_irq();
}

void clear_local_APIC(void)
{
int maxlvt;
Expand Down
21 changes: 2 additions & 19 deletions trunk/include/asm-x86_64/hardirq.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,6 @@
#define set_softirq_pending(x) write_pda(__softirq_pending, (x))
#define or_softirq_pending(x) or_pda(__softirq_pending, (x))

/*
* 'what should we do if we get a hw irq event on an illegal vector'.
* each architecture has to answer this themselves.
*/
static inline void ack_bad_irq(unsigned int irq)
{
printk("unexpected IRQ trap at vector %02x\n", irq);
#ifdef CONFIG_X86_LOCAL_APIC
/*
* Currently unexpected vectors happen only on SMP and APIC.
* We _must_ ack these because every local APIC has only N
* irq slots per priority level, and a 'hanging, unacked' IRQ
* holds up an irq slot - in excessive cases (when multiple
* unexpected vectors occur) that might lock up the APIC
* completely.
*/
ack_APIC_irq();
#endif
}
extern void ack_bad_irq(unsigned int irq);

#endif /* __ASM_HARDIRQ_H */

0 comments on commit c5f0f13

Please sign in to comment.