diff options
| author | Linus Torvalds <[email protected]> | 2017-07-03 16:50:31 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2017-07-03 16:50:31 -0700 | 
| commit | 03ffbcdd7898c0b5299efeb9f18de927487ec1cf (patch) | |
| tree | 0569222e4dc9db22049d7d8d15920cc085a194f6 /arch/x86/kernel/irq.c | |
| parent | 1b044f1cfc65a7d90b209dfabd57e16d98b58c5b (diff) | |
| parent | f9632de40ee0161e864bea8c1b017d957fd7312c (diff) | |
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner:
 "The irq department delivers:
   - Expand the generic infrastructure handling the irq migration on CPU
     hotplug and convert X86 over to it. (Thomas Gleixner)
     Aside of consolidating code this is a preparatory change for:
   - Finalizing the affinity management for multi-queue devices. The
     main change here is to shut down interrupts which are affine to a
     outgoing CPU and reenabling them when the CPU comes online again.
     That avoids moving interrupts pointlessly around and breaking and
     reestablishing affinities for no value. (Christoph Hellwig)
     Note: This contains also the BLOCK-MQ and NVME changes which depend
     on the rework of the irq core infrastructure. Jens acked them and
     agreed that they should go with the irq changes.
   - Consolidation of irq domain code (Marc Zyngier)
   - State tracking consolidation in the core code (Jeffy Chen)
   - Add debug infrastructure for hierarchical irq domains (Thomas
     Gleixner)
   - Infrastructure enhancement for managing generic interrupt chips via
     devmem (Bartosz Golaszewski)
   - Constification work all over the place (Tobias Klauser)
   - Two new interrupt controller drivers for MVEBU (Thomas Petazzoni)
   - The usual set of fixes, updates and enhancements all over the
     place"
* 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (112 commits)
  irqchip/or1k-pic: Fix interrupt acknowledgement
  irqchip/irq-mvebu-gicp: Allocate enough memory for spi_bitmap
  irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity
  nvme: Allocate queues for all possible CPUs
  blk-mq: Create hctx for each present CPU
  blk-mq: Include all present CPUs in the default queue mapping
  genirq: Avoid unnecessary low level irq function calls
  genirq: Set irq masked state when initializing irq_desc
  genirq/timings: Add infrastructure for estimating the next interrupt arrival time
  genirq/timings: Add infrastructure to track the interrupt timings
  genirq/debugfs: Remove pointless NULL pointer check
  irqchip/gic-v3-its: Don't assume GICv3 hardware supports 16bit INTID
  irqchip/gic-v3-its: Add ACPI NUMA node mapping
  irqchip/gic-v3-its-platform-msi: Make of_device_ids const
  irqchip/gic-v3-its: Make of_device_ids const
  irqchip/irq-mvebu-icu: Add new driver for Marvell ICU
  irqchip/irq-mvebu-gicp: Add new driver for Marvell GICP
  dt-bindings/interrupt-controller: Add DT binding for the Marvell ICU
  genirq/irqdomain: Remove auto-recursive hierarchy support
  irqchip/MSI: Use irq_domain_update_bus_token instead of an open coded access
  ...
Diffstat (limited to 'arch/x86/kernel/irq.c')
| -rw-r--r-- | arch/x86/kernel/irq.c | 78 | 
1 files changed, 2 insertions, 76 deletions
| diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index f34fe7444836..4aa03c5a14c9 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -432,84 +432,12 @@ int check_irq_vectors_for_cpu_disable(void)  /* A cpu has been removed from cpu_online_mask.  Reset irq affinities. */  void fixup_irqs(void)  { -	unsigned int irq, vector; -	static int warned; +	unsigned int irr, vector;  	struct irq_desc *desc;  	struct irq_data *data;  	struct irq_chip *chip; -	int ret; -	for_each_irq_desc(irq, desc) { -		int break_affinity = 0; -		int set_affinity = 1; -		const struct cpumask *affinity; - -		if (!desc) -			continue; -		if (irq == 2) -			continue; - -		/* interrupt's are disabled at this point */ -		raw_spin_lock(&desc->lock); - -		data = irq_desc_get_irq_data(desc); -		affinity = irq_data_get_affinity_mask(data); -		if (!irq_has_action(irq) || irqd_is_per_cpu(data) || -		    cpumask_subset(affinity, cpu_online_mask)) { -			raw_spin_unlock(&desc->lock); -			continue; -		} - -		/* -		 * Complete the irq move. This cpu is going down and for -		 * non intr-remapping case, we can't wait till this interrupt -		 * arrives at this cpu before completing the irq move. -		 */ -		irq_force_complete_move(desc); - -		if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { -			break_affinity = 1; -			affinity = cpu_online_mask; -		} - -		chip = irq_data_get_irq_chip(data); -		/* -		 * The interrupt descriptor might have been cleaned up -		 * already, but it is not yet removed from the radix tree -		 */ -		if (!chip) { -			raw_spin_unlock(&desc->lock); -			continue; -		} - -		if (!irqd_can_move_in_process_context(data) && chip->irq_mask) -			chip->irq_mask(data); - -		if (chip->irq_set_affinity) { -			ret = chip->irq_set_affinity(data, affinity, true); -			if (ret == -ENOSPC) -				pr_crit("IRQ %d set affinity failed because there are no available vectors.  The device assigned to this IRQ is unstable.\n", irq); -		} else { -			if (!(warned++)) -				set_affinity = 0; -		} - -		/* -		 * We unmask if the irq was not marked masked by the -		 * core code. That respects the lazy irq disable -		 * behaviour. -		 */ -		if (!irqd_can_move_in_process_context(data) && -		    !irqd_irq_masked(data) && chip->irq_unmask) -			chip->irq_unmask(data); - -		raw_spin_unlock(&desc->lock); - -		if (break_affinity && set_affinity) -			pr_notice("Broke affinity for irq %i\n", irq); -		else if (!set_affinity) -			pr_notice("Cannot set affinity for irq %i\n", irq); -	} +	irq_migrate_all_off_this_cpu();  	/*  	 * We can remove mdelay() and then send spuriuous interrupts to @@ -528,8 +456,6 @@ void fixup_irqs(void)  	 * nothing else will touch it.  	 */  	for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { -		unsigned int irr; -  		if (IS_ERR_OR_NULL(__this_cpu_read(vector_irq[vector])))  			continue; |