a5e74b8419
When a cpu goes offline, fixup_irqs() try to move irq's currently destined to the offline cpu to a new cpu. But this attempt will fail if the irq is recently moved to this cpu and the irq still hasn't arrived at this cpu (for non intr-remapping platforms this is when we free the vector allocation at the previous destination) that is about to go offline. This will endup with the interrupt subsystem still pointing the irq to the offline cpu, causing that irq to not work any more. Fix this by forcing the irq to complete its move (its been a long time we moved the irq to this cpu which we are offlining now) and then move this irq to a new cpu before this cpu goes offline. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Acked-by: Gary Hade <garyhade@us.ibm.com> Cc: Eric W. Biederman <ebiederm@xmission.com> LKML-Reference: <20091026230001.848830905@sbs-t61.sc.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
#ifndef _ASM_X86_IRQ_H
|
|
#define _ASM_X86_IRQ_H
|
|
/*
|
|
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
|
*
|
|
* IRQ/IPI changes taken from work by Thomas Radke
|
|
* <tomsoft@informatik.tu-chemnitz.de>
|
|
*/
|
|
|
|
#include <asm/apicdef.h>
|
|
#include <asm/irq_vectors.h>
|
|
|
|
static inline int irq_canonicalize(int irq)
|
|
{
|
|
return ((irq == 2) ? 9 : irq);
|
|
}
|
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
# define ARCH_HAS_NMI_WATCHDOG
|
|
#endif
|
|
|
|
#ifdef CONFIG_4KSTACKS
|
|
extern void irq_ctx_init(int cpu);
|
|
extern void irq_ctx_exit(int cpu);
|
|
# define __ARCH_HAS_DO_SOFTIRQ
|
|
#else
|
|
# define irq_ctx_init(cpu) do { } while (0)
|
|
# define irq_ctx_exit(cpu) do { } while (0)
|
|
# ifdef CONFIG_X86_64
|
|
# define __ARCH_HAS_DO_SOFTIRQ
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
#include <linux/cpumask.h>
|
|
extern void fixup_irqs(void);
|
|
extern void irq_force_complete_move(int);
|
|
#endif
|
|
|
|
extern void (*generic_interrupt_extension)(void);
|
|
extern void native_init_IRQ(void);
|
|
extern bool handle_irq(unsigned irq, struct pt_regs *regs);
|
|
|
|
extern unsigned int do_IRQ(struct pt_regs *regs);
|
|
|
|
/* Interrupt vector management */
|
|
extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
|
|
extern int vector_used_by_percpu_irq(unsigned int vector);
|
|
|
|
extern void init_ISA_irqs(void);
|
|
|
|
#endif /* _ASM_X86_IRQ_H */
|