[PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible

John Ogness posted 1 patch 1 year, 8 months ago
kernel/printk/nbcon.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
[PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible
Posted by John Ogness 1 year, 8 months ago
nbcon_cpu_emergency_flush() can be called in a preemptible
context. In that case the CPU is not in an emergency state.
However, in order to see that the CPU is not in an emergency
state (accessing the per-cpu variable), preemption must be
disabled.

Disable preemption when checking the CPU state.

Reported-by: Juri Lelli <juri.lelli@redhat.com>
Closes: https://lore.kernel.org/aqkcpca4vgadxc3yzcu74xwq3grslj5m43f3eb5fcs23yo2gy4@gcsnqcts5tos
Fixes: 46a1379208b7 ("printk: nbcon: Implement emergency sections")
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
 kernel/printk/nbcon.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c
index 19f0db6945e4..39eb369880d9 100644
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -1443,8 +1443,19 @@ void nbcon_cpu_emergency_exit(void)
  */
 void nbcon_cpu_emergency_flush(void)
 {
+	bool is_emergency;
+
+	/*
+	 * If this context is not an emergency context, preemption might be
+	 * enabled. To be sure, disable preemption when checking if this is
+	 * an emergency context.
+	 */
+	preempt_disable();
+	is_emergency = (*nbcon_get_cpu_emergency_nesting() != 0);
+	preempt_enable();
+
 	/* The explicit flush is needed only in the emergency context. */
-	if (*(nbcon_get_cpu_emergency_nesting()) == 0)
+	if (!is_emergency)
 		return;
 
 	nbcon_atomic_flush_pending();
-- 
2.30.2
Re: [PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible
Posted by Petr Mladek 1 year, 8 months ago
On Wed 2024-06-05 11:57:34, John Ogness wrote:
> nbcon_cpu_emergency_flush() can be called in a preemptible
> context. In that case the CPU is not in an emergency state.
> However, in order to see that the CPU is not in an emergency
> state (accessing the per-cpu variable), preemption must be
> disabled.
> 
> Disable preemption when checking the CPU state.
> 
> Reported-by: Juri Lelli <juri.lelli@redhat.com>
> Closes: https://lore.kernel.org/aqkcpca4vgadxc3yzcu74xwq3grslj5m43f3eb5fcs23yo2gy4@gcsnqcts5tos
> Fixes: 46a1379208b7 ("printk: nbcon: Implement emergency sections")
> Signed-off-by: John Ogness <john.ogness@linutronix.de>

JFYI, the patch has been comitted into printk/linux.git,
branch rework/write-atomic.

Best Regards,
Petr
Re: [PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible
Posted by Petr Mladek 1 year, 8 months ago
On Wed 2024-06-05 11:57:34, John Ogness wrote:
> nbcon_cpu_emergency_flush() can be called in a preemptible
> context. In that case the CPU is not in an emergency state.
> However, in order to see that the CPU is not in an emergency
> state (accessing the per-cpu variable), preemption must be
> disabled.
> 
> Disable preemption when checking the CPU state.
> 
> Reported-by: Juri Lelli <juri.lelli@redhat.com>
> Closes: https://lore.kernel.org/aqkcpca4vgadxc3yzcu74xwq3grslj5m43f3eb5fcs23yo2gy4@gcsnqcts5tos
> Fixes: 46a1379208b7 ("printk: nbcon: Implement emergency sections")
> Signed-off-by: John Ogness <john.ogness@linutronix.de>

Great catch!

Reviewed-by: Petr Mladek <pmladek@suse.com>

I am going to push it...

Best Regards,
Petr
Re: [PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible
Posted by Petr Mladek 1 year, 8 months ago
On Wed 2024-06-05 12:10:50, Petr Mladek wrote:
> On Wed 2024-06-05 11:57:34, John Ogness wrote:
> > nbcon_cpu_emergency_flush() can be called in a preemptible
> > context. In that case the CPU is not in an emergency state.
> > However, in order to see that the CPU is not in an emergency
> > state (accessing the per-cpu variable), preemption must be
> > disabled.
> > 
> > Disable preemption when checking the CPU state.
> > 
> > Reported-by: Juri Lelli <juri.lelli@redhat.com>
> > Closes: https://lore.kernel.org/aqkcpca4vgadxc3yzcu74xwq3grslj5m43f3eb5fcs23yo2gy4@gcsnqcts5tos
> > Fixes: 46a1379208b7 ("printk: nbcon: Implement emergency sections")
> > Signed-off-by: John Ogness <john.ogness@linutronix.de>
> 
> Great catch!
> 
> Reviewed-by: Petr Mladek <pmladek@suse.com>
> 
> I am going to push it...

Juri, should/could I add your Tested-by ?

Best Regards,
Petr
Re: [PATCH linux-next] printk: nbcon: Fix nbcon_cpu_emergency_flush() when preemptible
Posted by Juri Lelli 1 year, 8 months ago
On 05/06/24 12:14, Petr Mladek wrote:
> On Wed 2024-06-05 12:10:50, Petr Mladek wrote:
> > On Wed 2024-06-05 11:57:34, John Ogness wrote:
> > > nbcon_cpu_emergency_flush() can be called in a preemptible
> > > context. In that case the CPU is not in an emergency state.
> > > However, in order to see that the CPU is not in an emergency
> > > state (accessing the per-cpu variable), preemption must be
> > > disabled.
> > > 
> > > Disable preemption when checking the CPU state.
> > > 
> > > Reported-by: Juri Lelli <juri.lelli@redhat.com>
> > > Closes: https://lore.kernel.org/aqkcpca4vgadxc3yzcu74xwq3grslj5m43f3eb5fcs23yo2gy4@gcsnqcts5tos
> > > Fixes: 46a1379208b7 ("printk: nbcon: Implement emergency sections")
> > > Signed-off-by: John Ogness <john.ogness@linutronix.de>
> > 
> > Great catch!
> > 
> > Reviewed-by: Petr Mladek <pmladek@suse.com>
> > 
> > I am going to push it...
> 
> Juri, should/could I add your Tested-by ?

A yes please if you like. Thanks!

Tested-by: Juri Lelli <juri.lelli@redhat.com>

You guys were so quick to act on it! :)

Best,
Juri