diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-03-30 17:35:14 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-03-30 17:35:14 -0700 | 
| commit | 2d385336afcc43732aef1d51528c03f177ecd54e (patch) | |
| tree | fff0780aea481a225c4d3460aad286c8e95aa1e7 /arch | |
| parent | 673b41e04a035d760bc0aff83fa9ee24fd9c2779 (diff) | |
| parent | 8a13b02a010a743ea0725e9a5454f42cddb65cf0 (diff) | |
| download | linux-2d385336afcc43732aef1d51528c03f177ecd54e.tar.bz2 | |
Merge tag 'irq-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner:
 "Updates for the interrupt subsystem:
  Treewide:
    - Cleanup of setup_irq() which is not longer required because the
      memory allocator is available early.
      Most cleanup changes come through the various maintainer trees, so
      the final removal of setup_irq() is postponed towards the end of
      the merge window.
  Core:
    - Protection against unsafe invocation of interrupt handlers and
      unsafe interrupt injection including a fixup of the offending
      PCI/AER error injection mechanism.
      Invoking interrupt handlers from arbitrary contexts, i.e. outside
      of an actual interrupt, can cause inconsistent state on the
      fragile x86 interrupt affinity changing hardware trainwreck.
  Drivers:
    - Second wave of support for the new ARM GICv4.1
    - Multi-instance support for Xilinx and PLIC interrupt controllers
    - CPU-Hotplug support for PLIC
    - The obligatory new driver for X1000 TCU
    - Enhancements, cleanups and fixes all over the place"
* tag 'irq-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (58 commits)
  unicore32: Replace setup_irq() by request_irq()
  sh: Replace setup_irq() by request_irq()
  hexagon: Replace setup_irq() by request_irq()
  c6x: Replace setup_irq() by request_irq()
  alpha: Replace setup_irq() by request_irq()
  irqchip/gic-v4.1: Eagerly vmap vPEs
  irqchip/gic-v4.1: Add VSGI property setup
  irqchip/gic-v4.1: Add VSGI allocation/teardown
  irqchip/gic-v4.1: Move doorbell management to the GICv4 abstraction layer
  irqchip/gic-v4.1: Plumb set_vcpu_affinity SGI callbacks
  irqchip/gic-v4.1: Plumb get/set_irqchip_state SGI callbacks
  irqchip/gic-v4.1: Plumb mask/unmask SGI callbacks
  irqchip/gic-v4.1: Add initial SGI configuration
  irqchip/gic-v4.1: Plumb skeletal VSGI irqchip
  irqchip/stm32: Retrigger both in eoi and unmask callbacks
  irqchip/gic-v3: Move irq_domain_update_bus_token to after checking for NULL domain
  irqchip/xilinx: Do not call irq_set_default_host()
  irqchip/xilinx: Enable generic irq multi handler
  irqchip/xilinx: Fill error code when irq domain registration fails
  irqchip/xilinx: Add support for multiple instances
  ...
Diffstat (limited to 'arch')
27 files changed, 76 insertions, 134 deletions
| diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index da3e10d5f7fe..d17e44c99df9 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c @@ -213,32 +213,13 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,   * The special RTC interrupt type.  The interrupt itself was   * processed by PALcode, and comes in via entInt vector 1.   */ - -struct irqaction timer_irqaction = { -	.handler	= rtc_timer_interrupt, -	.name		= "timer", -}; -  void __init -init_rtc_irq(void) +init_rtc_irq(irq_handler_t handler)  {  	irq_set_chip_and_handler_name(RTC_IRQ, &dummy_irq_chip,  				      handle_percpu_irq, "RTC"); -	setup_irq(RTC_IRQ, &timer_irqaction); +	if (!handler) +		handler = rtc_timer_interrupt; +	if (request_irq(RTC_IRQ, handler, 0, "timer", NULL)) +		pr_err("Failed to register timer interrupt\n");  } - -/* Dummy irqactions.  */ -struct irqaction isa_cascade_irqaction = { -	.handler	= no_action, -	.name		= "isa-cascade" -}; - -struct irqaction timer_cascade_irqaction = { -	.handler	= no_action, -	.name		= "timer-cascade" -}; - -struct irqaction halt_switch_irqaction = { -	.handler	= no_action, -	.name		= "halt-switch" -}; diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 5d54c076a8ae..1dcf0d9038fd 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c @@ -82,11 +82,6 @@ struct irq_chip i8259a_irq_type = {  void __init  init_i8259a_irqs(void)  { -	static struct irqaction cascade = { -		.handler	= no_action, -		.name		= "cascade", -	}; -  	long i;  	outb(0xff, 0x21);	/* mask all of 8259A-1 */ @@ -96,7 +91,8 @@ init_i8259a_irqs(void)  		irq_set_chip_and_handler(i, &i8259a_irq_type, handle_level_irq);  	} -	setup_irq(2, &cascade); +	if (request_irq(2, no_action, 0, "cascade", NULL)) +		pr_err("Failed to request irq 2 (cascade)\n");  } diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index 16f2b0276f3a..fbf21892e66d 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h @@ -21,14 +21,9 @@ extern void isa_no_iack_sc_device_interrupt(unsigned long);  extern void srm_device_interrupt(unsigned long);  extern void pyxis_device_interrupt(unsigned long); -extern struct irqaction timer_irqaction; -extern struct irqaction isa_cascade_irqaction; -extern struct irqaction timer_cascade_irqaction; -extern struct irqaction halt_switch_irqaction; -  extern void init_srm_irqs(long, unsigned long);  extern void init_pyxis_irqs(unsigned long); -extern void init_rtc_irq(void); +extern void init_rtc_irq(irq_handler_t  handler);  extern void common_init_isa_dma(void); diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index a968b10e687d..27070b5bd33e 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c @@ -107,5 +107,6 @@ init_pyxis_irqs(unsigned long ignore_mask)  		irq_set_status_flags(i, IRQ_LEVEL);  	} -	setup_irq(16+7, &isa_cascade_irqaction); +	if (request_irq(16 + 7, no_action, 0, "isa-cascade", NULL)) +		pr_err("Failed to register isa-cascade interrupt\n");  } diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index e56efd5b855f..ce5430056f65 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -133,7 +133,8 @@ alcor_init_irq(void)  	init_i8259a_irqs();  	common_init_isa_dma(); -	setup_irq(16+31, &isa_cascade_irqaction); +	if (request_irq(16 + 31, no_action, 0, "isa-cascade", NULL)) +		pr_err("Failed to register isa-cascade interrupt\n");  } diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index 10bc46a4ec40..0aa6a27d0e2f 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c @@ -112,7 +112,8 @@ common_init_irq(void (*srm_dev_int)(unsigned long v))  	}  	common_init_isa_dma(); -	setup_irq(16+4, &isa_cascade_irqaction); +	if (request_irq(16 + 4, no_action, 0, "isa-cascade", NULL)) +		pr_err("Failed to register isa-cascade interrupt\n");  }  #ifndef CONFIG_ALPHA_PC164 diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 5251937ec1b4..1cdfe55fb987 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c @@ -123,7 +123,8 @@ eb64p_init_irq(void)  	}  	common_init_isa_dma(); -	setup_irq(16+5, &isa_cascade_irqaction); +	if (request_irq(16 + 5, no_action, 0, "isa-cascade", NULL)) +		pr_err("Failed to register isa-cascade interrupt\n");  }  /* diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 8d34cf6e002a..533899a4a1a1 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c @@ -397,7 +397,7 @@ marvel_init_pci(void)  static void __init  marvel_init_rtc(void)  { -	init_rtc_irq(); +	init_rtc_irq(NULL);  }  static void diff --git a/arch/alpha/kernel/sys_miata.c b/arch/alpha/kernel/sys_miata.c index 6fa07dc5339d..702292af2225 100644 --- a/arch/alpha/kernel/sys_miata.c +++ b/arch/alpha/kernel/sys_miata.c @@ -81,8 +81,10 @@ miata_init_irq(void)  	init_pyxis_irqs(0x63b0000);  	common_init_isa_dma(); -	setup_irq(16+2, &halt_switch_irqaction);	/* SRM only? */ -	setup_irq(16+6, &timer_cascade_irqaction); +	if (request_irq(16 + 2, no_action, 0, "halt-switch", NULL)) +		pr_err("Failed to register halt-switch interrupt\n"); +	if (request_irq(16 + 6, no_action, 0, "timer-cascade", NULL)) +		pr_err("Failed to register timer-cascade interrupt\n");  } diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index 07830cccabf9..d33074011960 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c @@ -82,7 +82,8 @@ ruffian_init_rtc(void)  	outb(0x31, 0x42);  	outb(0x13, 0x42); -	setup_irq(0, &timer_irqaction); +	if (request_irq(0, rtc_timer_interrupt, 0, "timer", NULL)) +		pr_err("Failed to request irq 0 (timer)\n");  }  static void diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index a3db719d3c38..4d85eaeb44aa 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c @@ -106,7 +106,8 @@ rx164_init_irq(void)  	init_i8259a_irqs();  	common_init_isa_dma(); -	setup_irq(16+20, &isa_cascade_irqaction); +	if (request_irq(16 + 20, no_action, 0, "isa-cascade", NULL)) +		pr_err("Failed to register isa-cascade interrupt\n");  } diff --git a/arch/alpha/kernel/sys_sx164.c b/arch/alpha/kernel/sys_sx164.c index 1ec638a2746a..17cc203176c8 100644 --- a/arch/alpha/kernel/sys_sx164.c +++ b/arch/alpha/kernel/sys_sx164.c @@ -54,7 +54,8 @@ sx164_init_irq(void)  	else  		init_pyxis_irqs(0xff00003f0000UL); -	setup_irq(16+6, &timer_cascade_irqaction); +	if (request_irq(16 + 6, no_action, 0, "timer-cascade", NULL)) +		pr_err("Failed to register timer-cascade interrupt\n");  }  /* diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 8e64052811ab..2191bde161fd 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c @@ -156,10 +156,6 @@ static void __init  wildfire_init_irq_per_pca(int qbbno, int pcano)  {  	int i, irq_bias; -	static struct irqaction isa_enable = { -		.handler	= no_action, -		.name		= "isa_enable", -	};  	irq_bias = qbbno * (WILDFIRE_PCA_PER_QBB * WILDFIRE_IRQ_PER_PCA)  		 + pcano * WILDFIRE_IRQ_PER_PCA; @@ -198,7 +194,8 @@ wildfire_init_irq_per_pca(int qbbno, int pcano)  		irq_set_status_flags(i + irq_bias, IRQ_LEVEL);  	} -	setup_irq(32+irq_bias, &isa_enable); +	if (request_irq(32 + irq_bias, no_action, 0, "isa_enable", NULL)) +		pr_err("Failed to register isa_enable interrupt\n");  }  static void __init diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 0069360697ee..4d01c392ab14 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -242,7 +242,7 @@ common_init_rtc(void)  	outb(0x31, 0x42);  	outb(0x13, 0x42); -	init_rtc_irq(); +	init_rtc_irq(NULL);  } @@ -396,9 +396,7 @@ time_init(void)  	if (alpha_using_qemu) {  		clocksource_register_hz(&qemu_cs, NSEC_PER_SEC);  		init_qemu_clockevent(); - -		timer_irqaction.handler = qemu_timer_interrupt; -		init_rtc_irq(); +		init_rtc_irq(qemu_timer_interrupt);  		return;  	} diff --git a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c index 947ef7981d92..c98ebae1aeac 100644 --- a/arch/arm/common/sa1111.c +++ b/arch/arm/common/sa1111.c @@ -302,10 +302,13 @@ static int sa1111_retrigger_irq(struct irq_data *d)  			break;  	} -	if (i == 8) +	if (i == 8) {  		pr_err("Danger Will Robinson: failed to re-trigger IRQ%d\n",  		       d->irq); -	return i == 8 ? -1 : 0; +		return 0; +	} + +	return 1;  }  static int sa1111_type_irq(struct irq_data *d, unsigned int flags) diff --git a/arch/c6x/platforms/timer64.c b/arch/c6x/platforms/timer64.c index d98d94303498..661f4c7c6ef6 100644 --- a/arch/c6x/platforms/timer64.c +++ b/arch/c6x/platforms/timer64.c @@ -165,13 +165,6 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static struct irqaction timer_iact = { -	.name		= "timer", -	.flags		= IRQF_TIMER, -	.handler	= timer_interrupt, -	.dev_id		= &t64_clockevent_device, -}; -  void __init timer64_init(void)  {  	struct clock_event_device *cd = &t64_clockevent_device; @@ -238,7 +231,9 @@ void __init timer64_init(void)  	cd->cpumask		= cpumask_of(smp_processor_id());  	clockevents_register_device(cd); -	setup_irq(cd->irq, &timer_iact); +	if (request_irq(cd->irq, timer_interrupt, IRQF_TIMER, "timer", +			&t64_clockevent_device)) +		pr_err("Failed to request irq %d (timer)\n", cd->irq);  out:  	of_node_put(np); diff --git a/arch/hexagon/kernel/smp.c b/arch/hexagon/kernel/smp.c index 0bbbe652a513..619c56420aa0 100644 --- a/arch/hexagon/kernel/smp.c +++ b/arch/hexagon/kernel/smp.c @@ -114,12 +114,6 @@ void send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg)  	local_irq_restore(flags);  } -static struct irqaction ipi_intdesc = { -	.handler = handle_ipi, -	.flags = IRQF_TRIGGER_RISING, -	.name = "ipi_handler" -}; -  void __init smp_prepare_boot_cpu(void)  {  } @@ -132,8 +126,8 @@ void __init smp_prepare_boot_cpu(void)  void start_secondary(void)  { -	unsigned int cpu;  	unsigned long thread_ptr; +	unsigned int cpu, irq;  	/*  Calculate thread_info pointer from stack pointer  */  	__asm__ __volatile__( @@ -155,7 +149,10 @@ void start_secondary(void)  	cpu = smp_processor_id(); -	setup_irq(BASE_IPI_IRQ + cpu, &ipi_intdesc); +	irq = BASE_IPI_IRQ + cpu; +	if (request_irq(irq, handle_ipi, IRQF_TRIGGER_RISING, "ipi_handler", +			NULL)) +		pr_err("Failed to request irq %u (ipi_handler)\n", irq);  	/*  Register the clock_event dummy  */  	setup_percpu_clockdev(); @@ -201,7 +198,7 @@ void __init smp_cpus_done(unsigned int max_cpus)  void __init smp_prepare_cpus(unsigned int max_cpus)  { -	int i; +	int i, irq = BASE_IPI_IRQ;  	/*  	 * should eventually have some sort of machine @@ -213,8 +210,11 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  		set_cpu_present(i, true);  	/*  Also need to register the interrupts for IPI  */ -	if (max_cpus > 1) -		setup_irq(BASE_IPI_IRQ, &ipi_intdesc); +	if (max_cpus > 1) { +		if (request_irq(irq, handle_ipi, IRQF_TRIGGER_RISING, +				"ipi_handler", NULL)) +			pr_err("Failed to request irq %d (ipi_handler)\n", irq); +	}  }  void smp_send_reschedule(int cpu) diff --git a/arch/hexagon/kernel/time.c b/arch/hexagon/kernel/time.c index f99e9257bed4..feffe527ac92 100644 --- a/arch/hexagon/kernel/time.c +++ b/arch/hexagon/kernel/time.c @@ -143,13 +143,6 @@ static irqreturn_t timer_interrupt(int irq, void *devid)  	return IRQ_HANDLED;  } -/*  This should also be pulled from devtree  */ -static struct irqaction rtos_timer_intdesc = { -	.handler = timer_interrupt, -	.flags = IRQF_TIMER | IRQF_TRIGGER_RISING, -	.name = "rtos_timer" -}; -  /*   * time_init_deferred - called by start_kernel to set up timer/clock source   * @@ -163,6 +156,7 @@ void __init time_init_deferred(void)  {  	struct resource *resource = NULL;  	struct clock_event_device *ce_dev = &hexagon_clockevent_dev; +	unsigned long flag = IRQF_TIMER | IRQF_TRIGGER_RISING;  	ce_dev->cpumask = cpu_all_mask; @@ -195,7 +189,8 @@ void __init time_init_deferred(void)  #endif  	clockevents_register_device(ce_dev); -	setup_irq(ce_dev->irq, &rtos_timer_intdesc); +	if (request_irq(ce_dev->irq, timer_interrupt, flag, "rtos_timer", NULL)) +		pr_err("Failed to register rtos_timer interrupt\n");  }  void __init time_init(void) diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 6a331bd57ea8..242f58ec086b 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -47,6 +47,8 @@ config MICROBLAZE  	select CPU_NO_EFFICIENT_FFS  	select MMU_GATHER_NO_RANGE if MMU  	select SPARSE_IRQ +	select GENERIC_IRQ_MULTI_HANDLER +	select HANDLE_DOMAIN_IRQ  # Endianness selection  choice diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h index eac2fb4b3fb9..5166f0893e2b 100644 --- a/arch/microblaze/include/asm/irq.h +++ b/arch/microblaze/include/asm/irq.h @@ -14,7 +14,4 @@  struct pt_regs;  extern void do_IRQ(struct pt_regs *regs); -/* should be defined in each interrupt controller driver */ -extern unsigned int xintc_get_irq(void); -  #endif /* _ASM_MICROBLAZE_IRQ_H */ diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c index 903dad822fad..0b37dde60a1e 100644 --- a/arch/microblaze/kernel/irq.c +++ b/arch/microblaze/kernel/irq.c @@ -20,29 +20,10 @@  #include <linux/irqchip.h>  #include <linux/of_irq.h> -static u32 concurrent_irq; -  void __irq_entry do_IRQ(struct pt_regs *regs)  { -	unsigned int irq; -	struct pt_regs *old_regs = set_irq_regs(regs);  	trace_hardirqs_off(); - -	irq_enter(); -	irq = xintc_get_irq(); -next_irq: -	BUG_ON(!irq); -	generic_handle_irq(irq); - -	irq = xintc_get_irq(); -	if (irq != -1U) { -		pr_debug("next irq: %d\n", irq); -		++concurrent_irq; -		goto next_irq; -	} - -	irq_exit(); -	set_irq_regs(old_regs); +	handle_arch_irq(regs);  	trace_hardirqs_on();  } diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c index ffb3d94bf0cc..55ea614d89bf 100644 --- a/arch/riscv/kernel/traps.c +++ b/arch/riscv/kernel/traps.c @@ -157,5 +157,5 @@ void __init trap_init(void)  	/* Set the exception vector address */  	csr_write(CSR_TVEC, &handle_exception);  	/* Enable interrupts */ -	csr_write(CSR_IE, IE_SIE | IE_EIE); +	csr_write(CSR_IE, IE_SIE);  } diff --git a/arch/sh/boards/mach-cayman/irq.c b/arch/sh/boards/mach-cayman/irq.c index 3b6ea2d99013..0305d0b51730 100644 --- a/arch/sh/boards/mach-cayman/irq.c +++ b/arch/sh/boards/mach-cayman/irq.c @@ -40,16 +40,6 @@ static irqreturn_t cayman_interrupt_pci2(int irq, void *dev_id)  	return IRQ_NONE;  } -static struct irqaction cayman_action_smsc = { -	.name		= "Cayman SMSC Mux", -	.handler	= cayman_interrupt_smsc, -}; - -static struct irqaction cayman_action_pci2 = { -	.name		= "Cayman PCI2 Mux", -	.handler	= cayman_interrupt_pci2, -}; -  static void enable_cayman_irq(struct irq_data *data)  {  	unsigned int irq = data->irq; @@ -149,6 +139,10 @@ void init_cayman_irq(void)  	}  	/* Setup the SMSC interrupt */ -	setup_irq(SMSC_IRQ, &cayman_action_smsc); -	setup_irq(PCI2_IRQ, &cayman_action_pci2); +	if (request_irq(SMSC_IRQ, cayman_interrupt_smsc, 0, "Cayman SMSC Mux", +			NULL)) +		pr_err("Failed to register Cayman SMSC Mux interrupt\n"); +	if (request_irq(PCI2_IRQ, cayman_interrupt_pci2, 0, "Cayman PCI2 Mux", +			NULL)) +		pr_err("Failed to register Cayman PCI2 Mux interrupt\n");  } diff --git a/arch/sh/drivers/dma/dma-pvr2.c b/arch/sh/drivers/dma/dma-pvr2.c index b5dbd1f75768..21c347543e19 100644 --- a/arch/sh/drivers/dma/dma-pvr2.c +++ b/arch/sh/drivers/dma/dma-pvr2.c @@ -64,11 +64,6 @@ static int pvr2_xfer_dma(struct dma_channel *chan)  	return 0;  } -static struct irqaction pvr2_dma_irq = { -	.name		= "pvr2 DMA handler", -	.handler	= pvr2_dma_interrupt, -}; -  static struct dma_ops pvr2_dma_ops = {  	.request	= pvr2_request_dma,  	.get_residue	= pvr2_get_dma_residue, @@ -84,7 +79,9 @@ static struct dma_info pvr2_dma_info = {  static int __init pvr2_dma_init(void)  { -	setup_irq(HW_EVENT_PVR2_DMA, &pvr2_dma_irq); +	if (request_irq(HW_EVENT_PVR2_DMA, pvr2_dma_interrupt, 0, +			"pvr2 DMA handler", NULL)) +		pr_err("Failed to register pvr2 DMA handler interrupt\n");  	request_dma(PVR2_CASCADE_CHAN, "pvr2 cascade");  	return register_dmac(&pvr2_dma_info); diff --git a/arch/unicore32/kernel/time.c b/arch/unicore32/kernel/time.c index 8b217a761bf0..c3a37edf4d40 100644 --- a/arch/unicore32/kernel/time.c +++ b/arch/unicore32/kernel/time.c @@ -72,13 +72,6 @@ static struct clocksource cksrc_puv3_oscr = {  	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,  }; -static struct irqaction puv3_timer_irq = { -	.name		= "ost0", -	.flags		= IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= puv3_ost0_interrupt, -	.dev_id		= &ckevt_puv3_osmr0, -}; -  void __init time_init(void)  {  	writel(0, OST_OIER);		/* disable any timer interrupts */ @@ -94,7 +87,9 @@ void __init time_init(void)  	ckevt_puv3_osmr0.min_delta_ticks = MIN_OSCR_DELTA * 2;  	ckevt_puv3_osmr0.cpumask = cpumask_of(0); -	setup_irq(IRQ_TIMER0, &puv3_timer_irq); +	if (request_irq(IRQ_TIMER0, puv3_ost0_interrupt, +			IRQF_TIMER | IRQF_IRQPOLL, "ost0", &ckevt_puv3_osmr0)) +		pr_err("Failed to register ost0 interrupt\n");  	clocksource_register_hz(&cksrc_puv3_oscr, CLOCK_TICK_RATE);  	clockevents_register_device(&ckevt_puv3_osmr0); diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index cb3633d243cb..51da546e0745 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -128,6 +128,7 @@ config X86  	select GENERIC_GETTIMEOFDAY  	select GENERIC_VDSO_TIME_NS  	select GUP_GET_PTE_LOW_HIGH		if X86_PAE +	select HARDIRQS_SW_RESEND  	select HARDLOCKUP_CHECK_TIMESTAMP	if X86_64  	select HAVE_ACPI_APEI			if ACPI  	select HAVE_ACPI_APEI_NMI		if ACPI diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index 48293d15f1e1..67768e54438b 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c @@ -557,6 +557,12 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq,  		irqd->hwirq = virq + i;  		irqd_set_single_target(irqd);  		/* +		 * Prevent that any of these interrupts is invoked in +		 * non interrupt context via e.g. generic_handle_irq() +		 * as that can corrupt the affinity move state. +		 */ +		irqd_set_handle_enforce_irqctx(irqd); +		/*  		 * Legacy vectors are already assigned when the IOAPIC  		 * takes them over. They stay on the same vector. This is  		 * required for check_timer() to work correctly as it might |