Skip to contentSkip to conversation

serial/amba-pl011: Disable interrupts around TX softirq

PATCH New Dave Martin 2 participants 5 messages Jul 9, 2015 – Jul 24, 2015

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 serial/amba-pl011: Disable interrupts around TX softirq

pl011_tx_softirq() currently uses spin_{,un}lock(), which are not sufficient to inhibit pl011_int() from being triggered by a local IRQ and trying to re-take the same lock. This can lead to deadlocks.

This patch uses the _irq() locking variants instead to ensure that pl011_int() handling for a given port is deferred until any pl011_tx_softirq() work for that port is complete.

Fixes 734745caeb9f serial/amba-pl011: Activate TX IRQ passively
Cc stable <[email protected]> # 4.1
---
 drivers/tty/serial/amba-pl011.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/serial/amba-pl011.c +2 -2
index 763eb20..0cc622a 100644
@@ -1360,9 +1360,9 @@ static void pl011_tx_softirq(struct work_struct *work)
 	struct uart_amba_port *uap =
 		container_of(dwork, struct uart_amba_port, tx_softirq_work);
 
-	spin_lock(&uap->port.lock);
+	spin_lock_irq(&uap->port.lock);
 	while (pl011_tx_chars(uap)) ;
-	spin_unlock(&uap->port.lock);
+	spin_unlock_irq(&uap->port.lock);
 }
 
 static void pl011_tx_irq_seen(struct uart_amba_port *uap)
Signature · 1 line
1.7.10.4
#1 lore raw

PATCH 1/1 serial/amba-pl011: Disable interrupts around TX softirq

Quoted 9 lines · Dave Martin

pl011_tx_softirq() currently uses spin_{,un}lock(), which are not sufficient to inhibit pl011_int() from being triggered by a local IRQ and trying to re-take the same lock. This can lead to deadlocks.

This patch uses the _irq() locking variants instead to ensure that pl011_int() handling for a given port is deferred until any pl011_tx_softirq() work for that port is complete.

Quoted 8 lines
Fixes 734745caeb9f serial/amba-pl011: Activate TX IRQ passively
Cc stable <[email protected]> # 4.1
---
 drivers/tty/serial/amba-pl011.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

This doesn't apply at all to 4.2-rc3, so I can't apply it :(

#2 lore raw

PATCH 1/1 serial/amba-pl011: Disable interrupts around TX softirq

Quoted 19 lines · Greg Kroah-Hartman
Quoted 9 lines · Dave Martin

pl011_tx_softirq() currently uses spin_{,un}lock(), which are not sufficient to inhibit pl011_int() from being triggered by a local IRQ and trying to re-take the same lock. This can lead to deadlocks.

This patch uses the _irq() locking variants instead to ensure that pl011_int() handling for a given port is deferred until any pl011_tx_softirq() work for that port is complete.

Quoted 8 lines
Fixes 734745caeb9f serial/amba-pl011: Activate TX IRQ passively
Cc stable <[email protected]> # 4.1
---
 drivers/tty/serial/amba-pl011.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Quoted 1 line

This doesn't apply at all to 4.2-rc3, so I can't apply it :(

This is applicable to 4.1 stable only, since the code this patch fixes was replaced in 4.2-rc1.

Apologies, I didn't make that clear in the text.

Cheers
---Dave

#3 lore raw

PATCH 1/1 serial/amba-pl011: Disable interrupts around TX softirq

Quoted 20 lines · Dave Martin
Quoted 19 lines · Greg Kroah-Hartman
Quoted 17 lines · Dave Martin

pl011_tx_softirq() currently uses spin_{,un}lock(), which are not sufficient to inhibit pl011_int() from being triggered by a local IRQ and trying to re-take the same lock. This can lead to deadlocks.

This patch uses the _irq() locking variants instead to ensure that pl011_int() handling for a given port is deferred until any pl011_tx_softirq() work for that port is complete.

Fixes 734745caeb9f serial/amba-pl011: Activate TX IRQ passively
Cc stable <[email protected]> # 4.1
---
 drivers/tty/serial/amba-pl011.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Quoted 6 lines
Quoted 1 line

This doesn't apply at all to 4.2-rc3, so I can't apply it :(

This is applicable to 4.1 stable only, since the code this patch fixes was replaced in 4.2-rc1.

Apologies, I didn't make that clear in the text.

I can't do anything with a 4.1-only patch, please read Documentation/stable_kernel_rules.txt for how to get a patch into the stable kernel releases.

thanks,

greg k-h

#4 lore raw

PATCH 1/1 serial/amba-pl011: Disable interrupts around TX softirq

Quoted 23 lines · Greg Kroah-Hartman
Quoted 22 lines · Dave Martin
Quoted 20 lines · Greg Kroah-Hartman
Quoted 9 lines · Dave Martin

pl011_tx_softirq() currently uses spin_{,un}lock(), which are not sufficient to inhibit pl011_int() from being triggered by a local IRQ and trying to re-take the same lock. This can lead to deadlocks.

This patch uses the _irq() locking variants instead to ensure that pl011_int() handling for a given port is deferred until any pl011_tx_softirq() work for that port is complete.

Quoted 8 lines
Fixes 734745caeb9f serial/amba-pl011: Activate TX IRQ passively
Cc stable <[email protected]> # 4.1
---
 drivers/tty/serial/amba-pl011.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

This doesn't apply at all to 4.2-rc3, so I can't apply it :(

Quoted 8 lines
Quoted 4 lines

This is applicable to 4.1 stable only, since the code this patch fixes was replaced in 4.2-rc1.

Apologies, I didn't make that clear in the text.

I can't do anything with a 4.1-only patch, please read Documentation/stable_kernel_rules.txt for how to get a patch into the stable kernel releases.

OK, reposted[1] with a clear reference to the equivalent upstream commit, and explanation of why this patch is different, which I'm guessing is what was missing.

Is that sufficient?

Cheers
---Dave

[1] http://marc.info/?l=linux-serial&m=143775597205041&w=2