blob: 65553848f5e7e7ec9b161189ed7b2ea069e4b7ed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
From: John Ogness <john.ogness@linutronix.de>
Date: Fri, 20 Oct 2023 09:52:59 +0000
Subject: [PATCH 17/50] printk: nbcon: Ensure ownership release on failed emit
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.7/older/patches-6.7-rt6.tar.xz
Until now it was assumed that ownership has been lost when the
write_atomic() callback fails. nbcon_emit_next_record() only
returns false when ownership has been lost.
Ensure ownership has been lost before reporting failure by
explicitly attempting a release. If the current context is not
the owner, the release has no effect.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
kernel/printk/nbcon.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -852,7 +852,7 @@ static bool nbcon_emit_next_record(struc
unsigned long con_dropped;
struct nbcon_state cur;
unsigned long dropped;
- bool done;
+ bool done = false;
/*
* The printk buffers are filled within an unsafe section. This
@@ -891,17 +891,18 @@ static bool nbcon_emit_next_record(struc
nbcon_state_read(con, &cur);
wctxt->unsafe_takeover = cur.unsafe_takeover;
- if (con->write_atomic) {
+ if (con->write_atomic)
done = con->write_atomic(con, wctxt);
- } else {
- nbcon_context_release(ctxt);
- WARN_ON_ONCE(1);
- done = false;
- }
- /* If not done, the emit was aborted. */
- if (!done)
+ if (!done) {
+ /*
+ * The emit was aborted, probably due to a loss of ownership.
+ * Ensure ownership was lost or released before reporting the
+ * loss.
+ */
+ nbcon_context_release(ctxt);
return false;
+ }
/*
* Since any dropped message was successfully output, reset the
|