View | Details | Raw Unified | Return to bug 145366
Collapse All | Expand All

(-)linux/arch/x86_64/kernel/apic.c (+20 lines)
Lines 71-76 int get_maxlvt(void) Link Here
71
	return maxlvt;
71
	return maxlvt;
72
}
72
}
73
73
74
/*
75
 * 'what should we do if we get a hw irq event on an illegal vector'.
76
 * each architecture has to answer this themselves.
77
 */
78
void ack_bad_irq(unsigned int irq)
79
{
80
	printk("unexpected IRQ trap at vector %02x\n", irq);
81
	/*
82
	 * Currently unexpected vectors happen only on SMP and APIC.
83
	 * We _must_ ack these because every local APIC has only N
84
	 * irq slots per priority level, and a 'hanging, unacked' IRQ
85
	 * holds up an irq slot - in excessive cases (when multiple
86
	 * unexpected vectors occur) that might lock up the APIC
87
	 * completely.
88
  	 * But don't ack when the APIC is disabled. -AK
89
	 */
90
	if (!disable_apic)
91
		ack_APIC_irq();
92
}
93
74
void clear_local_APIC(void)
94
void clear_local_APIC(void)
75
{
95
{
76
	int maxlvt;
96
	int maxlvt;
(-)linux/include/asm-x86_64/hardirq.h (-19 / +2 lines)
Lines 16-38 Link Here
16
#define set_softirq_pending(x) write_pda(__softirq_pending, (x))
16
#define set_softirq_pending(x) write_pda(__softirq_pending, (x))
17
#define or_softirq_pending(x)  or_pda(__softirq_pending, (x))
17
#define or_softirq_pending(x)  or_pda(__softirq_pending, (x))
18
18
19
/*
19
extern void ack_bad_irq(unsigned int irq);
20
 * 'what should we do if we get a hw irq event on an illegal vector'.
20
21
 * each architecture has to answer this themselves.
22
 */
23
static inline void ack_bad_irq(unsigned int irq)
24
{
25
	printk("unexpected IRQ trap at vector %02x\n", irq);
26
#ifdef CONFIG_X86_LOCAL_APIC
27
	/*
28
	 * Currently unexpected vectors happen only on SMP and APIC.
29
	 * We _must_ ack these because every local APIC has only N
30
	 * irq slots per priority level, and a 'hanging, unacked' IRQ
31
	 * holds up an irq slot - in excessive cases (when multiple
32
	 * unexpected vectors occur) that might lock up the APIC
33
	 * completely.
34
	 */
35
	ack_APIC_irq();
36
#endif
37
}
38
#endif /* __ASM_HARDIRQ_H */
21
#endif /* __ASM_HARDIRQ_H */
(-)linux/arch/i386/kernel/apic.c (-1 / +4 lines)
Lines 75-82 void ack_bad_irq(unsigned int irq) Link Here
75
	 * holds up an irq slot - in excessive cases (when multiple
75
	 * holds up an irq slot - in excessive cases (when multiple
76
	 * unexpected vectors occur) that might lock up the APIC
76
	 * unexpected vectors occur) that might lock up the APIC
77
	 * completely.
77
	 * completely.
78
	 * But only ack when the APIC is enabled -AK
78
	 */
79
	 */
79
	ack_APIC_irq();
80
	if (!cpu_has_apic)
81
		ack_APIC_irq();
80
}
82
}
81
83
82
void __init apic_intr_init(void)
84
void __init apic_intr_init(void)
Lines 1303-1308 int __init APIC_init_uniprocessor (void) Link Here
1303
	if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
1305
	if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
1304
		printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
1306
		printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
1305
			boot_cpu_physical_apicid);
1307
			boot_cpu_physical_apicid);
1308
		clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
1306
		return -1;
1309
		return -1;
1307
	}
1310
	}
1308
1311

Return to bug 145366