From nobody Tue Dec 2 02:18:58 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 D9881346FA9; Wed, 19 Nov 2025 10:01:46 +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=1763546507; cv=none; b=UtNzi5iu08SlL4QbnB9lhqtOvCO6a550i41QbSqBRzzNJ/lVEaBLFFAeVWRfIEdkf3W0+0g4kJyBb2X/CwV0Khn07TKw47jXadzxkSNWi34TAqyHlRi/paf/hZfWAJ68rPUnGIBxkivGnkucS1oHDJJ2VUhRyzQ/ufya9rCPe18= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546507; c=relaxed/simple; bh=oHfJuALzS6HApxgilm4rOTfLn9HklHZ8/ZXkKq6sjmo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SZAt82sbpg1zuB8XD12H2sx+U1hPYeb9Lvrzj5z9iIAApViVPUlzuxDxw8nghYvMcLD/V0TeEDutjr6FDlpL7io0eJLKpPAOvgBlYnY+CM2B5gHeHtD+q8+VizuyNlbcCg5Gcmk7jdWomgQ491cegPvC/wJuqKr9zmQFyUEJrns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PmjzBrT+; 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="PmjzBrT+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 272A3C2BCB3; Wed, 19 Nov 2025 10:01:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546506; bh=oHfJuALzS6HApxgilm4rOTfLn9HklHZ8/ZXkKq6sjmo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PmjzBrT+4dv/ofyCiq7HNY8tFeNNiMdzdbfRjL6abaV82vyHAR9yNfFB1LpTT7FIf sCSeTCOy1POnYmw0RsuLJPPY9dalPwJi+MdwWCTXBehkE3pMxTUGHiAcasUkK/uiiI 1EGIfkMfWj2rcACMjIynwltBQ4esLSeA86K4DOeOofj1N8QbJBRM+VJyjCmm5MMHfH ePCCaLKrgqusP3DG2nDsCrxPVoteth2WcxjtneAOHoUf3NZzNDlzw4vI0k3YhAGYwl EppGEi03dqCbvf3zsiDJry9mELi6aDfnkv9TNgms4P7LPj6bx6GnZrbKaRktIPx415 BL+mBJ6T3d8yQ== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 01/10] tty: pty: use guard()s Date: Wed, 19 Nov 2025 11:01:31 +0100 Message-ID: <20251119100140.830761-2-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 pty code. This improves readability, makes error handling easier, and marks locked portions of code explicit. All that while being sure the lock is unlocked. pty_set_pktmode() is handled specially -- the conditions are inverted and return called if conditions unmet. This avoid double nested 'if's. The variable is renamed to want_pktmode so it is not confused with the current state of pktmode. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/pty.c | 103 ++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 58 deletions(-) diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c index 8bb1a01fef2a..76188b8f3ba3 100644 --- a/drivers/tty/pty.c +++ b/drivers/tty/pty.c @@ -57,9 +57,8 @@ static void pty_close(struct tty_struct *tty, struct file= *filp) set_bit(TTY_IO_ERROR, &tty->flags); wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait); - spin_lock_irq(&tty->ctrl.lock); - tty->ctrl.packet =3D false; - spin_unlock_irq(&tty->ctrl.lock); + scoped_guard(spinlock_irq, &tty->ctrl.lock) + tty->ctrl.packet =3D false; /* Review - krefs on tty_link ?? */ if (!tty->link) return; @@ -70,10 +69,9 @@ static void pty_close(struct tty_struct *tty, struct fil= e *filp) set_bit(TTY_OTHER_CLOSED, &tty->flags); #ifdef CONFIG_UNIX98_PTYS if (tty->driver =3D=3D ptm_driver) { - mutex_lock(&devpts_mutex); + guard(mutex)(&devpts_mutex); if (tty->link->driver_data) devpts_pty_kill(tty->link->driver_data); - mutex_unlock(&devpts_mutex); } #endif tty_vhangup(tty->link); @@ -157,21 +155,23 @@ static int pty_get_lock(struct tty_struct *tty, int _= _user *arg) /* Set the packet mode on a pty */ static int pty_set_pktmode(struct tty_struct *tty, int __user *arg) { - int pktmode; + int want_pktmode; =20 - if (get_user(pktmode, arg)) + if (get_user(want_pktmode, arg)) return -EFAULT; =20 - spin_lock_irq(&tty->ctrl.lock); - if (pktmode) { - if (!tty->ctrl.packet) { - tty->link->ctrl.pktstatus =3D 0; - smp_mb(); - tty->ctrl.packet =3D true; - } - } else + guard(spinlock_irq)(&tty->ctrl.lock); + if (!want_pktmode) { tty->ctrl.packet =3D false; - spin_unlock_irq(&tty->ctrl.lock); + return 0; + } + + if (tty->ctrl.packet) + return 0; + + tty->link->ctrl.pktstatus =3D 0; + smp_mb(); + tty->ctrl.packet =3D true; =20 return 0; } @@ -210,10 +210,9 @@ static void pty_flush_buffer(struct tty_struct *tty) =20 tty_buffer_flush(to, NULL); if (to->ctrl.packet) { - spin_lock_irq(&tty->ctrl.lock); + guard(spinlock_irq)(&tty->ctrl.lock); tty->ctrl.pktstatus |=3D TIOCPKT_FLUSHWRITE; wake_up_interruptible(&to->read_wait); - spin_unlock_irq(&tty->ctrl.lock); } } =20 @@ -252,17 +251,17 @@ static void pty_set_termios(struct tty_struct *tty, STOP_CHAR(tty) =3D=3D '\023' && START_CHAR(tty) =3D=3D '\021'); if ((old_flow !=3D new_flow) || extproc) { - spin_lock_irq(&tty->ctrl.lock); - if (old_flow !=3D new_flow) { - tty->ctrl.pktstatus &=3D ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP); - if (new_flow) - tty->ctrl.pktstatus |=3D TIOCPKT_DOSTOP; - else - tty->ctrl.pktstatus |=3D TIOCPKT_NOSTOP; + scoped_guard(spinlock_irq, &tty->ctrl.lock) { + if (old_flow !=3D new_flow) { + tty->ctrl.pktstatus &=3D ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP); + if (new_flow) + tty->ctrl.pktstatus |=3D TIOCPKT_DOSTOP; + else + tty->ctrl.pktstatus |=3D TIOCPKT_NOSTOP; + } + if (extproc) + tty->ctrl.pktstatus |=3D TIOCPKT_IOCTL; } - if (extproc) - tty->ctrl.pktstatus |=3D TIOCPKT_IOCTL; - spin_unlock_irq(&tty->ctrl.lock); wake_up_interruptible(&tty->link->read_wait); } } @@ -286,9 +285,9 @@ static int pty_resize(struct tty_struct *tty, struct w= insize *ws) struct tty_struct *pty =3D tty->link; =20 /* For a PTY we need to lock the tty side */ - mutex_lock(&tty->winsize_mutex); + guard(mutex)(&tty->winsize_mutex); if (!memcmp(ws, &tty->winsize, sizeof(*ws))) - goto done; + return 0; =20 /* Signal the foreground process group of both ptys */ pgrp =3D tty_get_pgrp(tty); @@ -304,8 +303,7 @@ static int pty_resize(struct tty_struct *tty, struct w= insize *ws) =20 tty->winsize =3D *ws; pty->winsize =3D *ws; /* Never used so will go away soon */ -done: - mutex_unlock(&tty->winsize_mutex); + return 0; } =20 @@ -321,28 +319,26 @@ static int pty_resize(struct tty_struct *tty, struct= winsize *ws) */ static void pty_start(struct tty_struct *tty) { - unsigned long flags; + if (!tty->link || !tty->link->ctrl.packet) + return; =20 - if (tty->link && tty->link->ctrl.packet) { - spin_lock_irqsave(&tty->ctrl.lock, flags); + scoped_guard(spinlock_irqsave, &tty->ctrl.lock) { tty->ctrl.pktstatus &=3D ~TIOCPKT_STOP; tty->ctrl.pktstatus |=3D TIOCPKT_START; - spin_unlock_irqrestore(&tty->ctrl.lock, flags); - wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); } + wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); } =20 static void pty_stop(struct tty_struct *tty) { - unsigned long flags; + if (!tty->link || !tty->link->ctrl.packet) + return; =20 - if (tty->link && tty->link->ctrl.packet) { - spin_lock_irqsave(&tty->ctrl.lock, flags); + scoped_guard(spinlock_irqsave, &tty->ctrl.lock) { tty->ctrl.pktstatus &=3D ~TIOCPKT_START; tty->ctrl.pktstatus |=3D TIOCPKT_STOP; - spin_unlock_irqrestore(&tty->ctrl.lock, flags); - wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); } + wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); } =20 /** @@ -705,15 +701,9 @@ static struct tty_struct *ptm_unix98_lookup(struct tty= _driver *driver, static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver, struct file *file, int idx) { - struct tty_struct *tty; - - mutex_lock(&devpts_mutex); - tty =3D devpts_get_priv(file->f_path.dentry); - mutex_unlock(&devpts_mutex); + guard(mutex)(&devpts_mutex); /* Master must be open before slave */ - if (!tty) - return ERR_PTR(-EIO); - return tty; + return devpts_get_priv(file->f_path.dentry) ? : ERR_PTR(-EIO); } =20 static int pty_unix98_install(struct tty_driver *driver, struct tty_struct= *tty) @@ -811,20 +801,17 @@ static int ptmx_open(struct inode *inode, struct file= *filp) } =20 /* find a device that is not in use. */ - mutex_lock(&devpts_mutex); - index =3D devpts_new_index(fsi); - mutex_unlock(&devpts_mutex); + scoped_guard(mutex, &devpts_mutex) + index =3D devpts_new_index(fsi); =20 retval =3D index; if (index < 0) goto out_put_fsi; =20 =20 - mutex_lock(&tty_mutex); - tty =3D tty_init_dev(ptm_driver, index); - /* The tty returned here is locked so we can safely - drop the mutex */ - mutex_unlock(&tty_mutex); + /* The tty returned here is locked so we can safely drop the mutex */ + scoped_guard(mutex, &tty_mutex) + tty =3D tty_init_dev(ptm_driver, index); =20 retval =3D PTR_ERR(tty); if (IS_ERR(tty)) --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 840B6347BDD; Wed, 19 Nov 2025 10:01:48 +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=1763546508; cv=none; b=HK1ywP2KI8L8CjZ0kd6Xaz+2AvgIBZg9hNwfaeONy3aHyV9N2jsPTk6GkNUsks0ZPxqf6ny1R+/q8zGsOjo9kd+rg9anVJ77lX+Vt8zwKIg3j1fitIu0QxkSakuMPopmyh0OL7SopQtmQnFC5LDuicB38tpVeq2fXGJEj6l2HP0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546508; c=relaxed/simple; bh=6CyRYFoc296f9e9x6WJYtypiKPAL54TTjJEqM44Kyqk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BCrbvmecGwjrr1Xwik+iqaGK1CSVqHAvh7Efv+ANdUf/SWcGJCAL++kuqhSFU7ceeByjtuiV5n8B6fdaLiVYwSwceXJdGx88xc7aP89QfttQDTE/e8TTBgr2YKq1fuflmYYNBXDEqrBbHam86rNz3rvv2SDXyVlMTRuXdJ0o8gk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Cd3V45u8; 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="Cd3V45u8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E62F5C19425; Wed, 19 Nov 2025 10:01:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546508; bh=6CyRYFoc296f9e9x6WJYtypiKPAL54TTjJEqM44Kyqk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Cd3V45u8u9xQQ7snOxd0xxaKwWA4ROZZHEfjOTPify/ivpbxMYbhNweT8n1AsHkUT dMO/gKLx8XcI2VzoFBsz1hFm3XkM9lk+EWI6Q/wdBNoGeeiCTZCYXLACqv30UHvGQJ zrwJiKuqlvrP6451jrUFmGDBRKjzb8WuHzZwpm6yn7PRlSUiWbmg2lvdgi7KL6nGt8 eFynMVUvW1YzvxniTp7MXgVeHWH2PParJ5fbg1XByyCGED6z8zA1wZIjFBQbtU7wud PbCWUUnCIOT3OemEcWeWQprFVzFPDbAGZ+iViky+Ny2e+7+B2FF4ODvuQuHeZ3XdeK EIbrbhUQaKvpA== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 02/10] tty: n_tty: use guard()s Date: Wed, 19 Nov 2025 11:01:32 +0100 Message-ID: <20251119100140.830761-3-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 n_tty 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/n_tty.c | 109 +++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 6af3f3a0b531..e6a0f5b40d0a 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -324,12 +324,9 @@ static void reset_buffer_flags(struct n_tty_data *ldat= a) =20 static void n_tty_packet_mode_flush(struct tty_struct *tty) { - unsigned long flags; - if (tty->link->ctrl.packet) { - spin_lock_irqsave(&tty->ctrl.lock, flags); - tty->ctrl.pktstatus |=3D TIOCPKT_FLUSHREAD; - spin_unlock_irqrestore(&tty->ctrl.lock, flags); + scoped_guard(spinlock_irqsave, &tty->ctrl.lock) + tty->ctrl.pktstatus |=3D TIOCPKT_FLUSHREAD; wake_up_interruptible(&tty->link->read_wait); } } @@ -349,13 +346,12 @@ static void n_tty_packet_mode_flush(struct tty_struct= *tty) */ static void n_tty_flush_buffer(struct tty_struct *tty) { - down_write(&tty->termios_rwsem); + guard(rwsem_write)(&tty->termios_rwsem); reset_buffer_flags(tty->disc_data); n_tty_kick_worker(tty); =20 if (tty->link) n_tty_packet_mode_flush(tty); - up_write(&tty->termios_rwsem); } =20 /** @@ -737,24 +733,22 @@ static void commit_echoes(struct tty_struct *tty) size_t nr, old, echoed; size_t head; =20 - mutex_lock(&ldata->output_lock); - head =3D ldata->echo_head; - ldata->echo_mark =3D head; - old =3D ldata->echo_commit - ldata->echo_tail; - - /* Process committed echoes if the accumulated # of bytes - * is over the threshold (and try again each time another - * block is accumulated) */ - nr =3D head - ldata->echo_tail; - if (nr < ECHO_COMMIT_WATERMARK || - (nr % ECHO_BLOCK > old % ECHO_BLOCK)) { - mutex_unlock(&ldata->output_lock); - return; - } + scoped_guard(mutex, &ldata->output_lock) { + head =3D ldata->echo_head; + ldata->echo_mark =3D head; + old =3D ldata->echo_commit - ldata->echo_tail; + + /* + * Process committed echoes if the accumulated # of bytes is over the th= reshold + * (and try again each time another block is accumulated) + */ + nr =3D head - ldata->echo_tail; + if (nr < ECHO_COMMIT_WATERMARK || (nr % ECHO_BLOCK > old % ECHO_BLOCK)) + return; =20 - ldata->echo_commit =3D head; - echoed =3D __process_echoes(tty); - mutex_unlock(&ldata->output_lock); + ldata->echo_commit =3D head; + echoed =3D __process_echoes(tty); + } =20 if (echoed && tty->ops->flush_chars) tty->ops->flush_chars(tty); @@ -768,10 +762,10 @@ static void process_echoes(struct tty_struct *tty) if (ldata->echo_mark =3D=3D ldata->echo_tail) return; =20 - mutex_lock(&ldata->output_lock); - ldata->echo_commit =3D ldata->echo_mark; - echoed =3D __process_echoes(tty); - mutex_unlock(&ldata->output_lock); + scoped_guard(mutex, &ldata->output_lock) { + ldata->echo_commit =3D ldata->echo_mark; + echoed =3D __process_echoes(tty); + } =20 if (echoed && tty->ops->flush_chars) tty->ops->flush_chars(tty); @@ -786,10 +780,9 @@ static void flush_echoes(struct tty_struct *tty) ldata->echo_commit =3D=3D ldata->echo_head) return; =20 - mutex_lock(&ldata->output_lock); + guard(mutex)(&ldata->output_lock); ldata->echo_commit =3D ldata->echo_head; __process_echoes(tty); - mutex_unlock(&ldata->output_lock); } =20 /** @@ -1078,18 +1071,19 @@ static void isig(int sig, struct tty_struct *tty) if (L_NOFLSH(tty)) { /* signal only */ __isig(sig, tty); + return; + } =20 - } else { /* signal and flush */ - up_read(&tty->termios_rwsem); - down_write(&tty->termios_rwsem); - + /* signal and flush */ + up_read(&tty->termios_rwsem); + scoped_guard(rwsem_write, &tty->termios_rwsem) { __isig(sig, tty); =20 /* clear echo buffer */ - mutex_lock(&ldata->output_lock); - ldata->echo_head =3D ldata->echo_tail =3D 0; - ldata->echo_mark =3D ldata->echo_commit =3D 0; - mutex_unlock(&ldata->output_lock); + scoped_guard(mutex, &ldata->output_lock) { + ldata->echo_head =3D ldata->echo_tail =3D 0; + ldata->echo_mark =3D ldata->echo_commit =3D 0; + } =20 /* clear output buffer */ tty_driver_flush_buffer(tty); @@ -1100,10 +1094,8 @@ static void isig(int sig, struct tty_struct *tty) /* notify pty master of flush */ if (tty->link) n_tty_packet_mode_flush(tty); - - up_write(&tty->termios_rwsem); - down_read(&tty->termios_rwsem); } + down_read(&tty->termios_rwsem); } =20 /** @@ -1683,7 +1675,7 @@ n_tty_receive_buf_common(struct tty_struct *tty, cons= t u8 *cp, const u8 *fp, size_t n, rcvd =3D 0; int room, overflow; =20 - down_read(&tty->termios_rwsem); + guard(rwsem_read)(&tty->termios_rwsem); =20 do { /* @@ -1752,8 +1744,6 @@ n_tty_receive_buf_common(struct tty_struct *tty, cons= t u8 *cp, const u8 *fp, n_tty_kick_worker(tty); } =20 - up_read(&tty->termios_rwsem); - return rcvd; } =20 @@ -1879,10 +1869,9 @@ static void n_tty_close(struct tty_struct *tty) if (tty->link) n_tty_packet_mode_flush(tty); =20 - down_write(&tty->termios_rwsem); + guard(rwsem_write)(&tty->termios_rwsem); vfree(ldata); tty->disc_data =3D NULL; - up_write(&tty->termios_rwsem); } =20 /** @@ -2247,10 +2236,10 @@ static ssize_t n_tty_read(struct tty_struct *tty, s= truct file *file, u8 *kbuf, u8 cs; if (kb !=3D kbuf) break; - spin_lock_irq(&tty->link->ctrl.lock); - cs =3D tty->link->ctrl.pktstatus; - tty->link->ctrl.pktstatus =3D 0; - spin_unlock_irq(&tty->link->ctrl.lock); + scoped_guard(spinlock_irq, &tty->link->ctrl.lock) { + cs =3D tty->link->ctrl.pktstatus; + tty->link->ctrl.pktstatus =3D 0; + } *kb++ =3D cs; nr--; break; @@ -2357,7 +2346,7 @@ static ssize_t n_tty_write(struct tty_struct *tty, st= ruct file *file, return retval; } =20 - down_read(&tty->termios_rwsem); + guard(rwsem_read)(&tty->termios_rwsem); =20 /* Write out any echoed characters that are still pending */ process_echoes(tty); @@ -2395,9 +2384,8 @@ static ssize_t n_tty_write(struct tty_struct *tty, st= ruct file *file, struct n_tty_data *ldata =3D tty->disc_data; =20 while (nr > 0) { - mutex_lock(&ldata->output_lock); - num =3D tty->ops->write(tty, b, nr); - mutex_unlock(&ldata->output_lock); + scoped_guard(mutex, &ldata->output_lock) + num =3D tty->ops->write(tty, b, nr); if (num < 0) { retval =3D num; goto break_out; @@ -2424,7 +2412,7 @@ static ssize_t n_tty_write(struct tty_struct *tty, st= ruct file *file, remove_wait_queue(&tty->write_wait, &wait); if (nr && tty->fasync) set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); - up_read(&tty->termios_rwsem); + return (b - buf) ? b - buf : retval; } =20 @@ -2498,12 +2486,11 @@ static int n_tty_ioctl(struct tty_struct *tty, unsi= gned int cmd, case TIOCOUTQ: return put_user(tty_chars_in_buffer(tty), (int __user *) arg); case TIOCINQ: - down_write(&tty->termios_rwsem); - if (L_ICANON(tty) && !L_EXTPROC(tty)) - num =3D inq_canon(ldata); - else - num =3D read_cnt(ldata); - up_write(&tty->termios_rwsem); + scoped_guard(rwsem_write, &tty->termios_rwsem) + if (L_ICANON(tty) && !L_EXTPROC(tty)) + num =3D inq_canon(ldata); + else + num =3D read_cnt(ldata); return put_user(num, (unsigned int __user *) arg); default: return n_tty_ioctl_helper(tty, cmd, arg); --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 930B4347FF7; Wed, 19 Nov 2025 10:01:50 +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=1763546510; cv=none; b=Y8lDcPG83bGGdLqsYxaX1fJx0u2RpU4/voGAOwwL8giX4a23UmFlhOPdNYaCifT6xYfK/mqAQbrHpzchGCuj8aRyAB+N9nJdLV1xcapvQ4lZ/QdrIG398bmRUmsNL8Xjxtvw8v4g9MuRj3LzLbPxFdwS7XCkQDSFJVA1NQgYcdI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546510; c=relaxed/simple; bh=rmNlTLUmDmktbJUpOcgfcgiLBfJQH5gdGCf28ckt4bM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jo+ksd98ndvtfORmsy2vThK90PgnH/R5kncHtGame8BbH0QRvsiosJP0dRPK0pEeSRn9Nu8TEPaER349e7/6eI3IYXvo35Nl2Q2+65vk6d+noN4fHKnMahbTYKxmx1PU1KB6BAd/mfZmuSqv4h4cxFxUS7RVFTTieyvXqLntF7s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Mjgm6vA0; 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="Mjgm6vA0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8C61C4AF0E; Wed, 19 Nov 2025 10:01:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546510; bh=rmNlTLUmDmktbJUpOcgfcgiLBfJQH5gdGCf28ckt4bM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Mjgm6vA06XYqR54McH7FbPwmU5KlA7vPKweK7C2Ktbtwg/LIBLyG6b29yg/bj1ety BWzQ1YXEx+YzfPcPKfXxyYWEy8YhPweIxkc96zGBEbJvy7zD2EMeOxDCX0Tu5B3jrM KiKmeGZ4UjMZjPbtQKFWSUukpApE/XC/5f/byzdZe8RCn/N8RKHtaQiJEP01/RN67P PqnaqdBW/fRo6aGNYU5nW35KAxF7NCKLtm9uz/zSQUaN4+qrZLtVsWGwW/cKrIM7RO pMAHhwqCXtQkA4qMEpywb30FJHr3J4TSvRJQGgQuuDFqikb1MkSDjqS107MGOvs74k s4YOT4Y9nzJog== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 03/10] tty: n_hdlc: simplify return from n_hdlc_tty_ioctl() Date: Wed, 19 Nov 2025 11:01:33 +0100 Message-ID: <20251119100140.830761-4-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" The cases in the switch() of n_hdlc_tty_ioctl() can return immediately -- no need to store into error and return later. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/n_hdlc.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/drivers/tty/n_hdlc.c b/drivers/tty/n_hdlc.c index 4a4dc58b866a..66bb8ce6ec40 100644 --- a/drivers/tty/n_hdlc.c +++ b/drivers/tty/n_hdlc.c @@ -584,7 +584,6 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, uns= igned int cmd, unsigned long arg) { struct n_hdlc *n_hdlc =3D tty->disc_data; - int error =3D 0; int count; unsigned long flags; struct n_hdlc_buf *buf =3D NULL; @@ -603,8 +602,7 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, uns= igned int cmd, else count =3D 0; spin_unlock_irqrestore(&n_hdlc->rx_buf_list.spinlock, flags); - error =3D put_user(count, (int __user *)arg); - break; + return put_user(count, (int __user *)arg); =20 case TIOCOUTQ: /* get the pending tx byte count in the driver */ @@ -616,8 +614,7 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, uns= igned int cmd, if (buf) count +=3D buf->count; spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); - error =3D put_user(count, (int __user *)arg); - break; + return put_user(count, (int __user *)arg); =20 case TCFLSH: switch (arg) { @@ -628,11 +625,8 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, un= signed int cmd, fallthrough; /* to default */ =20 default: - error =3D n_tty_ioctl_helper(tty, cmd, arg); - break; + return n_tty_ioctl_helper(tty, cmd, arg); } - return error; - } /* end of n_hdlc_tty_ioctl() */ =20 /** --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 7B931349AE9; Wed, 19 Nov 2025 10:01:52 +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=1763546512; cv=none; b=Ch4zZeOM1FG1zM3saeqAwB66w2S8NqnYUcXxFNptdNH/llpwnM0Tz5XaEVAcErom8iYtiYeJmf1SbBlnNlL7I3VHXoCeYtaHMd/QvBIw0P7ZXWXta1roeHL//BJG8CuENv5IhM3GeM/zJE3pn58e8e1pU4kq7PVNuyxEJ6EzoRE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546512; c=relaxed/simple; bh=cSE1bgc/A5b3+eoo1rQhSQWurH3UJYa01QLJN+44l/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rX81DaXqMI5Go65TQzeFfa2oRvOffhfgYa6MAxe0jaym3fmdg0K8t1qKfGTxbSASAPPMDW1ys4Kkt7GzkXR67HP+0Co5lDV41e1SuNzBAGHZaoRoh2mZ/rjrwd8UgcT5HYGnokKwMuXVyrR334/r/edoJthaZMykRa2ybid3fuw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d/fhpU+y; 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="d/fhpU+y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 848C8C4CEF5; Wed, 19 Nov 2025 10:01:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546511; bh=cSE1bgc/A5b3+eoo1rQhSQWurH3UJYa01QLJN+44l/E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d/fhpU+yvSO4iZphSI6puKLlx4b+ro10iKejfVz+b7eCczlfeLXw+ntm0R5hZBngu C7zOFCzEia5nGJIzk6wArj1/gB14kwRRtlULvd3XkrBD7hZWeaLO/hrgjDBmyrFd8b 5hsCWFxUb2V+hoQdW8sQCeMo9y+K/VRULWZxrVhlZlGmx8OCtScsjcDw7j7lVch7HZ CiTY+gySYo78ZZRidhunSYKsiAWHTs7J1UBPOIUiQsFRpShBUSB0Aiid6x/WPNsxWI MbeCRZjnKvlGnHz4hTD8Q8JV/yd8Q3e1QAmeju7iJ1OvffXOm7gesVEEvrndyq2e0P 30vBJMECtg6mQ== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 04/10] tty: n_hdlc: use guard()s Date: Wed, 19 Nov 2025 11:01:34 +0100 Message-ID: <20251119100140.830761-5-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 n_hdlc 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/n_hdlc.c | 67 +++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/drivers/tty/n_hdlc.c b/drivers/tty/n_hdlc.c index 66bb8ce6ec40..3c9dcb0928c6 100644 --- a/drivers/tty/n_hdlc.c +++ b/drivers/tty/n_hdlc.c @@ -263,21 +263,18 @@ static int n_hdlc_tty_open(struct tty_struct *tty) */ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *t= ty) { - unsigned long flags; struct n_hdlc_buf *tbuf; ssize_t actual; =20 check_again: - - spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock, flags); - if (n_hdlc->tbusy) { - n_hdlc->woke_up =3D true; - spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); - return; + scoped_guard(spinlock_irqsave, &n_hdlc->tx_buf_list.spinlock) { + if (n_hdlc->tbusy) { + n_hdlc->woke_up =3D true; + return; + } + n_hdlc->tbusy =3D true; + n_hdlc->woke_up =3D false; } - n_hdlc->tbusy =3D true; - n_hdlc->woke_up =3D false; - spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); =20 tbuf =3D n_hdlc_buf_get(&n_hdlc->tx_buf_list); while (tbuf) { @@ -324,9 +321,8 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, s= truct tty_struct *tty) clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); =20 /* Clear the re-entry flag */ - spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock, flags); - n_hdlc->tbusy =3D false; - spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); + scoped_guard(spinlock_irqsave, &n_hdlc->tx_buf_list.spinlock) + n_hdlc->tbusy =3D false; =20 if (n_hdlc->woke_up) goto check_again; @@ -585,7 +581,6 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, uns= igned int cmd, { struct n_hdlc *n_hdlc =3D tty->disc_data; int count; - unsigned long flags; struct n_hdlc_buf *buf =3D NULL; =20 pr_debug("%s() called %d\n", __func__, cmd); @@ -594,26 +589,26 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, u= nsigned int cmd, case FIONREAD: /* report count of read data available */ /* in next available frame (if any) */ - spin_lock_irqsave(&n_hdlc->rx_buf_list.spinlock, flags); - buf =3D list_first_entry_or_null(&n_hdlc->rx_buf_list.list, - struct n_hdlc_buf, list_item); - if (buf) - count =3D buf->count; - else - count =3D 0; - spin_unlock_irqrestore(&n_hdlc->rx_buf_list.spinlock, flags); + scoped_guard(spinlock_irqsave, &n_hdlc->rx_buf_list.spinlock) { + buf =3D list_first_entry_or_null(&n_hdlc->rx_buf_list.list, + struct n_hdlc_buf, list_item); + if (buf) + count =3D buf->count; + else + count =3D 0; + } return put_user(count, (int __user *)arg); =20 case TIOCOUTQ: /* get the pending tx byte count in the driver */ count =3D tty_chars_in_buffer(tty); /* add size of next output frame in queue */ - spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock, flags); - buf =3D list_first_entry_or_null(&n_hdlc->tx_buf_list.list, - struct n_hdlc_buf, list_item); - if (buf) - count +=3D buf->count; - spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags); + scoped_guard(spinlock_irqsave, &n_hdlc->tx_buf_list.spinlock) { + buf =3D list_first_entry_or_null(&n_hdlc->tx_buf_list.list, + struct n_hdlc_buf, list_item); + if (buf) + count +=3D buf->count; + } return put_user(count, (int __user *)arg); =20 case TCFLSH: @@ -720,14 +715,10 @@ static struct n_hdlc *n_hdlc_alloc(void) static void n_hdlc_buf_return(struct n_hdlc_buf_list *buf_list, struct n_hdlc_buf *buf) { - unsigned long flags; - - spin_lock_irqsave(&buf_list->spinlock, flags); + guard(spinlock_irqsave)(&buf_list->spinlock); =20 list_add(&buf->list_item, &buf_list->list); buf_list->count++; - - spin_unlock_irqrestore(&buf_list->spinlock, flags); } =20 /** @@ -738,14 +729,10 @@ static void n_hdlc_buf_return(struct n_hdlc_buf_list = *buf_list, static void n_hdlc_buf_put(struct n_hdlc_buf_list *buf_list, struct n_hdlc_buf *buf) { - unsigned long flags; - - spin_lock_irqsave(&buf_list->spinlock, flags); + guard(spinlock_irqsave)(&buf_list->spinlock); =20 list_add_tail(&buf->list_item, &buf_list->list); buf_list->count++; - - spin_unlock_irqrestore(&buf_list->spinlock, flags); } /* end of n_hdlc_buf_put() */ =20 /** @@ -758,10 +745,9 @@ static void n_hdlc_buf_put(struct n_hdlc_buf_list *buf= _list, */ static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *buf_list) { - unsigned long flags; struct n_hdlc_buf *buf; =20 - spin_lock_irqsave(&buf_list->spinlock, flags); + guard(spinlock_irqsave)(&buf_list->spinlock); =20 buf =3D list_first_entry_or_null(&buf_list->list, struct n_hdlc_buf, list_item); @@ -770,7 +756,6 @@ static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_= buf_list *buf_list) buf_list->count--; } =20 - spin_unlock_irqrestore(&buf_list->spinlock, flags); return buf; } /* end of n_hdlc_buf_get() */ =20 --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 From nobody Tue Dec 2 02:18:58 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 6E366349B0F; Wed, 19 Nov 2025 10:01:56 +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=1763546516; cv=none; b=qI97iclX5qlLT9pHSDDJi59D7HuAeqf/90Nx9UFqbfa36mQKzrAe42z+wlZ582XGmB21MU4L9nKn91/25OSa1L1Iw0pVZAlHdJMR0kmoSJWllRsuFv2J3vaYpNPhd7sx9QIT5kG984daL1IKtz5v+RBkh2pUEPi+45K+Xz4ASHU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546516; c=relaxed/simple; bh=dKYd4f9bTvh4dq4HOKmCrwwkBgqb3laCunGX/2ECfEM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o0Zh/ESyOlTSHJkw2/DkFlq/I5v8sQ7od2kBIHlNYKN0rPCHc1OErelFXe6B0mDppkORyQaelt88HhVAyLnRidtXNPVgRFEi/DT/RyUtnRxju2FcfThvoB+XMK+1fkgROxrfzOTceJS3JP6hydTIPFBcLtO7qMuHbLMai21oiPk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WBQhxQo1; 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="WBQhxQo1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 467C4C4AF11; Wed, 19 Nov 2025 10:01:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546515; bh=dKYd4f9bTvh4dq4HOKmCrwwkBgqb3laCunGX/2ECfEM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WBQhxQo1TcBmIol8jiqeioVEa4oqEvySrqWplf6lo40CYSl+Vn/Mch0TYQViCRb9V 71vNbGpOjW4kHqTEYLaFKXk6K+2be/5MhG3vgQsTdzaxR62Gj9As2Rl7wICcqT5uek PJexCe1U5BATqVFv9OAJL4dfReT+k3saRWa0B693xAJg9VXr9CUdeZ+FUyqBdni/zW bJa8Ut3e6AkCqFJU9NSXduk3odNmd1o5y9SSc0ecHKuTXXncZxhDEabiXxgoPfsIqE AuxOj1vlBpGeGQEN/eFmt9tH4KvuhK1PiYRcd2/6WtxVUUd+30RYO5apDY/A5W/uv4 gMVuwNSX6BaGw== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 06/10] tty: vt/keyboard: use __free() Date: Wed, 19 Nov 2025 11:01:36 +0100 Message-ID: <20251119100140.830761-7-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" The vt/keyboard code can use __free to ensure the temporary buffers are freed. Perform the switch. And even one non-temporary in kbd_connect(). There are fail paths, so ensure the buffer is freed in them and not when returning 0 -- by retain_and_null_ptr(). Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/vt/keyboard.c | 90 ++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index ee1d9c448c7e..65913a137862 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c @@ -1566,10 +1566,9 @@ static bool kbd_match(struct input_handler *handler,= struct input_dev *dev) static int kbd_connect(struct input_handler *handler, struct input_dev *de= v, const struct input_device_id *id) { - struct input_handle *handle; int error; =20 - handle =3D kzalloc(sizeof(struct input_handle), GFP_KERNEL); + struct input_handle __free(kfree) *handle =3D kzalloc(sizeof(*handle), GF= P_KERNEL); if (!handle) return -ENOMEM; =20 @@ -1579,18 +1578,18 @@ static int kbd_connect(struct input_handler *handle= r, struct input_dev *dev, =20 error =3D input_register_handle(handle); if (error) - goto err_free_handle; + return error; =20 error =3D input_open_device(handle); if (error) goto err_unregister_handle; =20 + retain_and_null_ptr(handle); + return 0; =20 err_unregister_handle: input_unregister_handle(handle); - err_free_handle: - kfree(handle); return error; } =20 @@ -1683,17 +1682,15 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) { unsigned long flags; int asize; - int ret =3D 0; =20 switch (cmd) { case KDGKBDIACR: { struct kbdiacrs __user *a =3D udp; - struct kbdiacr *dia; int i; =20 - dia =3D kmalloc_array(MAX_DIACR, sizeof(struct kbdiacr), - GFP_KERNEL); + struct kbdiacr __free(kfree) *dia =3D kmalloc_array(MAX_DIACR, sizeof(st= ruct kbdiacr), + GFP_KERNEL); if (!dia) return -ENOMEM; =20 @@ -1713,20 +1710,17 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) spin_unlock_irqrestore(&kbd_event_lock, flags); =20 if (put_user(asize, &a->kb_cnt)) - ret =3D -EFAULT; - else if (copy_to_user(a->kbdiacr, dia, - asize * sizeof(struct kbdiacr))) - ret =3D -EFAULT; - kfree(dia); - return ret; + return -EFAULT; + if (copy_to_user(a->kbdiacr, dia, asize * sizeof(struct kbdiacr))) + return -EFAULT; + return 0; } case KDGKBDIACRUC: { struct kbdiacrsuc __user *a =3D udp; - void *buf; =20 - buf =3D kmalloc_array(MAX_DIACR, sizeof(struct kbdiacruc), - GFP_KERNEL); + void __free(kfree) *buf =3D kmalloc_array(MAX_DIACR, sizeof(struct kbdia= cruc), + GFP_KERNEL); if (buf =3D=3D NULL) return -ENOMEM; =20 @@ -1740,18 +1734,17 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) spin_unlock_irqrestore(&kbd_event_lock, flags); =20 if (put_user(asize, &a->kb_cnt)) - ret =3D -EFAULT; - else if (copy_to_user(a->kbdiacruc, buf, - asize*sizeof(struct kbdiacruc))) - ret =3D -EFAULT; - kfree(buf); - return ret; + return -EFAULT; + if (copy_to_user(a->kbdiacruc, buf, asize * sizeof(struct kbdiacruc))) + return -EFAULT; + + return 0; } =20 case KDSKBDIACR: { struct kbdiacrs __user *a =3D udp; - struct kbdiacr *dia =3D NULL; + struct kbdiacr __free(kfree) *dia =3D NULL; unsigned int ct; int i; =20 @@ -1780,7 +1773,7 @@ int vt_do_diacrit(unsigned int cmd, void __user *udp,= int perm) conv_8bit_to_uni(dia[i].result); } spin_unlock_irqrestore(&kbd_event_lock, flags); - kfree(dia); + return 0; } =20 @@ -1788,7 +1781,7 @@ int vt_do_diacrit(unsigned int cmd, void __user *udp,= int perm) { struct kbdiacrsuc __user *a =3D udp; unsigned int ct; - void *buf =3D NULL; + void __free(kfree) *buf =3D NULL; =20 if (!perm) return -EPERM; @@ -1811,11 +1804,10 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) ct * sizeof(struct kbdiacruc)); accent_table_size =3D ct; spin_unlock_irqrestore(&kbd_event_lock, flags); - kfree(buf); return 0; } } - return ret; + return 0; } =20 /** @@ -1934,7 +1926,7 @@ static int vt_kdskbent(unsigned char kbdmode, unsigne= d char idx, unsigned char map, unsigned short val) { unsigned long flags; - unsigned short *key_map, *new_map, oldval; + unsigned short *key_map, oldval; =20 if (!idx && val =3D=3D K_NOSUCHMAP) { spin_lock_irqsave(&kbd_event_lock, flags); @@ -1965,7 +1957,7 @@ static int vt_kdskbent(unsigned char kbdmode, unsigne= d char idx, return 0; #endif =20 - new_map =3D kmalloc(sizeof(plain_map), GFP_KERNEL); + unsigned short __free(kfree) *new_map =3D kmalloc(sizeof(plain_map), GFP_= KERNEL); if (!new_map) return -ENOMEM; =20 @@ -1977,17 +1969,14 @@ static int vt_kdskbent(unsigned char kbdmode, unsig= ned char idx, if (keymap_count >=3D MAX_NR_OF_USER_KEYMAPS && !capable(CAP_SYS_RESOURCE)) { spin_unlock_irqrestore(&kbd_event_lock, flags); - kfree(new_map); return -EPERM; } - key_maps[map] =3D new_map; - key_map =3D new_map; + key_map =3D key_maps[map] =3D no_free_ptr(new_map); key_map[0] =3D U(K_ALLOCATED); for (j =3D 1; j < NR_KEYS; j++) key_map[j] =3D U(K_HOLE); keymap_count++; - } else - kfree(new_map); + } =20 oldval =3D U(key_map[idx]); if (val =3D=3D oldval) @@ -2050,8 +2039,6 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user= *user_kdgkb, int perm) { unsigned char kb_func; unsigned long flags; - char *kbs; - int ret; =20 if (get_user(kb_func, &user_kdgkb->kb_func)) return -EFAULT; @@ -2063,7 +2050,7 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user= *user_kdgkb, int perm) /* size should have been a struct member */ ssize_t len =3D sizeof(user_kdgkb->kb_string); =20 - kbs =3D kmalloc(len, GFP_KERNEL); + char __free(kfree) *kbs =3D kmalloc(len, GFP_KERNEL); if (!kbs) return -ENOMEM; =20 @@ -2071,20 +2058,20 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __us= er *user_kdgkb, int perm) len =3D strscpy(kbs, func_table[kb_func] ? : "", len); spin_unlock_irqrestore(&func_buf_lock, flags); =20 - if (len < 0) { - ret =3D -ENOSPC; - break; - } - ret =3D copy_to_user(user_kdgkb->kb_string, kbs, len + 1) ? - -EFAULT : 0; - break; + if (len < 0) + return -ENOSPC; + + if (copy_to_user(user_kdgkb->kb_string, kbs, len + 1)) + return -EFAULT; + + return 0; } case KDSKBSENT: if (!perm || !capable(CAP_SYS_TTY_CONFIG)) return -EPERM; =20 - kbs =3D strndup_user(user_kdgkb->kb_string, - sizeof(user_kdgkb->kb_string)); + char __free(kfree) *kbs =3D strndup_user(user_kdgkb->kb_string, + sizeof(user_kdgkb->kb_string)); if (IS_ERR(kbs)) return PTR_ERR(kbs); =20 @@ -2092,13 +2079,10 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __us= er *user_kdgkb, int perm) kbs =3D vt_kdskbsent(kbs, kb_func); spin_unlock_irqrestore(&func_buf_lock, flags); =20 - ret =3D 0; - break; + return 0; } =20 - kfree(kbs); - - return ret; + return 0; } =20 int vt_do_kdskled(unsigned int console, int cmd, unsigned long arg, int pe= rm) --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 B3D61349B05; Wed, 19 Nov 2025 10:01:57 +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=1763546517; cv=none; b=TVH8OvlxnxIht66821GhkpZ7tGtVjed4C+SzuXqwvBnZj020nlmPbHNK7DxdovZ4nrWHpb6/6wUixn/UMvpwQ4YgbpMx8A2VtuNgI93TopQpbYxvTyl9/VcCb47jpb0+gZjJkLRCtl+DNo51M18vK1Fjfyc0OOpaq4WD2CnrFiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546517; c=relaxed/simple; bh=/hB2Tk5p5xB7+eWRu0lZ/bqHN+XZ3Xw1NNg2bA4CdNo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pxC2QQbcMpZ8fTC3vtmx0xXQlM9eOjry6SRr0SRrcomjGqxJe7oAKgv9mNainrqyWDzApAhawfLLQkTikqNNgNzQwvX1Pq1sHmJP9RxikRoEqfuBaMDFenIUw5vfbRplkQkHGSQb4kzze4Al2XyXXdUedc2zx95s9wu6DKnWUqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RqYqe6qa; 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="RqYqe6qa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0F514C19421; Wed, 19 Nov 2025 10:01:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546517; bh=/hB2Tk5p5xB7+eWRu0lZ/bqHN+XZ3Xw1NNg2bA4CdNo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RqYqe6qawKmo0p8wMjFiMWCRHT8hfREQi4YQVyCwVsiC5LLpFGTbeY2YiVOGESHBN TjmYLNcRbWg8DGtihdyx3vIBxTAkUI2duqvdLiSPH67zr2VvBvyJAKTmwWi04N1/+0 i+KbfK4wupDxYLT4r0Zg/nV6BEdoHQARX8YQRMfa011VemzB3OmbM/NmJ53SAoxKGB cuw5vp6v4F7pkRnmZ+NfHitCWPmVI3QsbGwRi5oe9om0IVDDv9VO9IzfEhPAtWX24f pTil/2shcYL8j8eKXSQEmR+3fTS7VpG4yRtKagLkXXOFfkLhdbasURfYeybhYP4qwS 4+eo4KEVC/FKg== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 07/10] tty: vt/keyboard: simplify returns from vt_do_kbkeycode_ioctl() Date: Wed, 19 Nov 2025 11:01:37 +0100 Message-ID: <20251119100140.830761-8-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" Return immediately when something goes wrong in vt_do_kbkeycode_ioctl(). This makes the code flow more obvious. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/vt/keyboard.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index 65913a137862..487518a696e6 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c @@ -1879,27 +1879,27 @@ int vt_do_kdskbmeta(unsigned int console, unsigned = int arg) return ret; } =20 -int vt_do_kbkeycode_ioctl(int cmd, struct kbkeycode __user *user_kbkc, - int perm) +int vt_do_kbkeycode_ioctl(int cmd, struct kbkeycode __user *user_kbkc, int= perm) { struct kbkeycode tmp; - int kc =3D 0; + int kc; =20 if (copy_from_user(&tmp, user_kbkc, sizeof(struct kbkeycode))) return -EFAULT; + switch (cmd) { case KDGETKEYCODE: kc =3D getkeycode(tmp.scancode); - if (kc >=3D 0) - kc =3D put_user(kc, &user_kbkc->keycode); - break; + if (kc < 0) + return kc; + return put_user(kc, &user_kbkc->keycode); case KDSETKEYCODE: if (!perm) return -EPERM; - kc =3D setkeycode(tmp.scancode, tmp.keycode); - break; + return setkeycode(tmp.scancode, tmp.keycode); } - return kc; + + return 0; } =20 static unsigned short vt_kdgkbent(unsigned char kbdmode, unsigned char idx, --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 4C269347BBA; Wed, 19 Nov 2025 10:02:00 +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=1763546520; cv=none; b=WNfYOIADSguyRGbvUDe6buHx7CUJEkflQ/IN3my14yu+4eNgYVT7VsecqAx0C3e2TwNSfQdhG4XT6uVEd6wr0NkX+N7ysV0owP+nmLOD5j71hhtZ6rsCfPJfUNt+b+bAPEEnK9NAhMBwDO1oiTFBGovYU01a853ZfYDC5fTQVbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546520; c=relaxed/simple; bh=ctvkVb4Cz5cFYM3db5OiLbVUlzMMeDUOeX9CsDNxdlM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gBpP+tEeg9GHEjOL5BDvXPLtg1Gel6FsIAPnFXAIuMjabVhx8cwrX0+U1w0XLruQGGubC6hL65MM2Hys71KLQsCeX74ifIE1ZIgKFMJZxlPMmGEsiF8vC9Cu4HBxP5J3BFTgh72gS5auW/28o1BqiarXepJAEj3hRLCbdPIWyRU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uFUrzRoy; 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="uFUrzRoy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C83BC4CEF5; Wed, 19 Nov 2025 10:01:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546519; bh=ctvkVb4Cz5cFYM3db5OiLbVUlzMMeDUOeX9CsDNxdlM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uFUrzRoyYC7zE3nDK7NyD4o8GfoilaXFe8bpLVCMmkNBCeAy05KMvh8dsJlGVAaPJ dI9GkoB931yaDKgXA5+wvFSWGjd1fTjee7y/52WwM6JrpoRbS4AORpyM978Hgf0QFj oX+DLm3M64Xux/4SzoI+IsD7h1F8XE9mWUlzLvIlKsOKoUZjR30QGZ9vZ8ml0gDYml NU//YWWYRaRMIRnt8Fj8Egm4M/dCHgBRFXuTy9GuCdBH+0z7D4KrxpDkXtOGlTkLKI zrOtZY/cR3gbgr8wBsyvb06Ozrttr5/pjzuIGvMJ/u1PfHAt/Jclnveb9+7nhOS/VK CtXmGVrC7ISsA== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 08/10] tty: vt/keyboard: use guard()s Date: Wed, 19 Nov 2025 11:01:38 +0100 Message-ID: <20251119100140.830761-9-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 vt/keyboard 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/vt/keyboard.c | 210 ++++++++++++++------------------------ 1 file changed, 74 insertions(+), 136 deletions(-) diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c index 487518a696e6..d65fc60dd7be 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c @@ -424,8 +424,6 @@ static void do_compute_shiftstate(void) /* We still have to export this method to vt.c */ void vt_set_leds_compute_shiftstate(void) { - unsigned long flags; - /* * When VT is switched, the keyboard led needs to be set once. * Ensure that after the switch is completed, the state of the @@ -434,9 +432,8 @@ void vt_set_leds_compute_shiftstate(void) vt_switch =3D true; set_leds(); =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); do_compute_shiftstate(); - spin_unlock_irqrestore(&kbd_event_lock, flags); } =20 /* @@ -625,13 +622,12 @@ static void fn_compose(struct vc_data *vc) =20 static void fn_spawn_con(struct vc_data *vc) { - spin_lock(&vt_spawn_con.lock); + guard(spinlock)(&vt_spawn_con.lock); if (vt_spawn_con.pid) if (kill_pid(vt_spawn_con.pid, vt_spawn_con.sig, 1)) { put_pid(vt_spawn_con.pid); vt_spawn_con.pid =3D NULL; } - spin_unlock(&vt_spawn_con.lock); } =20 static void fn_SAK(struct vc_data *vc) @@ -762,13 +758,9 @@ static void k_fn(struct vc_data *vc, unsigned char val= ue, char up_flag) return; =20 if ((unsigned)value < ARRAY_SIZE(func_table)) { - unsigned long flags; - - spin_lock_irqsave(&func_buf_lock, flags); + guard(spinlock_irqsave)(&func_buf_lock); if (func_table[value]) puts_queue(vc, func_table[value]); - spin_unlock_irqrestore(&func_buf_lock, flags); - } else pr_err("k_fn called with value=3D%d\n", value); } @@ -1140,8 +1132,7 @@ static unsigned char getledstate(void) =20 void setledstate(struct kbd_struct *kb, unsigned int led) { - unsigned long flags; - spin_lock_irqsave(&led_lock, flags); + guard(spinlock_irqsave)(&led_lock); if (!(led & ~7)) { ledioctl =3D led; kb->ledmode =3D LED_SHOW_IOCTL; @@ -1149,7 +1140,6 @@ void setledstate(struct kbd_struct *kb, unsigned int = led) kb->ledmode =3D LED_SHOW_FLAGS; =20 set_leds(); - spin_unlock_irqrestore(&led_lock, flags); } =20 static inline unsigned char getleds(void) @@ -1172,14 +1162,9 @@ static inline unsigned char getleds(void) int vt_get_leds(unsigned int console, int flag) { struct kbd_struct *kb =3D &kbd_table[console]; - int ret; - unsigned long flags; =20 - spin_lock_irqsave(&led_lock, flags); - ret =3D vc_kbd_led(kb, flag); - spin_unlock_irqrestore(&led_lock, flags); - - return ret; + guard(spinlock_irqsave)(&led_lock); + return vc_kbd_led(kb, flag); } EXPORT_SYMBOL_GPL(vt_get_leds); =20 @@ -1213,11 +1198,10 @@ void vt_set_led_state(unsigned int console, int led= s) void vt_kbd_con_start(unsigned int console) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; - spin_lock_irqsave(&led_lock, flags); + + guard(spinlock_irqsave)(&led_lock); clr_vc_kbd_led(kb, VC_SCROLLOCK); set_leds(); - spin_unlock_irqrestore(&led_lock, flags); } =20 /** @@ -1230,11 +1214,10 @@ void vt_kbd_con_start(unsigned int console) void vt_kbd_con_stop(unsigned int console) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; - spin_lock_irqsave(&led_lock, flags); + + guard(spinlock_irqsave)(&led_lock); set_vc_kbd_led(kb, VC_SCROLLOCK); set_leds(); - spin_unlock_irqrestore(&led_lock, flags); } =20 /* @@ -1246,12 +1229,11 @@ void vt_kbd_con_stop(unsigned int console) static void kbd_bh(struct tasklet_struct *unused) { unsigned int leds; - unsigned long flags; =20 - spin_lock_irqsave(&led_lock, flags); - leds =3D getleds(); - leds |=3D (unsigned int)kbd->lockstate << 8; - spin_unlock_irqrestore(&led_lock, flags); + scoped_guard(spinlock_irqsave, &led_lock) { + leds =3D getleds(); + leds |=3D (unsigned int)kbd->lockstate << 8; + } =20 if (vt_switch) { ledstate =3D ~leds; @@ -1525,15 +1507,13 @@ static void kbd_event(struct input_handle *handle, = unsigned int event_type, unsigned int event_code, int value) { /* We are called with interrupts disabled, just take the lock */ - spin_lock(&kbd_event_lock); - - if (event_type =3D=3D EV_MSC && event_code =3D=3D MSC_RAW && - kbd_is_hw_raw(handle->dev)) - kbd_rawcode(value); - if (event_type =3D=3D EV_KEY && event_code <=3D KEY_MAX) - kbd_keycode(event_code, value, kbd_is_hw_raw(handle->dev)); - - spin_unlock(&kbd_event_lock); + scoped_guard(spinlock, &kbd_event_lock) { + if (event_type =3D=3D EV_MSC && event_code =3D=3D MSC_RAW && + kbd_is_hw_raw(handle->dev)) + kbd_rawcode(value); + if (event_type =3D=3D EV_KEY && event_code <=3D KEY_MAX) + kbd_keycode(event_code, value, kbd_is_hw_raw(handle->dev)); + } =20 tasklet_schedule(&keyboard_tasklet); do_poke_blanked_console =3D 1; @@ -1680,7 +1660,6 @@ int __init kbd_init(void) */ int vt_do_diacrit(unsigned int cmd, void __user *udp, int perm) { - unsigned long flags; int asize; =20 switch (cmd) { @@ -1696,18 +1675,14 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) =20 /* Lock the diacriticals table, make a copy and then copy it after we unlock */ - spin_lock_irqsave(&kbd_event_lock, flags); - - asize =3D accent_table_size; - for (i =3D 0; i < asize; i++) { - dia[i].diacr =3D conv_uni_to_8bit( - accent_table[i].diacr); - dia[i].base =3D conv_uni_to_8bit( - accent_table[i].base); - dia[i].result =3D conv_uni_to_8bit( - accent_table[i].result); + scoped_guard(spinlock_irqsave, &kbd_event_lock) { + asize =3D accent_table_size; + for (i =3D 0; i < asize; i++) { + dia[i].diacr =3D conv_uni_to_8bit(accent_table[i].diacr); + dia[i].base =3D conv_uni_to_8bit(accent_table[i].base); + dia[i].result =3D conv_uni_to_8bit(accent_table[i].result); + } } - spin_unlock_irqrestore(&kbd_event_lock, flags); =20 if (put_user(asize, &a->kb_cnt)) return -EFAULT; @@ -1726,12 +1701,10 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) =20 /* Lock the diacriticals table, make a copy and then copy it after we unlock */ - spin_lock_irqsave(&kbd_event_lock, flags); - - asize =3D accent_table_size; - memcpy(buf, accent_table, asize * sizeof(struct kbdiacruc)); - - spin_unlock_irqrestore(&kbd_event_lock, flags); + scoped_guard(spinlock_irqsave, &kbd_event_lock) { + asize =3D accent_table_size; + memcpy(buf, accent_table, asize * sizeof(struct kbdiacruc)); + } =20 if (put_user(asize, &a->kb_cnt)) return -EFAULT; @@ -1762,7 +1735,7 @@ int vt_do_diacrit(unsigned int cmd, void __user *udp,= int perm) return PTR_ERR(dia); } =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); accent_table_size =3D ct; for (i =3D 0; i < ct; i++) { accent_table[i].diacr =3D @@ -1772,7 +1745,6 @@ int vt_do_diacrit(unsigned int cmd, void __user *udp,= int perm) accent_table[i].result =3D conv_8bit_to_uni(dia[i].result); } - spin_unlock_irqrestore(&kbd_event_lock, flags); =20 return 0; } @@ -1797,13 +1769,12 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) ct, sizeof(struct kbdiacruc)); if (IS_ERR(buf)) return PTR_ERR(buf); - }=20 - spin_lock_irqsave(&kbd_event_lock, flags); + } + guard(spinlock_irqsave)(&kbd_event_lock); if (ct) memcpy(accent_table, buf, ct * sizeof(struct kbdiacruc)); accent_table_size =3D ct; - spin_unlock_irqrestore(&kbd_event_lock, flags); return 0; } } @@ -1821,33 +1792,29 @@ int vt_do_diacrit(unsigned int cmd, void __user *ud= p, int perm) int vt_do_kdskbmode(unsigned int console, unsigned int arg) { struct kbd_struct *kb =3D &kbd_table[console]; - int ret =3D 0; - unsigned long flags; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); switch(arg) { case K_RAW: kb->kbdmode =3D VC_RAW; - break; + return 0; case K_MEDIUMRAW: kb->kbdmode =3D VC_MEDIUMRAW; - break; + return 0; case K_XLATE: kb->kbdmode =3D VC_XLATE; do_compute_shiftstate(); - break; + return 0; case K_UNICODE: kb->kbdmode =3D VC_UNICODE; do_compute_shiftstate(); - break; + return 0; case K_OFF: kb->kbdmode =3D VC_OFF; - break; + return 0; default: - ret =3D -EINVAL; + return -EINVAL; } - spin_unlock_irqrestore(&kbd_event_lock, flags); - return ret; } =20 /** @@ -1861,22 +1828,18 @@ int vt_do_kdskbmode(unsigned int console, unsigned = int arg) int vt_do_kdskbmeta(unsigned int console, unsigned int arg) { struct kbd_struct *kb =3D &kbd_table[console]; - int ret =3D 0; - unsigned long flags; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); switch(arg) { case K_METABIT: clr_vc_kbd_mode(kb, VC_META); - break; + return 0; case K_ESCPREFIX: set_vc_kbd_mode(kb, VC_META); - break; + return 0; default: - ret =3D -EINVAL; + return -EINVAL; } - spin_unlock_irqrestore(&kbd_event_lock, flags); - return ret; } =20 int vt_do_kbkeycode_ioctl(int cmd, struct kbkeycode __user *user_kbkc, int= perm) @@ -1905,31 +1868,28 @@ int vt_do_kbkeycode_ioctl(int cmd, struct kbkeycode= __user *user_kbkc, int perm) static unsigned short vt_kdgkbent(unsigned char kbdmode, unsigned char idx, unsigned char map) { - unsigned short *key_map, val; - unsigned long flags; + unsigned short *key_map; =20 /* Ensure another thread doesn't free it under us */ - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); key_map =3D key_maps[map]; if (key_map) { - val =3D U(key_map[idx]); + unsigned short val =3D U(key_map[idx]); if (kbdmode !=3D VC_UNICODE && KTYP(val) >=3D NR_TYPES) - val =3D K_HOLE; - } else - val =3D idx ? K_HOLE : K_NOSUCHMAP; - spin_unlock_irqrestore(&kbd_event_lock, flags); + return K_HOLE; + return val; + } =20 - return val; + return idx ? K_HOLE : K_NOSUCHMAP; } =20 static int vt_kdskbent(unsigned char kbdmode, unsigned char idx, unsigned char map, unsigned short val) { - unsigned long flags; unsigned short *key_map, oldval; =20 if (!idx && val =3D=3D K_NOSUCHMAP) { - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); /* deallocate map */ key_map =3D key_maps[map]; if (map && key_map) { @@ -1939,7 +1899,6 @@ static int vt_kdskbent(unsigned char kbdmode, unsigne= d char idx, keymap_count--; } } - spin_unlock_irqrestore(&kbd_event_lock, flags); =20 return 0; } @@ -1961,16 +1920,14 @@ static int vt_kdskbent(unsigned char kbdmode, unsig= ned char idx, if (!new_map) return -ENOMEM; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); key_map =3D key_maps[map]; if (key_map =3D=3D NULL) { int j; =20 - if (keymap_count >=3D MAX_NR_OF_USER_KEYMAPS && - !capable(CAP_SYS_RESOURCE)) { - spin_unlock_irqrestore(&kbd_event_lock, flags); + if (keymap_count >=3D MAX_NR_OF_USER_KEYMAPS && !capable(CAP_SYS_RESOURC= E)) return -EPERM; - } + key_map =3D key_maps[map] =3D no_free_ptr(new_map); key_map[0] =3D U(K_ALLOCATED); for (j =3D 1; j < NR_KEYS; j++) @@ -1980,19 +1937,15 @@ static int vt_kdskbent(unsigned char kbdmode, unsig= ned char idx, =20 oldval =3D U(key_map[idx]); if (val =3D=3D oldval) - goto out; + return 0; =20 /* Attention Key */ - if ((oldval =3D=3D K_SAK || val =3D=3D K_SAK) && !capable(CAP_SYS_ADMIN))= { - spin_unlock_irqrestore(&kbd_event_lock, flags); + if ((oldval =3D=3D K_SAK || val =3D=3D K_SAK) && !capable(CAP_SYS_ADMIN)) return -EPERM; - } =20 key_map[idx] =3D U(val); if (!map && (KTYP(oldval) =3D=3D KT_SHIFT || KTYP(val) =3D=3D KT_SHIFT)) do_compute_shiftstate(); -out: - spin_unlock_irqrestore(&kbd_event_lock, flags); =20 return 0; } @@ -2038,7 +1991,6 @@ static char *vt_kdskbsent(char *kbs, unsigned char cu= r) int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int per= m) { unsigned char kb_func; - unsigned long flags; =20 if (get_user(kb_func, &user_kdgkb->kb_func)) return -EFAULT; @@ -2054,9 +2006,8 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user= *user_kdgkb, int perm) if (!kbs) return -ENOMEM; =20 - spin_lock_irqsave(&func_buf_lock, flags); - len =3D strscpy(kbs, func_table[kb_func] ? : "", len); - spin_unlock_irqrestore(&func_buf_lock, flags); + scoped_guard(spinlock_irqsave, &func_buf_lock) + len =3D strscpy(kbs, func_table[kb_func] ? : "", len); =20 if (len < 0) return -ENOSPC; @@ -2075,9 +2026,8 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user= *user_kdgkb, int perm) if (IS_ERR(kbs)) return PTR_ERR(kbs); =20 - spin_lock_irqsave(&func_buf_lock, flags); + guard(spinlock_irqsave)(&func_buf_lock); kbs =3D vt_kdskbsent(kbs, kb_func); - spin_unlock_irqrestore(&func_buf_lock, flags); =20 return 0; } @@ -2088,16 +2038,14 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __us= er *user_kdgkb, int perm) int vt_do_kdskled(unsigned int console, int cmd, unsigned long arg, int pe= rm) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; unsigned char ucval; =20 switch(cmd) { /* the ioctls below read/set the flags usually shown in the leds */ /* don't use them - they will go away without warning */ case KDGKBLED: - spin_lock_irqsave(&kbd_event_lock, flags); - ucval =3D kb->ledflagstate | (kb->default_ledflagstate << 4); - spin_unlock_irqrestore(&kbd_event_lock, flags); + scoped_guard(spinlock_irqsave, &kbd_event_lock) + ucval =3D kb->ledflagstate | (kb->default_ledflagstate << 4); return put_user(ucval, (char __user *)arg); =20 case KDSKBLED: @@ -2105,11 +2053,11 @@ int vt_do_kdskled(unsigned int console, int cmd, un= signed long arg, int perm) return -EPERM; if (arg & ~0x77) return -EINVAL; - spin_lock_irqsave(&led_lock, flags); - kb->ledflagstate =3D (arg & 7); - kb->default_ledflagstate =3D ((arg >> 4) & 7); - set_leds(); - spin_unlock_irqrestore(&led_lock, flags); + scoped_guard(spinlock_irqsave, &led_lock) { + kb->ledflagstate =3D (arg & 7); + kb->default_ledflagstate =3D ((arg >> 4) & 7); + set_leds(); + } return 0; =20 /* the ioctls below only set the lights, not the functions */ @@ -2166,11 +2114,8 @@ int vt_do_kdgkbmeta(unsigned int console) */ void vt_reset_unicode(unsigned int console) { - unsigned long flags; - - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); kbd_table[console].kbdmode =3D default_utf8 ? VC_UNICODE : VC_XLATE; - spin_unlock_irqrestore(&kbd_event_lock, flags); } =20 /** @@ -2195,22 +2140,19 @@ int vt_get_shift_state(void) void vt_reset_keyboard(unsigned int console) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); set_vc_kbd_mode(kb, VC_REPEAT); clr_vc_kbd_mode(kb, VC_CKMODE); clr_vc_kbd_mode(kb, VC_APPLIC); clr_vc_kbd_mode(kb, VC_CRLF); kb->lockstate =3D 0; kb->slockstate =3D 0; - spin_lock(&led_lock); + guard(spinlock)(&led_lock); kb->ledmode =3D LED_SHOW_FLAGS; kb->ledflagstate =3D kb->default_ledflagstate; - spin_unlock(&led_lock); /* do not do set_leds here because this causes an endless tasklet loop when the keyboard hasn't been initialized yet */ - spin_unlock_irqrestore(&kbd_event_lock, flags); } =20 /** @@ -2240,11 +2182,9 @@ int vt_get_kbd_mode_bit(unsigned int console, int bi= t) void vt_set_kbd_mode_bit(unsigned int console, int bit) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); set_vc_kbd_mode(kb, bit); - spin_unlock_irqrestore(&kbd_event_lock, flags); } =20 /** @@ -2259,9 +2199,7 @@ void vt_set_kbd_mode_bit(unsigned int console, int bi= t) void vt_clr_kbd_mode_bit(unsigned int console, int bit) { struct kbd_struct *kb =3D &kbd_table[console]; - unsigned long flags; =20 - spin_lock_irqsave(&kbd_event_lock, flags); + guard(spinlock_irqsave)(&kbd_event_lock); clr_vc_kbd_mode(kb, bit); - spin_unlock_irqrestore(&kbd_event_lock, flags); } --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 342AB34C127; Wed, 19 Nov 2025 10:02:02 +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=1763546523; cv=none; b=XKltUe7ou8DyCCbbeTKQ+CpGcm9LYx0oKh8Rj9HAIP0U52pCAb04zMn3X2Qi4j42IHSCAqmcTnNxd+s/5NV92B7lafp4aPvtv9lclCgW10deN1gbVJMSybqqg9RNAgA+UxAL0zrEofmUC77LaW9JLqhs9/TD4Yjs/G+P0Dl2OSk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546523; c=relaxed/simple; bh=1yOaezHkmKuZikyGo8CM9x2MBgXFH8Uawo4IcDrCkGM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FvU+3x2yWTvp541Yh69Ai2HuVd4mwr4MLpmmTh6x4d3AnuvZ+dfl5mfwz5a6u23sEWkG5gdB8e4l1Ww4ymQOW/2tjaGv+J1vhfU0Iz50K3K/NFs7NsXW3IAbhXMIgCagcR9RloNh8CiMVleLYSz73r06iQ6gCzCXG0lEeDY1IO0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jHk7K5Md; 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="jHk7K5Md" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56F61C2BCB1; Wed, 19 Nov 2025 10:02:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546522; bh=1yOaezHkmKuZikyGo8CM9x2MBgXFH8Uawo4IcDrCkGM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jHk7K5MdJfvBkEmMtde2rdgx6YVRkiN8iiynlKyfOwVbJzfnZjRdSOLdo6qDpIe0D F2g4SVgXKWYmNLjZ5cxHW8JgCq0/ap9c3zMZKMPtYgKfRVqPVGQskFt2zDGOr8zXuA 0BAvH1ON3j9HoKkmG8TOTwo9Mkhu9CZb7DCzqOR4TOHDoymGfEL4dQzRDEip5GM5R1 vGCOsrb0CcLAhjM0+ZZsrVVCPhSGsuaXHctKektzGN00vqnteXSZGjZ45RqWze+GKw ZuVdYdtGdCnlcNmWkAVJAHIfWPi5b7Jmbl9r+5x18AVV4aAEwHwbZPF8Z8G5liaXk2 aSOU0eaROAo9Q== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 09/10] serial: serial_core: simplify uart_ioctl() returns Date: Wed, 19 Nov 2025 11:01:39 +0100 Message-ID: <20251119100140.830761-10-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" Neither uart_do_autoconfig(), nor uart_wait_modem_status() can return -ENOIOCTLCMD. The ENOIOCTLCMD checks are there to check if 'cmd' matched against TIOCSERCONFIG, and TIOCMIWAIT respectively. (With 0 or error in 'ret', it does not matter.) Therefore, the code can simply return from the TIOCSERCONFIG and TIOCMIWAIT spots immediately. To be more explicit, use 'if' instead of switch-case for those single values. And return without jumping to the 'out' label -- it can be removed too. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/serial_core.c | 35 ++++++++------------------------ 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_c= ore.c index 4757293ece8c..74018fb8a4e7 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -1560,37 +1560,20 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd= , unsigned long arg) void __user *uarg =3D (void __user *)arg; int ret =3D -ENOIOCTLCMD; =20 - - /* - * These ioctls don't rely on the hardware to be present. - */ - switch (cmd) { - case TIOCSERCONFIG: + /* This ioctl doesn't rely on the hardware to be present. */ + if (cmd =3D=3D TIOCSERCONFIG) { down_write(&tty->termios_rwsem); ret =3D uart_do_autoconfig(tty, state); up_write(&tty->termios_rwsem); - break; - } - - if (ret !=3D -ENOIOCTLCMD) - goto out; - - if (tty_io_error(tty)) { - ret =3D -EIO; - goto out; + return ret; } =20 - /* - * The following should only be used when hardware is present. - */ - switch (cmd) { - case TIOCMIWAIT: - ret =3D uart_wait_modem_status(state, arg); - break; - } + if (tty_io_error(tty)) + return -EIO; =20 - if (ret !=3D -ENOIOCTLCMD) - goto out; + /* This should only be used when the hardware is present. */ + if (cmd =3D=3D TIOCMIWAIT) + return uart_wait_modem_status(state, arg); =20 /* rs485_config requires more locking than others */ if (cmd =3D=3D TIOCSRS485) @@ -1638,7 +1621,7 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd, = unsigned long arg) mutex_unlock(&port->mutex); if (cmd =3D=3D TIOCSRS485) up_write(&tty->termios_rwsem); -out: + return ret; } =20 --=20 2.51.1 From nobody Tue Dec 2 02:18:58 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 9C33D34CFAA; Wed, 19 Nov 2025 10:02:05 +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=1763546525; cv=none; b=M0asOk9XPD9TpfXt/VKiNpJciGOcUNpw7vHmYiCEoKTFlLU5/exYGbuK/iw3/zIGqYvgrh8UJ9CE89getdDSEWtd0phzAOxzsJ9zFl/Jxf0su4/tlTNHgRsDzWkHECD/RoZgYrQL6ygf5TlpwZB8l4WEJt42iBreFR49aKGKaZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763546525; c=relaxed/simple; bh=VrVDOIkLdN0ta2xc+kiqN5B8z01haIwwQGKYQ9hiPW4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=deCNvJmFCkqr7tmwkaiDdC9JmhXpT0mRK9xb6awrJMAFg9auCjDXEOlYqKK6qQS/kb/4vKabevVq33AMBXb41Gth+bpiJyY/XetZyErfCtyr3e7yPkYhzB5Mwa/xi2C3LEKOj/tZd03HoJz/7blHiHNLLQxxat2pbvOXlETbKp8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Lnrqw5U/; 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="Lnrqw5U/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5280C2BCC4; Wed, 19 Nov 2025 10:02:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763546524; bh=VrVDOIkLdN0ta2xc+kiqN5B8z01haIwwQGKYQ9hiPW4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lnrqw5U/4xXhRRM8nY1fpD+L8kncv6UqWKdeWiRdR8ja+JOPUyz9CO4IBwROOOEC8 aSNPO9B3OdzJshDhMgSMvdOc9hy/62zMaBSva84bav/1l/ixD/USZpfv9fJIxFa2oz dtuDEcCTxBWcLY1YjNM+TPJ12jwgdiZ0n5POxeJtBYxjBfQKrn1jhnlhQdy4fzS5XR b7R/s3iCKdueySS095ibUfygnFT5L5IgDz1+sPwY/e2niiqB6PDszjAeoJGYdLURWj 4inrWqO2vs7wyNcqP/ib/SQacvJ2mzHyroFxNuryJsULvio8x5s6TzNc5BKQaiULQh wqlihFKEon6dg== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 10/10] serial: serial_core: use guard()s Date: Wed, 19 Nov 2025 11:01:40 +0100 Message-ID: <20251119100140.830761-11-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 serial_core 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/serial/serial_core.c | 127 +++++++++++++------------------ 1 file changed, 55 insertions(+), 72 deletions(-) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_c= ore.c index 74018fb8a4e7..c532235f8d55 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -1034,9 +1034,8 @@ static int uart_set_info_user(struct tty_struct *tty,= struct serial_struct *ss) { struct uart_state *state =3D tty->driver_data; struct tty_port *port =3D &state->port; - int retval; =20 - down_write(&tty->termios_rwsem); + guard(rwsem_write)(&tty->termios_rwsem); /* * This semaphore protects port->count. It is also * very useful to prevent opens. Also, take the @@ -1044,11 +1043,8 @@ static int uart_set_info_user(struct tty_struct *tty= , struct serial_struct *ss) * module insertion/removal doesn't change anything * under us. */ - mutex_lock(&port->mutex); - retval =3D uart_set_info(tty, port, state, ss); - mutex_unlock(&port->mutex); - up_write(&tty->termios_rwsem); - return retval; + guard(mutex)(&port->mutex); + return uart_set_info(tty, port, state, ss); } =20 /** @@ -1562,10 +1558,8 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd,= unsigned long arg) =20 /* This ioctl doesn't rely on the hardware to be present. */ if (cmd =3D=3D TIOCSERCONFIG) { - down_write(&tty->termios_rwsem); - ret =3D uart_do_autoconfig(tty, state); - up_write(&tty->termios_rwsem); - return ret; + guard(rwsem_write)(&tty->termios_rwsem); + return uart_do_autoconfig(tty, state); } =20 if (tty_io_error(tty)) @@ -1579,46 +1573,46 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd= , unsigned long arg) if (cmd =3D=3D TIOCSRS485) down_write(&tty->termios_rwsem); =20 - mutex_lock(&port->mutex); - uport =3D uart_port_check(state); + scoped_guard(mutex, &port->mutex) { + uport =3D uart_port_check(state); =20 - if (!uport || tty_io_error(tty)) { - ret =3D -EIO; - goto out_up; - } + if (!uport || tty_io_error(tty)) { + ret =3D -EIO; + break; + } =20 - /* - * All these rely on hardware being present and need to be - * protected against the tty being hung up. - */ + /* + * All these rely on hardware being present and need to be + * protected against the tty being hung up. + */ =20 - switch (cmd) { - case TIOCSERGETLSR: /* Get line status register */ - ret =3D uart_get_lsr_info(tty, state, uarg); - break; + switch (cmd) { + case TIOCSERGETLSR: /* Get line status register */ + ret =3D uart_get_lsr_info(tty, state, uarg); + break; =20 - case TIOCGRS485: - ret =3D uart_get_rs485_config(uport, uarg); - break; + case TIOCGRS485: + ret =3D uart_get_rs485_config(uport, uarg); + break; =20 - case TIOCSRS485: - ret =3D uart_set_rs485_config(tty, uport, uarg); - break; + case TIOCSRS485: + ret =3D uart_set_rs485_config(tty, uport, uarg); + break; =20 - case TIOCSISO7816: - ret =3D uart_set_iso7816_config(state->uart_port, uarg); - break; + case TIOCSISO7816: + ret =3D uart_set_iso7816_config(state->uart_port, uarg); + break; =20 - case TIOCGISO7816: - ret =3D uart_get_iso7816_config(state->uart_port, uarg); - break; - default: - if (uport->ops->ioctl) - ret =3D uport->ops->ioctl(uport, cmd, arg); - break; + case TIOCGISO7816: + ret =3D uart_get_iso7816_config(state->uart_port, uarg); + break; + default: + if (uport->ops->ioctl) + ret =3D uport->ops->ioctl(uport, cmd, arg); + break; + } } -out_up: - mutex_unlock(&port->mutex); + if (cmd =3D=3D TIOCSRS485) up_write(&tty->termios_rwsem); =20 @@ -1634,11 +1628,10 @@ static void uart_set_ldisc(struct tty_struct *tty) if (!tty_port_initialized(port)) return; =20 - mutex_lock(&state->port.mutex); + guard(mutex)(&state->port.mutex); uport =3D uart_port_check(state); if (uport && uport->ops->set_ldisc) uport->ops->set_ldisc(uport, &tty->termios); - mutex_unlock(&state->port.mutex); } =20 static void uart_set_termios(struct tty_struct *tty, @@ -1712,9 +1705,8 @@ static void uart_close(struct tty_struct *tty, struct= file *filp) =20 state =3D drv->state + tty->index; port =3D &state->port; - spin_lock_irq(&port->lock); + guard(spinlock_irq)(&port->lock); --port->count; - spin_unlock_irq(&port->lock); return; } =20 @@ -1826,20 +1818,18 @@ static void uart_hangup(struct tty_struct *tty) struct uart_state *state =3D tty->driver_data; struct tty_port *port =3D &state->port; struct uart_port *uport; - unsigned long flags; =20 pr_debug("uart_hangup(%d)\n", tty->index); =20 - mutex_lock(&port->mutex); + guard(mutex)(&port->mutex); uport =3D uart_port_check(state); WARN(!uport, "hangup of detached port!\n"); =20 if (tty_port_active(port)) { uart_flush_buffer(tty); uart_shutdown(tty, state); - spin_lock_irqsave(&port->lock, flags); - port->count =3D 0; - spin_unlock_irqrestore(&port->lock, flags); + scoped_guard(spinlock_irqsave, &port->lock) + port->count =3D 0; tty_port_set_active(port, false); tty_port_tty_set(port, NULL); if (uport && !uart_console(uport)) @@ -1847,7 +1837,6 @@ static void uart_hangup(struct tty_struct *tty) wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->delta_msr_wait); } - mutex_unlock(&port->mutex); } =20 /* uport =3D=3D NULL if uart_port has already been removed */ @@ -2952,11 +2941,11 @@ static ssize_t console_show(struct device *dev, struct uart_port *uport; bool console =3D false; =20 - mutex_lock(&port->mutex); - uport =3D uart_port_check(state); - if (uport) - console =3D uart_console_registered(uport); - mutex_unlock(&port->mutex); + scoped_guard(mutex, &port->mutex) { + uport =3D uart_port_check(state); + if (uport) + console =3D uart_console_registered(uport); + } =20 return sprintf(buf, "%c\n", console ? 'Y' : 'N'); } @@ -3141,17 +3130,14 @@ static void serial_core_remove_one_port(struct uart= _driver *drv, struct tty_port *port =3D &state->port; struct uart_port *uart_port; =20 - mutex_lock(&port->mutex); - uart_port =3D uart_port_check(state); - if (uart_port !=3D uport) - dev_alert(uport->dev, "Removing wrong port: %p !=3D %p\n", - uart_port, uport); + scoped_guard(mutex, &port->mutex) { + uart_port =3D uart_port_check(state); + if (uart_port !=3D uport) + dev_alert(uport->dev, "Removing wrong port: %p !=3D %p\n", uart_port, u= port); =20 - if (!uart_port) { - mutex_unlock(&port->mutex); - return; + if (!uart_port) + return; } - mutex_unlock(&port->mutex); =20 /* * Remove the devices from the tty layer @@ -3180,11 +3166,10 @@ static void serial_core_remove_one_port(struct uart= _driver *drv, uport->type =3D PORT_UNKNOWN; uport->port_dev =3D NULL; =20 - mutex_lock(&port->mutex); + guard(mutex)(&port->mutex); WARN_ON(atomic_dec_return(&state->refcount) < 0); wait_event(state->remove_wait, !atomic_read(&state->refcount)); state->uart_port =3D NULL; - mutex_unlock(&port->mutex); } =20 /** @@ -3337,7 +3322,7 @@ void serial_core_unregister_port(struct uart_driver *= drv, struct uart_port *port struct serial_ctrl_device *ctrl_dev =3D serial_core_get_ctrl_dev(port_dev= ); int ctrl_id =3D port->ctrl_id; =20 - mutex_lock(&port_mutex); + guard(mutex)(&port_mutex); =20 port->flags |=3D UPF_DEAD; =20 @@ -3349,8 +3334,6 @@ void serial_core_unregister_port(struct uart_driver *= drv, struct uart_port *port /* Drop the serial core controller device if no ports are using it */ if (!serial_core_ctrl_find(drv, phys_dev, ctrl_id)) serial_base_ctrl_device_remove(ctrl_dev); - - mutex_unlock(&port_mutex); } =20 /** --=20 2.51.1