forked from mirrors/linux
		
	Arm TC2 fails cpu hotplug stress test.
This issue was tracked down to a missing copy of the new affinity
cpumask for the vexpress-spc interrupt into struct
irq_common_data.affinity when the interrupt is migrated in
migrate_one_irq().
Fix it by replacing the arm specific hotplug cpu migration with the
generic irq code.
This is the counterpart implementation to commit 217d453d47 ("arm64:
fix a migrating irq bug when hotplug cpu").
Tested with cpu hotplug stress test on Arm TC2 (multi_v7_defconfig plus
CONFIG_ARM_BIG_LITTLE_CPUFREQ=y and CONFIG_ARM_VEXPRESS_SPC_CPUFREQ=y).
The vexpress-spc interrupt (irq=22) on this board is affine to CPU0.
Its affinity cpumask now changes correctly e.g. from 0 to 1-4 when
CPU0 is hotplugged out.
Suggested-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
		
	
			
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			859 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			859 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef __ASM_ARM_IRQ_H
 | 
						|
#define __ASM_ARM_IRQ_H
 | 
						|
 | 
						|
#define NR_IRQS_LEGACY	16
 | 
						|
 | 
						|
#ifndef CONFIG_SPARSE_IRQ
 | 
						|
#include <mach/irqs.h>
 | 
						|
#else
 | 
						|
#define NR_IRQS NR_IRQS_LEGACY
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef irq_canonicalize
 | 
						|
#define irq_canonicalize(i)	(i)
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * Use this value to indicate lack of interrupt
 | 
						|
 * capability
 | 
						|
 */
 | 
						|
#ifndef NO_IRQ
 | 
						|
#define NO_IRQ	((unsigned int)(-1))
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef __ASSEMBLY__
 | 
						|
struct irqaction;
 | 
						|
struct pt_regs;
 | 
						|
 | 
						|
extern void asm_do_IRQ(unsigned int, struct pt_regs *);
 | 
						|
void handle_IRQ(unsigned int, struct pt_regs *);
 | 
						|
void init_IRQ(void);
 | 
						|
 | 
						|
#ifdef CONFIG_SMP
 | 
						|
extern void arch_trigger_cpumask_backtrace(const cpumask_t *mask,
 | 
						|
					   bool exclude_self);
 | 
						|
#define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace
 | 
						|
#endif
 | 
						|
 | 
						|
static inline int nr_legacy_irqs(void)
 | 
						|
{
 | 
						|
	return NR_IRQS_LEGACY;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 | 
						|
 |