Message ID | 154956051753.218871.1505640778712413716.stgit@bahia.lab.toulouse-stg.fr.ibm.com |
---|---|
State | New |
Headers | show |
Series | spapr_pci: Fix interrupt leak in rtas_ibm_change_msi() error path | expand |
On Thu, Feb 07, 2019 at 06:28:37PM +0100, Greg Kurz wrote: > 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: 4fe75a8ccd80 "spapr: split the IRQ allocation sequence" > Signed-off-by: Greg Kurz <groug@kaod.org> Applied to ppc-for-4.0, thanks. > --- > hw/ppc/spapr_pci.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > index 41d81f4a8500..6fe3c10c8d4c 100644 > --- a/hw/ppc/spapr_pci.c > +++ b/hw/ppc/spapr_pci.c > @@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, > for (i = 0; i < req_num; i++) { > spapr_irq_claim(spapr, irq + i, false, &err); > if (err) { > + if (i) { > + spapr_irq_free(spapr, irq, i + 1); > + } > + if (!smc->legacy_irq_allocation) { > + spapr_irq_msi_free(spapr, irq, req_num); > + } > error_reportf_err(err, "Can't allocate MSIs for device %x: ", > config_addr); > rtas_st(rets, 0, RTAS_OUT_HW_ERROR); >
On Fri, 8 Feb 2019 10:06:47 +1100 David Gibson <david@gibson.dropbear.id.au> wrote: > On Thu, Feb 07, 2019 at 06:28:37PM +0100, Greg Kurz wrote: > > 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: 4fe75a8ccd80 "spapr: split the IRQ allocation sequence" > > Signed-off-by: Greg Kurz <groug@kaod.org> > > Applied to ppc-for-4.0, thanks. > Oops I've just realized there's an off-by-one error... > > --- > > hw/ppc/spapr_pci.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > > index 41d81f4a8500..6fe3c10c8d4c 100644 > > --- a/hw/ppc/spapr_pci.c > > +++ b/hw/ppc/spapr_pci.c > > @@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, > > for (i = 0; i < req_num; i++) { > > spapr_irq_claim(spapr, irq + i, false, &err); > > if (err) { > > + if (i) { > > + spapr_irq_free(spapr, irq, i + 1); ... here. It should actually be: + spapr_irq_free(spapr, irq, i); Can you fix this in your tree or should I post a v2 ? > > + } > > + if (!smc->legacy_irq_allocation) { > > + spapr_irq_msi_free(spapr, irq, req_num); > > + } > > error_reportf_err(err, "Can't allocate MSIs for device %x: ", > > config_addr); > > rtas_st(rets, 0, RTAS_OUT_HW_ERROR); > > >
On Fri, Feb 08, 2019 at 12:15:03PM +0100, Greg Kurz wrote: > On Fri, 8 Feb 2019 10:06:47 +1100 > David Gibson <david@gibson.dropbear.id.au> wrote: > > > On Thu, Feb 07, 2019 at 06:28:37PM +0100, Greg Kurz wrote: > > > 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: 4fe75a8ccd80 "spapr: split the IRQ allocation sequence" > > > Signed-off-by: Greg Kurz <groug@kaod.org> > > > > Applied to ppc-for-4.0, thanks. > > > > Oops I've just realized there's an off-by-one error... > > > > --- > > > hw/ppc/spapr_pci.c | 6 ++++++ > > > 1 file changed, 6 insertions(+) > > > > > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > > > index 41d81f4a8500..6fe3c10c8d4c 100644 > > > --- a/hw/ppc/spapr_pci.c > > > +++ b/hw/ppc/spapr_pci.c > > > @@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, > > > for (i = 0; i < req_num; i++) { > > > spapr_irq_claim(spapr, irq + i, false, &err); > > > if (err) { > > > + if (i) { > > > + spapr_irq_free(spapr, irq, i + 1); > > ... here. It should actually be: > > + spapr_irq_free(spapr, irq, i); > > Can you fix this in your tree or should I post a v2 ? Fixed up inline. > > > > + } > > > + if (!smc->legacy_irq_allocation) { > > > + spapr_irq_msi_free(spapr, irq, req_num); > > > + } > > > error_reportf_err(err, "Can't allocate MSIs for device %x: ", > > > config_addr); > > > rtas_st(rets, 0, RTAS_OUT_HW_ERROR); > > > > > >
On Fri, 8 Feb 2019 22:33:36 +1100 David Gibson <david@gibson.dropbear.id.au> wrote: > On Fri, Feb 08, 2019 at 12:15:03PM +0100, Greg Kurz wrote: > > On Fri, 8 Feb 2019 10:06:47 +1100 > > David Gibson <david@gibson.dropbear.id.au> wrote: > > > > > On Thu, Feb 07, 2019 at 06:28:37PM +0100, Greg Kurz wrote: > > > > 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: 4fe75a8ccd80 "spapr: split the IRQ allocation sequence" > > > > Signed-off-by: Greg Kurz <groug@kaod.org> > > > > > > Applied to ppc-for-4.0, thanks. > > > > > > > Oops I've just realized there's an off-by-one error... > > > > > > --- > > > > hw/ppc/spapr_pci.c | 6 ++++++ > > > > 1 file changed, 6 insertions(+) > > > > > > > > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > > > > index 41d81f4a8500..6fe3c10c8d4c 100644 > > > > --- a/hw/ppc/spapr_pci.c > > > > +++ b/hw/ppc/spapr_pci.c > > > > @@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, > > > > for (i = 0; i < req_num; i++) { > > > > spapr_irq_claim(spapr, irq + i, false, &err); > > > > if (err) { > > > > + if (i) { > > > > + spapr_irq_free(spapr, irq, i + 1); > > > > ... here. It should actually be: > > > > + spapr_irq_free(spapr, irq, i); > > > > Can you fix this in your tree or should I post a v2 ? > > Fixed up inline. > Thanks ! > > > > > > + } > > > > + if (!smc->legacy_irq_allocation) { > > > > + spapr_irq_msi_free(spapr, irq, req_num); > > > > + } > > > > error_reportf_err(err, "Can't allocate MSIs for device %x: ", > > > > config_addr); > > > > rtas_st(rets, 0, RTAS_OUT_HW_ERROR); > > > > > > > > > > > >
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 41d81f4a8500..6fe3c10c8d4c 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -393,6 +393,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, for (i = 0; i < req_num; i++) { spapr_irq_claim(spapr, irq + i, false, &err); if (err) { + if (i) { + spapr_irq_free(spapr, irq, i + 1); + } + if (!smc->legacy_irq_allocation) { + spapr_irq_msi_free(spapr, irq, req_num); + } error_reportf_err(err, "Can't allocate MSIs for device %x: ", config_addr); rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
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: 4fe75a8ccd80 "spapr: split the IRQ allocation sequence" Signed-off-by: Greg Kurz <groug@kaod.org> --- hw/ppc/spapr_pci.c | 6 ++++++ 1 file changed, 6 insertions(+)