Commit 0580e22a authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] generic irq subsystem: x86_64 port

x86_64 port of generic hardirq handling.
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d31d4e52
...@@ -329,6 +329,12 @@ config X86_MCE ...@@ -329,6 +329,12 @@ config X86_MCE
endmenu endmenu
#
# Use the generic interrupt handling code in kernel/hardirq.c:
#
config GENERIC_HARDIRQS
bool
default y
menu "Power management options" menu "Power management options"
......
This diff is collapsed.
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/threads.h> #include <linux/threads.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <asm/pda.h> #include <asm/pda.h>
#include <asm/apic.h>
#define __ARCH_IRQ_STAT 1 #define __ARCH_IRQ_STAT 1
...@@ -15,47 +16,24 @@ ...@@ -15,47 +16,24 @@
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
/* /*
* We put the hardirq and softirq counter into the preemption * 'what should we do if we get a hw irq event on an illegal vector'.
* counter. The bitmask has the following meaning: * each architecture has to answer this themselves.
*
* - bits 0-7 are the preemption count (max preemption depth: 256)
* - bits 8-15 are the softirq count (max # of softirqs: 256)
* - bits 16-23 are the hardirq count (max # of hardirqs: 256)
*
* - ( bit 26 is the PREEMPT_ACTIVE flag. )
*
* PREEMPT_MASK: 0x000000ff
* HARDIRQ_MASK: 0x0000ff00
* SOFTIRQ_MASK: 0x00ff0000
*/ */
static inline void ack_bad_irq(unsigned int irq)
#define PREEMPT_BITS 8 {
#define SOFTIRQ_BITS 8 #ifdef CONFIG_X86
#define HARDIRQ_BITS 8 printk("unexpected IRQ trap at vector %02x\n", irq);
#ifdef CONFIG_X86_LOCAL_APIC
#define PREEMPT_SHIFT 0 /*
#define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) * Currently unexpected vectors happen only on SMP and APIC.
#define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS) * 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
* The hardirq mask has to be large enough to have * unexpected vectors occur) that might lock up the APIC
* space for potentially all IRQ sources in the system * completely.
* nesting on a single CPU: */
*/ ack_APIC_irq();
#if (1 << HARDIRQ_BITS) < NR_IRQS
# error HARDIRQ_BITS is too low!
#endif #endif
#endif
#define nmi_enter() (irq_enter()) }
#define nmi_exit() (preempt_count() -= HARDIRQ_OFFSET)
#define irq_enter() (preempt_count() += HARDIRQ_OFFSET)
#define irq_exit() \
do { \
preempt_count() -= IRQ_EXIT_OFFSET; \
if (!in_interrupt() && softirq_pending(smp_processor_id())) \
do_softirq(); \
preempt_enable_no_resched(); \
} while (0)
#endif /* __ASM_HARDIRQ_H */ #endif /* __ASM_HARDIRQ_H */
...@@ -44,11 +44,6 @@ static __inline__ int irq_canonicalize(int irq) ...@@ -44,11 +44,6 @@ static __inline__ int irq_canonicalize(int irq)
return ((irq == 2) ? 9 : irq); return ((irq == 2) ? 9 : irq);
} }
extern void disable_irq(unsigned int);
extern void disable_irq_nosync(unsigned int);
extern void enable_irq(unsigned int);
extern int can_request_irq(unsigned int, unsigned long flags);
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
#define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ #define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment