Merge tag 'irq-urgent-2024-11-03' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Thomas Gleixner: - Fix an off-by-one error in the failure path of msi_domain_alloc(), which causes the cleanup loop to terminate early and leaking the first allocated interrupt. - Handle a corner case in GIC-V4 versus a lazily mapped Virtual Processing Element (VPE). If the VPE has not been mapped because the guest has not yet emitted a mapping command, then the set_affinity() callback returns an error code, which causes the vCPU management to fail. Return success in this case without touching the hardware. This will be done later when the guest issues the mapping command. * tag 'irq-urgent-2024-11-03' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip/gic-v4: Correctly deal with set_affinity on lazily-mapped VPEs genirq/msi: Fix off-by-one error in msi_domain_alloc()
This commit is contained in:
@@ -3810,8 +3810,18 @@ static int its_vpe_set_affinity(struct irq_data *d,
|
||||
* Check if we're racing against a VPE being destroyed, for
|
||||
* which we don't want to allow a VMOVP.
|
||||
*/
|
||||
if (!atomic_read(&vpe->vmapp_count))
|
||||
return -EINVAL;
|
||||
if (!atomic_read(&vpe->vmapp_count)) {
|
||||
if (gic_requires_eager_mapping())
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* If we lazily map the VPEs, this isn't an error and
|
||||
* we can exit cleanly.
|
||||
*/
|
||||
cpu = cpumask_first(mask_val);
|
||||
irq_data_update_effective_affinity(d, cpumask_of(cpu));
|
||||
return IRQ_SET_MASK_OK_DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Changing affinity is mega expensive, so let's be as lazy as
|
||||
|
||||
+1
-1
@@ -718,7 +718,7 @@ static int msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
|
||||
ret = ops->msi_init(domain, info, virq + i, hwirq + i, arg);
|
||||
if (ret < 0) {
|
||||
if (ops->msi_free) {
|
||||
for (i--; i > 0; i--)
|
||||
for (i--; i >= 0; i--)
|
||||
ops->msi_free(domain, info, virq + i);
|
||||
}
|
||||
irq_domain_free_irqs_top(domain, virq, nr_irqs);
|
||||
|
||||
Reference in New Issue
Block a user