spapr_pci: Fix interrupt leak in rtas_ibm_change_msi() error path
Now that IRQ allocation has been split in two (first allocate IRQ numbers,
then claim them), if the claiming fails, we must release the IRQs.
Fixes: 4fe75a8ccd
"spapr: split the IRQ allocation sequence"
Signed-off-by: Greg Kurz <groug@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
27a3ea7eff
commit
925969c3e2
@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
|
|||||||
for (i = 0; i < req_num; i++) {
|
for (i = 0; i < req_num; i++) {
|
||||||
spapr_irq_claim(spapr, irq + i, false, &err);
|
spapr_irq_claim(spapr, irq + i, false, &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
if (i) {
|
||||||
|
spapr_irq_free(spapr, irq, i);
|
||||||
|
}
|
||||||
|
if (!smc->legacy_irq_allocation) {
|
||||||
|
spapr_irq_msi_free(spapr, irq, req_num);
|
||||||
|
}
|
||||||
error_reportf_err(err, "Can't allocate MSIs for device %x: ",
|
error_reportf_err(err, "Can't allocate MSIs for device %x: ",
|
||||||
config_addr);
|
config_addr);
|
||||||
rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
|
rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
|
||||||
|
Loading…
Reference in New Issue
Block a user