From: Ginger Li <ginger.jzllee@gmail.com>
To: jirislaby@kernel.org, gregkh@linuxfoundation.org
Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org,
Maarten.Brock@sttls.nl
Subject: [PATCH v2] serial: max3100: Fix a data race on s->rts in max3100_work()
Date: Wed, 23 Sep 2026 01:02:39 +0800 [thread overview]
Message-ID: <20260922170239.33485-1-ginger.jzllee@gmail.com> (raw)
In-Reply-To: <20260922053151.11260-1-ginger.jzllee@gmail.com>
max3100_set_mctrl() stores the new RTS state and raises s->rts_commit to tell
max3100_work() that it has to program it:
spin_lock(&s->conf_lock);
if (s->rts != rts) {
s->rts = rts;
s->rts_commit = 1;
}
if (s->loopback_commit || s->rts_commit)
max3100_dowork(s);
spin_unlock(&s->conf_lock);
max3100_work() consumes s->rts_commit under s->conf_lock, but reads s->rts
itself outside of the lock, both when it services that pending update and when
it later transmits a character, so the state it programs into the hardware can
be stale.
Read s->rts into a local variable in the s->conf_lock protected snapshot at
the top of the loop, before s->rts_commit is consumed, in the same way as
s->conf is read before s->conf_commit.
Fixes: 7831d56b0a35 ("tty: MAX3100")
Signed-off-by: Ginger Li <ginger.jzllee@gmail.com>
---
v2:
- read s->rts into "rts" before s->rts_commit is consumed, as suggested by
Maarten
- mention s->rts_commit in the commit message
- left the s->rts / s->rts_commit split alone; folding both into one byte
would be a separate cleanup
---
drivers/tty/serial/max3100.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -236,6 +236,7 @@ static void max3100_work(struct work_struct *w)
struct tty_port *tport = &s->port.state->port;
unsigned char ch;
int conf, cconf, cloopback, crts;
+ bool rts;
int rxchars;
u16 tx, rx;
@@ -249,6 +250,7 @@ static void max3100_work(struct work_struct *w)
s->conf_commit = 0;
cloopback = s->loopback_commit;
s->loopback_commit = 0;
+ rts = s->rts;
crts = s->rts_commit;
s->rts_commit = 0;
spin_unlock(&s->conf_lock);
@@ -258,7 +260,7 @@ static void max3100_work(struct work_struct *w)
max3100_sr(s, 0x4001, &rx);
if (crts) {
max3100_sr(s, MAX3100_WD | MAX3100_TE |
- (s->rts ? MAX3100_RTS : 0), &rx);
+ (rts ? MAX3100_RTS : 0), &rx);
rxchars += max3100_handlerx(s, rx);
}
@@ -277,7 +279,7 @@ static void max3100_work(struct work_struct *w)
}
if (tx != 0xffff) {
max3100_calc_parity(s, &tx);
- tx |= MAX3100_WD | (s->rts ? MAX3100_RTS : 0);
+ tx |= MAX3100_WD | (rts ? MAX3100_RTS : 0);
max3100_sr(s, tx, &rx);
rxchars += max3100_handlerx(s, rx);
}
--
2.43.0
next prev parent reply other threads:[~2026-09-22 17:02 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 5:31 [PATCH] serial: max3100: Fix a data race on s->rts in max3100_work() Ginger Li
2026-09-22 5:40 ` sashiko-bot
2026-09-22 8:17 ` Maarten Brock
2026-09-22 8:26 ` Ginger
2026-09-22 9:25 ` Maarten Brock
2026-09-22 17:04 ` Ginger
2026-09-22 17:02 ` Ginger Li [this message]
2026-09-22 17:12 ` [PATCH v2] " sashiko-bot
2026-09-23 10:31 ` Greg KH
2026-09-24 8:32 ` Maarten Brock
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260922170239.33485-1-ginger.jzllee@gmail.com \
--to=ginger.jzllee@gmail.com \
--cc=Maarten.Brock@sttls.nl \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.