Message ID | 20190128182556.34359-1-chris.brandt@renesas.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Series | [v2] serial: sh-sci: Do not free irqs that have already been freed | expand |
On Mon, Jan 28, 2019 at 01:25:56PM -0500, Chris Brandt wrote: > Since IRQs might be muxed on some parts, we need to pay attention when we > are freeing them. > Otherwise we get the ugly WARNING "Trying to free already-free IRQ 20". > > Fixes: 628c534ae735 ("serial: sh-sci: Improve support for separate TEI and DRI interrupts") > Signed-off-by: Chris Brandt <chris.brandt@renesas.com> Reviewed-by: Simon Horman <horms+renesas@verge.net.au> > --- > v2: > * fix bad commit grammer s/grammer/grammar/ :) > --- > drivers/tty/serial/sh-sci.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c > index cb3d5d37674f..060fcd42b6d5 100644 > --- a/drivers/tty/serial/sh-sci.c > +++ b/drivers/tty/serial/sh-sci.c > @@ -1936,7 +1936,7 @@ static int sci_request_irq(struct sci_port *port) > > static void sci_free_irq(struct sci_port *port) > { > - int i; > + int i, j; > > /* > * Intentionally in reverse order so we iterate over the muxed > @@ -1952,6 +1952,13 @@ static void sci_free_irq(struct sci_port *port) > if (unlikely(irq < 0)) > continue; > > + /* Check if already freed (irq was muxed) */ > + for (j = 0; j < i; j++) > + if (port->irqs[j] == irq) > + j = i + 1; > + if (j > i) > + continue; > + > free_irq(port->irqs[i], port); > kfree(port->irqstr[i]); > > -- > 2.16.1 >
Hi Chris, On Mon, Jan 28, 2019 at 7:26 PM Chris Brandt <chris.brandt@renesas.com> wrote: > Since IRQs might be muxed on some parts, we need to pay attention when we > are freeing them. > Otherwise we get the ugly WARNING "Trying to free already-free IRQ 20". > > Fixes: 628c534ae735 ("serial: sh-sci: Improve support for separate TEI and DRI interrupts") > Signed-off-by: Chris Brandt <chris.brandt@renesas.com> > --- > v2: Thanks for the update! Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > --- a/drivers/tty/serial/sh-sci.c > +++ b/drivers/tty/serial/sh-sci.c > @@ -1952,6 +1952,13 @@ static void sci_free_irq(struct sci_port *port) > if (unlikely(irq < 0)) > continue; > > + /* Check if already freed (irq was muxed) */ > + for (j = 0; j < i; j++) > + if (port->irqs[j] == irq) > + j = i + 1; > + if (j > i) > + continue; > + > free_irq(port->irqs[i], port); > kfree(port->irqstr[i]); I think the error path in sci_request_irq() needs similar handling, also for SCIx_IRQ_IS_MUXED(). Gr{oetje,eeting}s, Geert
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index cb3d5d37674f..060fcd42b6d5 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -1936,7 +1936,7 @@ static int sci_request_irq(struct sci_port *port) static void sci_free_irq(struct sci_port *port) { - int i; + int i, j; /* * Intentionally in reverse order so we iterate over the muxed @@ -1952,6 +1952,13 @@ static void sci_free_irq(struct sci_port *port) if (unlikely(irq < 0)) continue; + /* Check if already freed (irq was muxed) */ + for (j = 0; j < i; j++) + if (port->irqs[j] == irq) + j = i + 1; + if (j > i) + continue; + free_irq(port->irqs[i], port); kfree(port->irqstr[i]);
Since IRQs might be muxed on some parts, we need to pay attention when we are freeing them. Otherwise we get the ugly WARNING "Trying to free already-free IRQ 20". Fixes: 628c534ae735 ("serial: sh-sci: Improve support for separate TEI and DRI interrupts") Signed-off-by: Chris Brandt <chris.brandt@renesas.com> --- v2: * fix bad commit grammer --- drivers/tty/serial/sh-sci.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)