From nobody Tue Dec 2 02:29:50 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E7CD346E70; Wed, 19 Nov 2025 10:01:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546514; cv=none; b=dMWhx9bvatxm0FwmhQIocswPQLpTXWRsDecV8aC9AQG2k7CPPS/pQiCUEX4GA208/q6MHVYczWEby3fvesjgV6X6oFtHWVWDV1V0ApEX0bEhsCY99fXlgFv2AbxHixwmlHdFbGnHeuEPHUrdPL1U5zPVWgPCCPmCzYs4qiSPBtA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546514; c=relaxed/simple; bh=FBfLHQ3P3iL1raCnmEfum+XMNjqj6e2eQvLJgf3EJE4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bsYgdGReIy1ZEF323bBjqX1su2xZ5DYKtJnHavNNGz4qsjxxYvwj6N5gkpmmldL2S6W1JP+Ng7mgG9N2gsirLIKtpLlFKby+eGwThbBMqWgPYlDcuvTev6oA9Y3gcybOlnSWQX+vuqDRQ+MXIr10Ywqipx22+8groZ0FrYUAimo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VbiBUJ9W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VbiBUJ9W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6B003C4AF09; Wed, 19 Nov 2025 10:01:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546513; bh=FBfLHQ3P3iL1raCnmEfum+XMNjqj6e2eQvLJgf3EJE4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VbiBUJ9WWFb49wtDA1uLmDoIzpYV8YZ3Yd0c8I/LXOoW52K/MMiDZt+CiirwAhdC5 Sfga4ffl+yuZNbZgBnf4dfOLm0fxpAwXV8O/FXwx7WUvj9ZRzUAnxtR8ojRMDGAoh5 MhPkQt9qkxRxRzI1BcSBDXtz51wUba3fjoiDWTiUd/+2tX5WyhL0OkAZw1gbh95Hdi ClO5GxjHa2mYJ402yitNRnIwf5+o6nbVeo6K39/48qQliV/RIx+0JM7Sj+zM5N0lIq JTvw55FFTArnEmCwBZxMpOpPDZ9Ya56VfLNdqrOlOJ4yUF2TwSkifvjVzKdKFiMvwz VchqOWbumx9EA== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 05/10] tty: moxa: use guard()s Date: Wed, 19 Nov 2025 11:01:35 +0100 Message-ID: <20251119100140.830761-6-jirislaby@kernel.org> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251119100140.830761-1-jirislaby@kernel.org> References: <20251119100140.830761-1-jirislaby@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use guards in the moxa code. This improves readability, makes error handling easier, and marks locked portions of code explicit. All that while being sure the lock is unlocked. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/moxa.c | 169 ++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 96 deletions(-) diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c index 329b30fac8fc..1bb2376af85c 100644 --- a/drivers/tty/moxa.c +++ b/drivers/tty/moxa.c @@ -487,25 +487,20 @@ static void moxa_wait_finish(void __iomem *ofsAddr) =20 static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg) { - unsigned long flags; - spin_lock_irqsave(&moxafunc_lock, flags); + guard(spinlock_irqsave)(&moxafunc_lock); writew(arg, ofsAddr + FuncArg); writew(cmd, ofsAddr + FuncCode); moxa_wait_finish(ofsAddr); - spin_unlock_irqrestore(&moxafunc_lock, flags); } =20 static int moxafuncret(void __iomem *ofsAddr, u16 cmd, u16 arg) { - unsigned long flags; - u16 ret; - spin_lock_irqsave(&moxafunc_lock, flags); + guard(spinlock_irqsave)(&moxafunc_lock); writew(arg, ofsAddr + FuncArg); writew(cmd, ofsAddr + FuncCode); moxa_wait_finish(ofsAddr); - ret =3D readw(ofsAddr + FuncArg); - spin_unlock_irqrestore(&moxafunc_lock, flags); - return ret; + + return readw(ofsAddr + FuncArg); } =20 static void moxa_low_water_check(void __iomem *ofsAddr) @@ -1002,11 +997,11 @@ static int moxa_init_board(struct moxa_board_conf *b= rd, struct device *dev) if (ret) goto err_free; =20 - spin_lock_bh(&moxa_lock); - brd->ready =3D 1; - if (!timer_pending(&moxaTimer)) - mod_timer(&moxaTimer, jiffies + HZ / 50); - spin_unlock_bh(&moxa_lock); + scoped_guard(spinlock_bh, &moxa_lock) { + brd->ready =3D 1; + if (!timer_pending(&moxaTimer)) + mod_timer(&moxaTimer, jiffies + HZ / 50); + } =20 first_idx =3D (brd - moxa_boards) * MAX_PORTS_PER_BOARD; for (i =3D 0; i < brd->numPorts; i++) @@ -1026,29 +1021,29 @@ static void moxa_board_deinit(struct moxa_board_con= f *brd) { unsigned int a, opened, first_idx; =20 - mutex_lock(&moxa_openlock); - spin_lock_bh(&moxa_lock); - brd->ready =3D 0; - spin_unlock_bh(&moxa_lock); - - /* pci hot-un-plug support */ - for (a =3D 0; a < brd->numPorts; a++) - if (tty_port_initialized(&brd->ports[a].port)) - tty_port_tty_hangup(&brd->ports[a].port, false); - - for (a =3D 0; a < MAX_PORTS_PER_BOARD; a++) - tty_port_destroy(&brd->ports[a].port); + scoped_guard(mutex, &moxa_openlock) { + scoped_guard(spinlock_bh, &moxa_lock) + brd->ready =3D 0; =20 - while (1) { - opened =3D 0; + /* pci hot-un-plug support */ for (a =3D 0; a < brd->numPorts; a++) if (tty_port_initialized(&brd->ports[a].port)) - opened++; - mutex_unlock(&moxa_openlock); - if (!opened) - break; - msleep(50); - mutex_lock(&moxa_openlock); + tty_port_tty_hangup(&brd->ports[a].port, false); + + for (a =3D 0; a < MAX_PORTS_PER_BOARD; a++) + tty_port_destroy(&brd->ports[a].port); + + while (1) { + opened =3D 0; + for (a =3D 0; a < brd->numPorts; a++) + if (tty_port_initialized(&brd->ports[a].port)) + opened++; + if (!opened) + break; + mutex_unlock(&moxa_openlock); + msleep(50); + mutex_lock(&moxa_openlock); + } } =20 first_idx =3D (brd - moxa_boards) * MAX_PORTS_PER_BOARD; @@ -1206,12 +1201,9 @@ static void moxa_shutdown(struct tty_port *port) static bool moxa_carrier_raised(struct tty_port *port) { struct moxa_port *ch =3D container_of(port, struct moxa_port, port); - int dcd; =20 - spin_lock_irq(&port->lock); - dcd =3D ch->DCDState; - spin_unlock_irq(&port->lock); - return dcd; + guard(spinlock_irq)(&port->lock); + return ch->DCDState; } =20 static void moxa_dtr_rts(struct tty_port *port, bool active) @@ -1225,37 +1217,31 @@ static int moxa_open(struct tty_struct *tty, struct= file *filp) { struct moxa_board_conf *brd; struct moxa_port *ch; - int port; - - port =3D tty->index; - if (mutex_lock_interruptible(&moxa_openlock)) - return -ERESTARTSYS; - brd =3D &moxa_boards[port / MAX_PORTS_PER_BOARD]; - if (!brd->ready) { - mutex_unlock(&moxa_openlock); - return -ENODEV; - } + int port =3D tty->index; =20 - if (port % MAX_PORTS_PER_BOARD >=3D brd->numPorts) { - mutex_unlock(&moxa_openlock); - return -ENODEV; - } - - ch =3D &brd->ports[port % MAX_PORTS_PER_BOARD]; - ch->port.count++; - tty->driver_data =3D ch; - tty_port_tty_set(&ch->port, tty); - mutex_lock(&ch->port.mutex); - if (!tty_port_initialized(&ch->port)) { - ch->statusflags =3D 0; - moxa_set_tty_param(tty, &tty->termios); - MoxaPortLineCtrl(ch, true, true); - MoxaPortEnable(ch); - MoxaSetFifo(ch, ch->type =3D=3D PORT_16550A); - tty_port_set_initialized(&ch->port, true); + scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &moxa_openlock) { + brd =3D &moxa_boards[port / MAX_PORTS_PER_BOARD]; + if (!brd->ready) + return -ENODEV; + + if (port % MAX_PORTS_PER_BOARD >=3D brd->numPorts) + return -ENODEV; + + ch =3D &brd->ports[port % MAX_PORTS_PER_BOARD]; + ch->port.count++; + tty->driver_data =3D ch; + tty_port_tty_set(&ch->port, tty); + + guard(mutex)(&ch->port.mutex); + if (!tty_port_initialized(&ch->port)) { + ch->statusflags =3D 0; + moxa_set_tty_param(tty, &tty->termios); + MoxaPortLineCtrl(ch, true, true); + MoxaPortEnable(ch); + MoxaSetFifo(ch, ch->type =3D=3D PORT_16550A); + tty_port_set_initialized(&ch->port, true); + } } - mutex_unlock(&ch->port.mutex); - mutex_unlock(&moxa_openlock); =20 return tty_port_block_til_ready(&ch->port, tty, filp); } @@ -1270,15 +1256,13 @@ static void moxa_close(struct tty_struct *tty, stru= ct file *filp) static ssize_t moxa_write(struct tty_struct *tty, const u8 *buf, size_t co= unt) { struct moxa_port *ch =3D tty->driver_data; - unsigned long flags; int len; =20 if (ch =3D=3D NULL) return 0; =20 - spin_lock_irqsave(&moxa_lock, flags); - len =3D MoxaPortWriteData(tty, buf, count); - spin_unlock_irqrestore(&moxa_lock, flags); + scoped_guard(spinlock_irqsave, &moxa_lock) + len =3D MoxaPortWriteData(tty, buf, count); =20 set_bit(LOWWAIT, &ch->statusflags); return len; @@ -1349,12 +1333,10 @@ static int moxa_tiocmset(struct tty_struct *tty, bool dtr_active, rts_active; struct moxa_port *ch; =20 - mutex_lock(&moxa_openlock); + guard(mutex)(&moxa_openlock); ch =3D tty->driver_data; - if (!ch) { - mutex_unlock(&moxa_openlock); + if (!ch) return -EINVAL; - } =20 MoxaPortGetLineOut(ch, &dtr_active, &rts_active); if (set & TIOCM_RTS) @@ -1366,7 +1348,7 @@ static int moxa_tiocmset(struct tty_struct *tty, if (clear & TIOCM_DTR) dtr_active =3D false; MoxaPortLineCtrl(ch, dtr_active, rts_active); - mutex_unlock(&moxa_openlock); + return 0; } =20 @@ -1415,18 +1397,17 @@ static void moxa_hangup(struct tty_struct *tty) =20 static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd) { - unsigned long flags; dcd =3D !!dcd; =20 - spin_lock_irqsave(&p->port.lock, flags); - if (dcd !=3D p->DCDState) { - p->DCDState =3D dcd; - spin_unlock_irqrestore(&p->port.lock, flags); - if (!dcd) - tty_port_tty_hangup(&p->port, true); + scoped_guard(spinlock_irqsave, &p->port.lock) { + if (dcd =3D=3D p->DCDState) + return; + + p->DCDState =3D dcd; } - else - spin_unlock_irqrestore(&p->port.lock, flags); + + if (!dcd) + tty_port_tty_hangup(&p->port, true); } =20 static int moxa_poll_port(struct moxa_port *p, unsigned int handle, @@ -1494,7 +1475,7 @@ static void moxa_poll(struct timer_list *unused) u16 __iomem *ip; unsigned int card, port, served =3D 0; =20 - spin_lock(&moxa_lock); + guard(spinlock)(&moxa_lock); for (card =3D 0; card < MAX_BOARDS; card++) { brd =3D &moxa_boards[card]; if (!brd->ready) @@ -1525,7 +1506,6 @@ static void moxa_poll(struct timer_list *unused) =20 if (served) mod_timer(&moxaTimer, jiffies + HZ / 50); - spin_unlock(&moxa_lock); } =20 /*************************************************************************= *****/ @@ -1861,13 +1841,11 @@ static int MoxaPortSetTermio(struct moxa_port *port= , struct ktermios *termio, baud =3D MoxaPortSetBaud(port, baud); =20 if (termio->c_iflag & (IXON | IXOFF | IXANY)) { - spin_lock_irq(&moxafunc_lock); + guard(spinlock_irq)(&moxafunc_lock); writeb(termio->c_cc[VSTART], ofsAddr + FuncArg); writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1); writeb(FC_SetXonXoff, ofsAddr + FuncCode); moxa_wait_finish(ofsAddr); - spin_unlock_irq(&moxafunc_lock); - } return baud; } @@ -2098,13 +2076,13 @@ static int moxa_get_serial_info(struct tty_struct *= tty, =20 if (!info) return -ENODEV; - mutex_lock(&info->port.mutex); + guard(mutex)(&info->port.mutex); ss->type =3D info->type; ss->line =3D info->port.tty->index; ss->flags =3D info->port.flags; ss->baud_base =3D 921600; ss->close_delay =3D jiffies_to_msecs(info->port.close_delay) / 10; - mutex_unlock(&info->port.mutex); + return 0; } =20 @@ -2120,13 +2098,12 @@ static int moxa_set_serial_info(struct tty_struct *= tty, =20 close_delay =3D msecs_to_jiffies(ss->close_delay * 10); =20 - mutex_lock(&info->port.mutex); + guard(mutex)(&info->port.mutex); if (!capable(CAP_SYS_ADMIN)) { if (close_delay !=3D info->port.close_delay || ss->type !=3D info->type || ((ss->flags & ~ASYNC_USR_MASK) !=3D (info->port.flags & ~ASYNC_USR_MASK))) { - mutex_unlock(&info->port.mutex); return -EPERM; } } else { @@ -2136,7 +2113,7 @@ static int moxa_set_serial_info(struct tty_struct *tt= y, =20 info->type =3D ss->type; } - mutex_unlock(&info->port.mutex); + return 0; } =20 --=20 2.51.1