mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-03 15:55:38 +00:00

Before a CPU is taken offline the number of active interrupt vectors on the outgoing CPU and the number of vectors which are available on the other online CPUs are counted and compared. If the active vectors are more than the available vectors on the other CPUs then the CPU hot-unplug operation is aborted. This again uses loop based search and is inaccurate. The bitmap matrix allocator has accurate accounting information and can tell exactly whether the vector space is sufficient or not. Emit a message when the number of globaly reserved (unallocated) vectors is larger than the number of available vectors after offlining a CPU because after that point request_irq() might fail. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Juergen Gross <jgross@suse.com> Tested-by: Yu Chen <yu.c.chen@intel.com> Acked-by: Juergen Gross <jgross@suse.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Alok Kataria <akataria@vmware.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Rui Zhang <rui.zhang@intel.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Len Brown <lenb@kernel.org> Link: https://lkml.kernel.org/r/20170913213156.351193962@linutronix.de
49 lines
1.1 KiB
C
49 lines
1.1 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_32
|
|
extern void irq_ctx_init(int cpu);
|
|
#else
|
|
# define irq_ctx_init(cpu) do { } while (0)
|
|
#endif
|
|
|
|
#define __ARCH_HAS_DO_SOFTIRQ
|
|
|
|
struct irq_desc;
|
|
|
|
extern void fixup_irqs(void);
|
|
|
|
#ifdef CONFIG_HAVE_KVM
|
|
extern void kvm_set_posted_intr_wakeup_handler(void (*handler)(void));
|
|
#endif
|
|
|
|
extern void (*x86_platform_ipi_callback)(void);
|
|
extern void native_init_IRQ(void);
|
|
|
|
extern bool handle_irq(struct irq_desc *desc, struct pt_regs *regs);
|
|
|
|
extern __visible unsigned int do_IRQ(struct pt_regs *regs);
|
|
|
|
extern void init_ISA_irqs(void);
|
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
void arch_trigger_cpumask_backtrace(const struct cpumask *mask,
|
|
bool exclude_self);
|
|
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
|
|
#endif
|
|
|
|
#endif /* _ASM_X86_IRQ_H */
|