]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
tty: serial: jsm: hold port lock when reporting modem line changes
authorZheyu Ma <zheyuma97@gmail.com>
Wed, 14 Jul 2021 05:53:23 +0000 (05:53 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Sep 2021 09:41:24 +0000 (11:41 +0200)
[ Upstream commit 240e126c28df084222f0b661321e8e3ecb0d232e ]

uart_handle_dcd_change() requires a port lock to be held and will emit a
warning when lockdep is enabled.

Held corresponding lock to fix the following warnings.

[  132.528648] WARNING: CPU: 5 PID: 11600 at drivers/tty/serial/serial_core.c:3046 uart_handle_dcd_change+0xf4/0x120
[  132.530482] Modules linked in:
[  132.531050] CPU: 5 PID: 11600 Comm: jsm Not tainted 5.14.0-rc1-00003-g7fef2edf7cc7-dirty #31
[  132.535268] RIP: 0010:uart_handle_dcd_change+0xf4/0x120
[  132.557100] Call Trace:
[  132.557562]  ? __free_pages+0x83/0xb0
[  132.558213]  neo_parse_modem+0x156/0x220
[  132.558897]  neo_param+0x399/0x840
[  132.559495]  jsm_tty_open+0x12f/0x2d0
[  132.560131]  uart_startup.part.18+0x153/0x340
[  132.560888]  ? lock_is_held_type+0xe9/0x140
[  132.561660]  uart_port_activate+0x7f/0xe0
[  132.562351]  ? uart_startup.part.18+0x340/0x340
[  132.563003]  tty_port_open+0x8d/0xf0
[  132.563523]  ? uart_set_options+0x1e0/0x1e0
[  132.564125]  uart_open+0x24/0x40
[  132.564604]  tty_open+0x15c/0x630

Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
Link: https://lore.kernel.org/r/1626242003-3809-1-git-send-email-zheyuma97@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/tty/serial/jsm/jsm_neo.c
drivers/tty/serial/jsm/jsm_tty.c

index 932b2accd06f7099e58adc04ff0fb4d028e81a18..4ed0c099c7574a0a7361b7df3060f672b88b59cc 100644 (file)
@@ -827,7 +827,9 @@ static inline void neo_parse_isr(struct jsm_board *brd, u32 port)
                /* Parse any modem signal changes */
                jsm_dbg(INTR, &ch->ch_bd->pci_dev,
                        "MOD_STAT: sending to parse_modem_sigs\n");
+               spin_lock_irqsave(&ch->uart_port.lock, lock_flags);
                neo_parse_modem(ch, readb(&ch->ch_neo_uart->msr));
+               spin_unlock_irqrestore(&ch->uart_port.lock, lock_flags);
        }
 }
 
index 524e86ab3cae7af5b43811c6679e344c4da78054..dad3abab828056ee8a11c4212c0edb39dba24d5c 100644 (file)
@@ -195,6 +195,7 @@ static void jsm_tty_break(struct uart_port *port, int break_state)
 
 static int jsm_tty_open(struct uart_port *port)
 {
+       unsigned long lock_flags;
        struct jsm_board *brd;
        struct jsm_channel *channel =
                container_of(port, struct jsm_channel, uart_port);
@@ -248,6 +249,7 @@ static int jsm_tty_open(struct uart_port *port)
        channel->ch_cached_lsr = 0;
        channel->ch_stops_sent = 0;
 
+       spin_lock_irqsave(&port->lock, lock_flags);
        termios = &port->state->port.tty->termios;
        channel->ch_c_cflag     = termios->c_cflag;
        channel->ch_c_iflag     = termios->c_iflag;
@@ -267,6 +269,7 @@ static int jsm_tty_open(struct uart_port *port)
        jsm_carrier(channel);
 
        channel->ch_open_count++;
+       spin_unlock_irqrestore(&port->lock, lock_flags);
 
        jsm_dbg(OPEN, &channel->ch_bd->pci_dev, "finish\n");
        return 0;