diff options
Diffstat (limited to 'arch/x86/kernel/apic')
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/msi.c | 18 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/vector.c | 23 | 
3 files changed, 22 insertions, 29 deletions
| diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index ce61e3e7d399..81ffcfbfaef2 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2316,12 +2316,12 @@ static int mp_irqdomain_create(int ioapic)  	ip->irqdomain = irq_domain_create_linear(fn, hwirqs, cfg->ops,  						 (void *)(long)ioapic); -	/* Release fw handle if it was allocated above */ -	if (!cfg->dev) -		irq_domain_free_fwnode(fn); - -	if (!ip->irqdomain) +	if (!ip->irqdomain) { +		/* Release fw handle if it was allocated above */ +		if (!cfg->dev) +			irq_domain_free_fwnode(fn);  		return -ENOMEM; +	}  	ip->irqdomain->parent = parent; diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c index 5cbaca58af95..c2b2911feeef 100644 --- a/arch/x86/kernel/apic/msi.c +++ b/arch/x86/kernel/apic/msi.c @@ -263,12 +263,13 @@ void __init arch_init_msi_domain(struct irq_domain *parent)  		msi_default_domain =  			pci_msi_create_irq_domain(fn, &pci_msi_domain_info,  						  parent); -		irq_domain_free_fwnode(fn);  	} -	if (!msi_default_domain) +	if (!msi_default_domain) { +		irq_domain_free_fwnode(fn);  		pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n"); -	else +	} else {  		msi_default_domain->flags |= IRQ_DOMAIN_MSI_NOMASK_QUIRK; +	}  }  #ifdef CONFIG_IRQ_REMAP @@ -301,7 +302,8 @@ struct irq_domain *arch_create_remap_msi_irq_domain(struct irq_domain *parent,  	if (!fn)  		return NULL;  	d = pci_msi_create_irq_domain(fn, &pci_msi_ir_domain_info, parent); -	irq_domain_free_fwnode(fn); +	if (!d) +		irq_domain_free_fwnode(fn);  	return d;  }  #endif @@ -364,7 +366,8 @@ static struct irq_domain *dmar_get_irq_domain(void)  	if (fn) {  		dmar_domain = msi_create_irq_domain(fn, &dmar_msi_domain_info,  						    x86_vector_domain); -		irq_domain_free_fwnode(fn); +		if (!dmar_domain) +			irq_domain_free_fwnode(fn);  	}  out:  	mutex_unlock(&dmar_lock); @@ -489,7 +492,10 @@ struct irq_domain *hpet_create_irq_domain(int hpet_id)  	}  	d = msi_create_irq_domain(fn, domain_info, parent); -	irq_domain_free_fwnode(fn); +	if (!d) { +		irq_domain_free_fwnode(fn); +		kfree(domain_info); +	}  	return d;  } diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index c48be6e1f676..7649da2478d8 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c @@ -446,12 +446,10 @@ static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd,  	trace_vector_activate(irqd->irq, apicd->is_managed,  			      apicd->can_reserve, reserve); -	/* Nothing to do for fixed assigned vectors */ -	if (!apicd->can_reserve && !apicd->is_managed) -		return 0; -  	raw_spin_lock_irqsave(&vector_lock, flags); -	if (reserve || irqd_is_managed_and_shutdown(irqd)) +	if (!apicd->can_reserve && !apicd->is_managed) +		assign_irq_vector_any_locked(irqd); +	else if (reserve || irqd_is_managed_and_shutdown(irqd))  		vector_assign_managed_shutdown(irqd);  	else if (apicd->is_managed)  		ret = activate_managed(irqd); @@ -709,7 +707,6 @@ int __init arch_early_irq_init(void)  	x86_vector_domain = irq_domain_create_tree(fn, &x86_vector_domain_ops,  						   NULL);  	BUG_ON(x86_vector_domain == NULL); -	irq_domain_free_fwnode(fn);  	irq_set_default_host(x86_vector_domain);  	arch_init_msi_domain(x86_vector_domain); @@ -775,20 +772,10 @@ void lapic_offline(void)  static int apic_set_affinity(struct irq_data *irqd,  			     const struct cpumask *dest, bool force)  { -	struct apic_chip_data *apicd = apic_chip_data(irqd);  	int err; -	/* -	 * Core code can call here for inactive interrupts. For inactive -	 * interrupts which use managed or reservation mode there is no -	 * point in going through the vector assignment right now as the -	 * activation will assign a vector which fits the destination -	 * cpumask. Let the core code store the destination mask and be -	 * done with it. -	 */ -	if (!irqd_is_activated(irqd) && -	    (apicd->is_managed || apicd->can_reserve)) -		return IRQ_SET_MASK_OK; +	if (WARN_ON_ONCE(!irqd_is_activated(irqd))) +		return -EIO;  	raw_spin_lock(&vector_lock);  	cpumask_and(vector_searchmask, dest, cpu_online_mask); |