Skip to contentSkip to conversation

serial: imx: drop workaround for forced irq threading

PATCH In review Johan Hovold 3 participants 12 messages Mar 22, 2021 – Mar 24, 2021

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

PATCH 1/1 serial: imx: drop workaround for forced irq threading

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

Drop the now obsolete workaround added by commit 33f16855dcb9 ("tty:
serial: imx: fix potential deadlock").

Cc Sam Nobs <[email protected]>
Cc Uwe Kleine-König <[email protected]>
Cc Thomas Gleixner <[email protected]>
Cc Sebastian Andrzej Siewior <[email protected]>
Cc Peter Zijlstra <[email protected]>
---
 drivers/tty/serial/imx.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/tty/serial/imx.c +2 -8
index 8257597d034d..cca730fc2b0b 100644
@@ -922,14 +922,8 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
 	struct imx_port *sport = dev_id;
 	unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
 	irqreturn_t ret = IRQ_NONE;
-	unsigned long flags = 0;
 
-	/*
-	 * IRQs might not be disabled upon entering this interrupt handler,
-	 * e.g. when interrupt handlers are forced to be threaded. To support
-	 * this scenario as well, disable IRQs when acquiring the spinlock.
-	 */
-	spin_lock_irqsave(&sport->port.lock, flags);
+	spin_lock(&sport->port.lock);
 
 	usr1 = imx_uart_readl(sport, USR1);
 	usr2 = imx_uart_readl(sport, USR2);
@@ -999,7 +993,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
 		ret = IRQ_HANDLED;
 	}
 
-	spin_unlock_irqrestore(&sport->port.lock, flags);
+	spin_unlock(&sport->port.lock);
 
 	return ret;
 }
Signature · 1 line
2.26.3
#1 lore raw
Quoted 5 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

Quoted 7 lines

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
#2 lore raw
Quoted 10 lines · Uwe Kleine-König
Quoted 9 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Quoted 7 lines
Quoted 3 lines

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

Quoted 2 lines

Best regards
Uwe

Sebastian

#3 lore raw

Hallo Sebastian,

Quoted 15 lines · Sebastian Andrzej Siewior
Quoted 14 lines · Uwe Kleine-König
Quoted 12 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

Quoted 6 lines
Quoted 3 lines

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

The commit log says essentially: "The change is fine on non-RT" which suggests there is a problem on RT. So something like:

On non-RT interrupts are disabled also for force threaded handlers (since commit 81e2073c175b ...). On RT there is no problem either because ... So we don't need to handle this case in the driver any more.

would be preferable.

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
#4 lore raw
Quoted 22 lines · Uwe Kleine-König

Hallo Sebastian,

Quoted 19 lines · Sebastian Andrzej Siewior
Quoted 17 lines · Uwe Kleine-König
Quoted 5 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

Quoted 7 lines

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Quoted 5 lines
Quoted 2 lines

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

The commit log says essentially: "The change is fine on non-RT" which suggests there is a problem on RT.

I don't think you can read that into the commit message. Why would I knowingly break RT? And why would RT depend on patching individual serial drivers in the first place?

That interrupt handlers run with interrupts enabled in RT is kind of given. The unfortunate (buggy) bit was that they weren't always disabled for non-RT.

Johan

#5 lore raw

Hello Johan,

Quoted 21 lines · Johan Hovold
Quoted 20 lines · Uwe Kleine-König
Quoted 19 lines · Sebastian Andrzej Siewior
Quoted 17 lines · Uwe Kleine-König
Quoted 5 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

Quoted 7 lines

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

The commit log says essentially: "The change is fine on non-RT" which suggests there is a problem on RT.

I don't think you can read that into the commit message.

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

Quoted 1 line

Why would I knowingly break RT?

No offence intended. Priorities are different for different maintainers and I wouldn't bet that all maintainers care for RT.

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
#6 lore raw
Quoted 4 lines · Uwe Kleine-König

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

If I hear that parking is free on weekdays and on paid on weekends, I expect it to be a scam.

Uwe, the patch reverts a change which was needed for !RT + threadirqs. The commit message claims that since the referenced commit "… interrupt handlers always run with interrupts disabled on non-RT… ". This has nothing to do with _this_ change. It argues why the workaround is not needed.
If the referenced commit breaks RT then this is another story.

Quoted 2 lines

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

There was never reason (or a lockdep splat) for it on RT. If so you should have seen it, right?

Sebastian

#7 lore raw

Hello Sebastian,

Quoted 8 lines · Sebastian Andrzej Siewior
Quoted 4 lines · Uwe Kleine-König

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

If I hear that parking is free on weekdays and on paid on weekends, I expect it to be a scam.

I don't feel taken seriously with this reply.

Quoted 1 line

Uwe, the patch reverts a change which was needed for !RT + threadirqs.

This would be a useful information for the commit log.

Quoted 4 lines

The commit message claims that since the referenced commit "… interrupt handlers always run with interrupts disabled on non-RT… ". This has nothing to do with _this_ change. It argues why the workaround is not needed.

It argues why the work around is not needed on non-RT. It might be obvious for someone who is firm in the RT concepts, but IMHO commit logs should be understandable by and make sense for a wider audience than the deep experts. From what I know about RT "Force-threaded interrupt handlers used to run with interrupts enabled" still applies there.

Quoted 1 line

If the referenced commit breaks RT then this is another story.

I'm surprised to hear that from you. With the goal to get RT into mainline I would expect you to be happy if people consider the effects on RT in their reviews.

Quoted 5 lines
Quoted 2 lines

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

There was never reason (or a lockdep splat) for it on RT. If so you should have seen it, right?

No, I don't consider myself to be an RT expert who is aware of all the problems. So I admit that for me the effect on RT of the patch under discussion isn't obvious. I just wonder that the change is justified with being OK on non-RT. So it's either bad that it breaks RT *or* improving the commit log would be great.

And even if I had reason to believe that there is no problem with the commit on RT, I'd still wish that the commit log wouldn't suggest to the casual reader that there might be a problem.

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
#8 lore raw
Quoted 1 line · Uwe Kleine-König

Hello Sebastian,

Hi Uwe,

Quoted 11 lines · Sebastian Andrzej Siewior
Quoted 8 lines · Uwe Kleine-König
Quoted 4 lines

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

If I hear that parking is free on weekdays and on paid on weekends, I expect it to be a scam.

I don't feel taken seriously with this reply.

I'm sorry.

Quoted 9 lines
Quoted 1 line

Uwe, the patch reverts a change which was needed for !RT + threadirqs.

This would be a useful information for the commit log.

Quoted 4 lines

The commit message claims that since the referenced commit "… interrupt handlers always run with interrupts disabled on non-RT… ". This has nothing to do with _this_ change. It argues why the workaround is not needed.

Quoted 5 lines

It argues why the work around is not needed on non-RT. It might be obvious for someone who is firm in the RT concepts, but IMHO commit logs should be understandable by and make sense for a wider audience than the deep experts. From what I know about RT "Force-threaded interrupt handlers used to run with interrupts enabled" still applies there.

Yes. The commit Johan referenced explains it in more detail.

Quoted 5 lines
Quoted 1 line

If the referenced commit breaks RT then this is another story.

I'm surprised to hear that from you. With the goal to get RT into mainline I would expect you to be happy if people consider the effects on RT in their reviews.

Correct, I do and I am glad if people consider other aspects of the kernel in their review including RT.

Quoted 12 lines
Quoted 5 lines
Quoted 2 lines

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

There was never reason (or a lockdep splat) for it on RT. If so you should have seen it, right?

No, I don't consider myself to be an RT expert who is aware of all the problems. So I admit that for me the effect on RT of the patch under discussion isn't obvious. I just wonder that the change is justified with being OK on non-RT. So it's either bad that it breaks RT *or* improving the commit log would be great.

Quoted 3 lines

And even if I had reason to believe that there is no problem with the commit on RT, I'd still wish that the commit log wouldn't suggest to the casual reader that there might be a problem.

Okay. I added a sentence. What about this rewording:

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this. RT is not affected by the referenced commit and the workaround, that is reverted, was not required because spinlock_t must not be acquired on RT in hardirq context.

Drop the now obsolete workaround added by commit 33f16855dcb9 ("tty:
serial: imx: fix potential deadlock").

Quoted 3 lines

Best regards
Uwe

Sebastian

#9 lore raw

Hello Sebastian,

Quoted 17 lines · Sebastian Andrzej Siewior
Quoted 16 lines · Uwe Kleine-König
Quoted 7 lines · Sebastian Andrzej Siewior
Quoted 4 lines · Uwe Kleine-König

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

Uwe, the patch reverts a change which was needed for !RT + threadirqs.

This would be a useful information for the commit log.

Quoted 4 lines

The commit message claims that since the referenced commit "… interrupt handlers always run with interrupts disabled on non-RT… ". This has nothing to do with _this_ change. It argues why the workaround is not needed.

Quoted 7 lines
Quoted 5 lines

It argues why the work around is not needed on non-RT. It might be obvious for someone who is firm in the RT concepts, but IMHO commit logs should be understandable by and make sense for a wider audience than the deep experts. From what I know about RT "Force-threaded interrupt handlers used to run with interrupts enabled" still applies there.

Yes. The commit Johan referenced explains it in more detail.

In my book the commit log should be understandable without reading the referenced commits.

Quoted 43 lines
Quoted 5 lines
Quoted 1 line

If the referenced commit breaks RT then this is another story.

I'm surprised to hear that from you. With the goal to get RT into mainline I would expect you to be happy if people consider the effects on RT in their reviews.

Correct, I do and I am glad if people consider other aspects of the kernel in their review including RT.

Quoted 12 lines
Quoted 5 lines
Quoted 2 lines

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

There was never reason (or a lockdep splat) for it on RT. If so you should have seen it, right?

No, I don't consider myself to be an RT expert who is aware of all the problems. So I admit that for me the effect on RT of the patch under discussion isn't obvious. I just wonder that the change is justified with being OK on non-RT. So it's either bad that it breaks RT *or* improving the commit log would be great.

Quoted 3 lines

And even if I had reason to believe that there is no problem with the commit on RT, I'd still wish that the commit log wouldn't suggest to the casual reader that there might be a problem.

Okay. I added a sentence. What about this rewording:

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this. RT is not affected by the referenced commit and the workaround, that is reverted, was not required because spinlock_t must not be acquired on RT in hardirq context.

Quoted 2 lines

Drop the now obsolete workaround added by commit 33f16855dcb9 ("tty:
serial: imx: fix potential deadlock").

This resolves my concerns. Thanks
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |
#10 lore raw
In reply to Uwe Kleine-König
Quoted 30 lines · Uwe Kleine-König

Hello Johan,

Quoted 27 lines · Johan Hovold
Quoted 25 lines · Uwe Kleine-König
Quoted 15 lines · Sebastian Andrzej Siewior
Quoted 14 lines · Uwe Kleine-König
Quoted 12 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

Quoted 6 lines
Quoted 3 lines

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

The commit log says essentially: "The change is fine on non-RT" which suggests there is a problem on RT.

Quoted 6 lines
Quoted 1 line

I don't think you can read that into the commit message.

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

That analogy would almost seem to suggest bad intent on my side.

To say that this workaround is no longer needed on !RT does not imply that it is needed on RT. If anything it suggests I have considered RT, I'd say.

Quoted 2 lines

So when you said that on on-RT the reason why it used to need a workaround is gone made me wonder what that implies for RT.

Fair enough. I thought it was obvious from the commit message and the commits referred to, and that RT wouldn't depend on patching random mainline drivers like this without a clear marking such as using raw spin locks.

Greg's already picked this one up and this is hopefully the last one we'll see of these.

Johan

#11 lore raw

Hello Johan,

Quoted 29 lines · Johan Hovold
Quoted 28 lines · Uwe Kleine-König
Quoted 27 lines · Johan Hovold
Quoted 25 lines · Uwe Kleine-König
Quoted 15 lines · Sebastian Andrzej Siewior
Quoted 14 lines · Uwe Kleine-König
Quoted 12 lines · Johan Hovold

Force-threaded interrupt handlers used to run with interrupts enabled, something which could lead to deadlocks in case a threaded handler shared a lock with code running in hard interrupt context (e.g. timer callbacks) and did not explicitly disable interrupts.

This was specifically the case for serial drivers that take the port lock in their console write path as printk can be called from hard interrupt context also with forced threading ("threadirqs").

Since commit 81e2073c175b ("genirq: Disable interrupts for force threaded handlers") interrupt handlers always run with interrupts disabled on non-RT so that drivers no longer need to do handle this.

Quoted 6 lines
Quoted 3 lines

So we're breaking RT knowingly here? If this is the case I'm not happy with your change. (And if RT is not affected a different wording would be good.)

Which wording, could you be more specific? It looks good from here and no, RT is not affected.

The commit log says essentially: "The change is fine on non-RT" which suggests there is a problem on RT.

Quoted 8 lines
Quoted 6 lines
Quoted 1 line

I don't think you can read that into the commit message.

From a strictly logically point of view you indeed cannot. But if you go to the street and say to people there that they can park their car in this street free of charge between Monday and Friday, I expect that most of them will assume that they have to pay for parking on weekends.

That analogy would almost seem to suggest bad intent on my side.

That analogy's purpose was to put over my point that writing (paraphrased) "Since non-RT changed, this workaround isn't necessary any more" suggests to me that the change might be bad for RT. So again, there was no harm intended, this is just a call for clearing up either the commit log to make it obvious the change is right or to fix the problem on RT if there is any.

Quoted 3 lines

To say that this workaround is no longer needed on !RT does not imply that it is needed on RT. If anything it suggests I have considered RT, I'd say.

The code in question was used for both RT and non-RT. You drop it for both cases and only justify one of them. OK, fine, you considered both cases. Just from reading the commit log I considered you didn't. It's completely ok for me to be wrong here, but I still think the chosen words are not optimal and stumbling as I did is easy. So I still see a potential to improve the wording.

Best regards
Uwe

Signature · 2 lines
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |