From nobody Sat Oct 4 17:30:14 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 800FC26C3BF; Thu, 14 Aug 2025 07:25:01 +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=1755156301; cv=none; b=NNFdFrZU+MUH7wQk1c7flrwg6bdk+yEvd27mqAzLdILtvy9Wvi/D7DtdGugej9zymNKiwmTxPsoGFJVUQAW/tTqSggM+7Ur+bfnrNC181zcMju+VBRSBhv83W7X29huQkH/ngR8VWwz48BV4tiXoU59n1hk3yH8X3PLWr/zBFBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156301; c=relaxed/simple; bh=QhsAJGg4mwcRyJtNu+7ib9GBTrB5jjTqiaf6YrykiPc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qxYRjTv60p+84iUoubmmy+cUsPY61gtDUlRPRk7WvTFMViHCmgOsFR4GkMeG99JOBMhFkiVNpJxkHNt5xCa9cW48VWIApMDgXG+6PuaUbx9r7dbsqa2J2O8yD7yx0u/olCe+ny43ju1SLZ+Qlto4xCusbuQbxhWqpOFtB18Yd3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QcDoDHga; 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="QcDoDHga" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DFB1AC4CEEF; Thu, 14 Aug 2025 07:24:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156301; bh=QhsAJGg4mwcRyJtNu+7ib9GBTrB5jjTqiaf6YrykiPc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QcDoDHgaDBzpiZp+U9lIGsJP+PEk8NFwY32z33/dqTI6pXw6MmkMZrRKglhnH0Ibn 6Dz0itjV7bu5BB1CrTTkSlGKT0zIo007lBDKfpB2Zm/odHe7F+qN9X/BH8bPH85L2Z MJFry6z+FS2vRN13MQdFYh/dLu/wt+IiDe0eewWJRlZwjqnJxh+osjOXyOrqTuOIjk BRvdep4RWg4K63v5YhdhlyggNkKW1ORCOA6UHfrp3QnJmf8+0OA8lh3ExPXwqoUF3l C41TKeq29FXG36aTP8o9vL47QxnLYMYY9J49obdcgUrAC5hmOfkgMqqo7lTIYS/Rw9 r+XjH627LrZ+A== 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/16] console: introduce console_lock guard()s Date: Thu, 14 Aug 2025 09:24:41 +0200 Message-ID: <20250814072456.182853-2-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having this, guards like these work: guard(console_lock)(); or scoped_guard(console_lock) { ... } See e.g. "vc_screen: use guard()s" later in this series. Signed-off-by: Jiri Slaby (SUSE) --- include/linux/console.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/console.h b/include/linux/console.h index 8f10d0a85bb4..031a58dc2b91 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -666,6 +666,8 @@ void vcs_remove_sysfs(int index); */ extern atomic_t ignore_console_lock_warning; =20 +DEFINE_LOCK_GUARD_0(console_lock, console_lock(), console_unlock()); + extern void console_init(void); =20 /* For deferred console takeover */ --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 09555266B6F; Thu, 14 Aug 2025 07:25: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=1755156303; cv=none; b=c95QB88PxUYKWDspwzyWibi4d0uLOve+sMBrcU30NBTZXg+C+/ylPndQ6dctZOnW3LARf1/sQbxSja5pAGpdfa7+nIfVxt1Lpo4eYQpaShlseT7rDuIJmnSC5s+GFNBVVekhYc//j5uH0t9TKFyQZlXC6MYuVDVD0tpQKGwL6fw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156303; c=relaxed/simple; bh=TmExkHaDrPFt082jnRuwqDdyWnPnTvNQyfEEU6G328A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sX3Yvu/6scdI9Ep16jBJC3E3SC5qHFerVhdFF7JbNmc6WTMwSvUrgc2c70E6ON/EN2to4K6l2vvaDl22kLaAJ4OA4uuyOdIAOPZcUVgsoKSKEICNn++Sc+WSYz0u9WkyczVvek8Y4twbqw1EFBHozXDZLyTamPhC0YulaDeq6gY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pipac525; 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="pipac525" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 747D9C4CEF4; Thu, 14 Aug 2025 07:25:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156302; bh=TmExkHaDrPFt082jnRuwqDdyWnPnTvNQyfEEU6G328A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pipac525nZPCujd9tdudUvVn0NXZ1kXkZelqFN3B5bWFjDQYNhtGKW21CRLB04Ww2 YXU6k6QOTesnEGelvk5bnagNEzt5sdbA+WGW8n6dVzs0q15tadDBabGglOWnVMkPcN Bxh6sBXBAI3rq3Zni/1mACUDNe4VyMGVXEBibewVQuk2vZS5ZZ5NeGjofumPUL054x tX+hjeDEIofhfLGDSCaMcCJwQ9xD27qde/7IAxNnZdl09srSDmFPQjbzaCZWniOQGr O7M9pqb0fc4ZLxwYW3R/SgXlWX+QRV+72qeScqDw3BuhQkdEt9dAflEpmqwLpLH5Bt EInQ7/kcPLC5g== 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/16] tty: introduce tty_port_tty guard() Date: Thu, 14 Aug 2025 09:24:42 +0200 Message-ID: <20250814072456.182853-3-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having this, guards like these work: scoped_guard(tty_port_tty, port) tty_wakeup(scoped_tty()); See e.g. "tty_port: use scoped_guard()" later in this series. The definitions depend on CONFIG_TTY. It's due to tty_kref_put(). On !CONFIG_TTY, it is an inline and its declaration would conflict. The guards are not needed in that case, of course. Signed-off-by: Jiri Slaby (SUSE) --- include/linux/tty_port.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/linux/tty_port.h b/include/linux/tty_port.h index 332ddb93603e..660c254f1efe 100644 --- a/include/linux/tty_port.h +++ b/include/linux/tty_port.h @@ -270,4 +270,18 @@ static inline void tty_port_tty_vhangup(struct tty_por= t *port) __tty_port_tty_hangup(port, false, false); } =20 +#ifdef CONFIG_TTY +void tty_kref_put(struct tty_struct *tty); +__DEFINE_CLASS_IS_CONDITIONAL(tty_port_tty, true); +__DEFINE_UNLOCK_GUARD(tty_port_tty, struct tty_struct, tty_kref_put(_T->lo= ck)); +static inline class_tty_port_tty_t class_tty_port_tty_constructor(struct t= ty_port *tport) +{ + class_tty_port_tty_t _t =3D { + .lock =3D tty_port_tty_get(tport), + }; + return _t; +} +#define scoped_tty() ((struct tty_struct *)(__guard_ptr(tty_port_tty)(&sco= pe))) +#endif + #endif --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 7742026C3BF; Thu, 14 Aug 2025 07:25:04 +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=1755156304; cv=none; b=aAudSLg/8TDHQPdI3KhW8eRzVKtL897AYJVuGTLqLy13c8MtAhhRehcStNgg4TnRGlf2TQuMN0E9NWBk99Mulhyp2PlzPFJTXJUCPcpuIm0k2hJ6mso1lno4dYmQYET1LBCy7xmxUAgvq2WI6X1v+UlVaxOM28TGXN3wqDs70E4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156304; c=relaxed/simple; bh=+nuDBiZ+xaMkbDUd9Y9iFbfqjNlclFhhFDwVdp/XyJQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wn3iR9AP4jM7EFPftQGGLnFVXEDbdInUawqMMj2/YD/j7/gfQ0GGwf8ooDNtIW56bcWYGEDhkkI32Si8RBfT+Q2oH8KkSv6XKxN1wYQBo2Xnz+7RRQdFBqSL+ILBT2oyqKhuRm62uXE0Ev/xI7/Rha8Qhv7kmuClP2WqwuwPcys= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=duKm8u7V; 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="duKm8u7V" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F2029C4CEF7; Thu, 14 Aug 2025 07:25:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156304; bh=+nuDBiZ+xaMkbDUd9Y9iFbfqjNlclFhhFDwVdp/XyJQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=duKm8u7VurU5LnjONJDN3HMrabW0ICEYWpdsTzMDbGNlg1HWhcjuJzrnjBbelDbTO EUVOQhiyqt0Yza9cXhh3BrBX8hDjuYMfVxw17Ocmqo4hTKjWFy1eYrEMkQd7Z0RdRo LSMrGNtiAWaSat8KHjjFFV9tun4wh96j4EeEPbiqdRsBpdgPNakrwSL0FBKZfgtVhQ URvEx//mL6xm/TPe83eQtG5EaaoV7WWH1yeeBaIJjt3LXiwPsJh8IglVUcg6ZXKhf5 EBkHlVgaV/Ip/DOgBD47kz3pavGbAP2U54q0DeScmA6Qbm2yI8wdOEGrrFdouLqaQa 4dw9pZ1HjStVw== 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/16] serial: introduce uart_port_lock() guard()s Date: Thu, 14 Aug 2025 09:24:43 +0200 Message-ID: <20250814072456.182853-4-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having this, guards like these work: guard(uart_port_lock_irq)(&up->port); or scoped_guard(uart_port_lock_irqsave, port) { ... } See e.g. "serial: 8250: use guard()s" later in this series. Signed-off-by: Jiri Slaby (SUSE) --- include/linux/serial_core.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 84b4648ead7e..666430b47899 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -788,6 +788,19 @@ static inline void uart_port_unlock_irqrestore(struct = uart_port *up, unsigned lo spin_unlock_irqrestore(&up->lock, flags); } =20 +DEFINE_GUARD(uart_port_lock, struct uart_port *, uart_port_lock(_T), uart_= port_unlock(_T)); +DEFINE_GUARD_COND(uart_port_lock, _try, uart_port_trylock(_T)); + +DEFINE_GUARD(uart_port_lock_irq, struct uart_port *, uart_port_lock_irq(_T= ), + uart_port_unlock_irq(_T)); + +DEFINE_LOCK_GUARD_1(uart_port_lock_irqsave, struct uart_port, + uart_port_lock_irqsave(_T->lock, &_T->flags), + uart_port_unlock_irqrestore(_T->lock, _T->flags), + unsigned long flags); +DEFINE_LOCK_GUARD_1_COND(uart_port_lock_irqsave, _try, + uart_port_trylock_irqsave(_T->lock, &_T->flags)); + static inline int serial_port_in(struct uart_port *up, int offset) { return up->serial_in(up, offset); --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 ACD642701C7; Thu, 14 Aug 2025 07:25: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=1755156305; cv=none; b=RxjslOaWllo62iRlyIfBkW4u3HFPizCKk03qN/FmeAmS6M+6EzycHMWr+hoGpTfKG7GJUsXtjabZwOOeX9uDx6D6RSqC+KKZlSRy7J2NksySYvOBXJfDck6eE4W+0n861TYwBDMn3cfXDEXjkoXQPS+P99OgONddzESH66iaW6w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156305; c=relaxed/simple; bh=S1VXROGbdYGweB7NWPiJuBRig6fR6b4iGEMKTCBRAX4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mr5ZQ+WG0AR/Cn8khdF34q3LVhm45oWTl75qXbONPkhvUPtWn5mDlSSvCfhrJiLHICFSDGE58/A4nLMwMHTlcFMFHUogLIWPd9Y76DEBXCk0tOO3qb0eBbSeEUht17l8bPJaeoycuCWLqZIMWJQ3s8if8i2irUGxJuWSDJBDEms= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GODbWQ/u; 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="GODbWQ/u" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B680C4CEF4; Thu, 14 Aug 2025 07:25:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156305; bh=S1VXROGbdYGweB7NWPiJuBRig6fR6b4iGEMKTCBRAX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GODbWQ/uzHqLGxPZhaCpn6DYDPSc6ig7fCrsZgZvMlJC0/YXRRNQm50gN5IZxEidB 6zxDNfgGS0/1MyIoyjv9eu8RXbSZY55x4++AJedqA1Y0dcLa2g7+mKgtppKRt1mQ9V jERhPBwXK1DWFIiI4cR337ls8XMMo92aovzavGRcqzHgbPCAVaFtHh8W58RnlkHVL9 N0u/Y1DXhxeRpnGEB+z8ZNlgkfHAPCVM0dbfgO1otzT47eta1c+6s+SAv3x4eTxwCU L1xcEvI8wJbCbO0IEy4VQAgU249xa+JfJkidZWDdnKVS1rH7JrxUDTG4Uv3k1yf4AU +ODaiTJJDig3w== 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/16] serial: 8250: introduce RPM guard()s Date: Thu, 14 Aug 2025 09:24:44 +0200 Message-ID: <20250814072456.182853-5-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having this, guards like these work: guard(serial8250_rpm)(up); or scoped_guard(serial8250_rpm, up) { ... } See e.g. "serial: 8250: use guard()s" later in this series. And make them available to anyone (EXPORT + put in 8250.h) as drivers open code this anyway. The _tx ones are not defined as they would have no user. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250.h | 5 +++++ drivers/tty/serial/8250/8250_port.c | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h index cfe6ba286b45..58e64c4e1e3a 100644 --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h @@ -186,6 +186,11 @@ static unsigned int __maybe_unused serial_icr_read(str= uct uart_8250_port *up, =20 void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); =20 +void serial8250_rpm_get(struct uart_8250_port *p); +void serial8250_rpm_put(struct uart_8250_port *p); +DEFINE_GUARD(serial8250_rpm, struct uart_8250_port *, + serial8250_rpm_get(_T), serial8250_rpm_put(_T)); + static inline u32 serial_dl_read(struct uart_8250_port *up) { return up->dl_read(up); diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 2da9db960d09..5afae4025696 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -508,20 +508,22 @@ void serial8250_clear_and_reinit_fifos(struct uart_82= 50_port *p) } EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos); =20 -static void serial8250_rpm_get(struct uart_8250_port *p) +void serial8250_rpm_get(struct uart_8250_port *p) { if (!(p->capabilities & UART_CAP_RPM)) return; pm_runtime_get_sync(p->port.dev); } +EXPORT_SYMBOL_GPL(serial8250_rpm_get); =20 -static void serial8250_rpm_put(struct uart_8250_port *p) +void serial8250_rpm_put(struct uart_8250_port *p) { if (!(p->capabilities & UART_CAP_RPM)) return; pm_runtime_mark_last_busy(p->port.dev); pm_runtime_put_autosuspend(p->port.dev); } +EXPORT_SYMBOL_GPL(serial8250_rpm_put); =20 /** * serial8250_em485_init() - put uart_8250_port into rs485 emulating --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 9B49527144B; Thu, 14 Aug 2025 07:25:07 +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=1755156307; cv=none; b=NLszEGzkic7rlaLminwkhSl1YAh6mCqRNdp52EIwZIWALpFP7Id/+/kveZSWfZNl+fPFwW6fLOctUWrjmemPY6/9AXtZOOxAE9oRSRpDMPlzpZidyFusHkVenzeXSxpaAAA7aeot62suOe5iKN2dzTGaMXhJih3qFn/LXYZ4K94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156307; c=relaxed/simple; bh=kC3z4by0bJrRY2ZjoNP1w9v8ZFnzCAUJjUUBpcBSsFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jvR3KEf5hI0xmoXW8jAW3/2yypWXvHy9JLA+NmRVQiaiupwIparF0BEok29f5wcoVQJS0XmNBOo1hCzsW13RBcKvvMF9PJg4d0Kki8Dkm6xK2oBICmCHoGPY7Ub7dgQyvHt+MfGYq7FoWneKYi0e3w1gV9jIm8KRgLoK4hEzYek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MXTxqlJX; 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="MXTxqlJX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0467AC4CEEF; Thu, 14 Aug 2025 07:25:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156307; bh=kC3z4by0bJrRY2ZjoNP1w9v8ZFnzCAUJjUUBpcBSsFE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MXTxqlJXtLDonjIRTzcB+QRMd3YBE7u2yuZ9aPAkNjcR79Epp83uoxvKPtIEglBSJ jdy4wWe8fPJRIbGJwIBmrRaZDIqBbkau5hcGGZUZYdPABHbsBnsK2bv3Ea4exFcL+S Ba8lpe97RGwwn9d+V4d9e8AHdD/yAEI2VyjOgnJL26Tp4kZz/zZKU1Qy75l0FGI5p/ h+Y0OyO+gQfdLfW3xCPJsGQVXFR3nhpdubOVVR5ZnVrztgtDaHLXlM5wqOwta5Xx0S k3oRnHd7hou3vhNsaBBnX5ubgMXHpmqJL/Zlv+su4bCV5Rs1q2oO17ciNAjcFA9q1l gTV4xvqUiQ5Mw== 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/16] tty: tty_port: use guard()s Date: Thu, 14 Aug 2025 09:24:45 +0200 Message-ID: <20250814072456.182853-6-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the tty_port code. This improves readability, makes error handling easier, and marks locked portions of code explicit. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/tty_port.c | 168 ++++++++++++++++++----------------------- 1 file changed, 74 insertions(+), 94 deletions(-) diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c index 5b4d5fb99a59..fe67c5cb0a3f 100644 --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c @@ -63,12 +63,8 @@ static void tty_port_default_lookahead_buf(struct tty_po= rt *port, const u8 *p, =20 static void tty_port_default_wakeup(struct tty_port *port) { - struct tty_struct *tty =3D tty_port_tty_get(port); - - if (tty) { - tty_wakeup(tty); - tty_kref_put(tty); - } + scoped_guard(tty_port_tty, port) + tty_wakeup(scoped_tty()); } =20 const struct tty_port_client_operations tty_port_default_client_ops =3D { @@ -225,26 +221,27 @@ EXPORT_SYMBOL_GPL(tty_port_unregister_device); int tty_port_alloc_xmit_buf(struct tty_port *port) { /* We may sleep in get_zeroed_page() */ - mutex_lock(&port->buf_mutex); - if (port->xmit_buf =3D=3D NULL) { - port->xmit_buf =3D (u8 *)get_zeroed_page(GFP_KERNEL); - if (port->xmit_buf) - kfifo_init(&port->xmit_fifo, port->xmit_buf, PAGE_SIZE); - } - mutex_unlock(&port->buf_mutex); + guard(mutex)(&port->buf_mutex); + + if (port->xmit_buf) + return 0; + + port->xmit_buf =3D (u8 *)get_zeroed_page(GFP_KERNEL); if (port->xmit_buf =3D=3D NULL) return -ENOMEM; + + kfifo_init(&port->xmit_fifo, port->xmit_buf, PAGE_SIZE); + return 0; } EXPORT_SYMBOL(tty_port_alloc_xmit_buf); =20 void tty_port_free_xmit_buf(struct tty_port *port) { - mutex_lock(&port->buf_mutex); + guard(mutex)(&port->buf_mutex); free_page((unsigned long)port->xmit_buf); port->xmit_buf =3D NULL; INIT_KFIFO(port->xmit_fifo); - mutex_unlock(&port->buf_mutex); } EXPORT_SYMBOL(tty_port_free_xmit_buf); =20 @@ -301,13 +298,8 @@ EXPORT_SYMBOL(tty_port_put); */ struct tty_struct *tty_port_tty_get(struct tty_port *port) { - unsigned long flags; - struct tty_struct *tty; - - spin_lock_irqsave(&port->lock, flags); - tty =3D tty_kref_get(port->tty); - spin_unlock_irqrestore(&port->lock, flags); - return tty; + guard(spinlock_irqsave)(&port->lock); + return tty_kref_get(port->tty); } EXPORT_SYMBOL(tty_port_tty_get); =20 @@ -321,12 +313,9 @@ EXPORT_SYMBOL(tty_port_tty_get); */ void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty) { - unsigned long flags; - - spin_lock_irqsave(&port->lock, flags); + guard(spinlock_irqsave)(&port->lock); tty_kref_put(port->tty); port->tty =3D tty_kref_get(tty); - spin_unlock_irqrestore(&port->lock, flags); } EXPORT_SYMBOL(tty_port_tty_set); =20 @@ -342,24 +331,24 @@ EXPORT_SYMBOL(tty_port_tty_set); */ static void tty_port_shutdown(struct tty_port *port, struct tty_struct *tt= y) { - mutex_lock(&port->mutex); + guard(mutex)(&port->mutex); + if (port->console) - goto out; + return; =20 - if (tty_port_initialized(port)) { - tty_port_set_initialized(port, false); - /* - * Drop DTR/RTS if HUPCL is set. This causes any attached - * modem to hang up the line. - */ - if (tty && C_HUPCL(tty)) - tty_port_lower_dtr_rts(port); + if (!tty_port_initialized(port)) + return; =20 - if (port->ops->shutdown) - port->ops->shutdown(port); - } -out: - mutex_unlock(&port->mutex); + tty_port_set_initialized(port, false); + /* + * Drop DTR/RTS if HUPCL is set. This causes any attached + * modem to hang up the line. + */ + if (tty && C_HUPCL(tty)) + tty_port_lower_dtr_rts(port); + + if (port->ops->shutdown) + port->ops->shutdown(port); } =20 /** @@ -374,15 +363,15 @@ static void tty_port_shutdown(struct tty_port *port, = struct tty_struct *tty) void tty_port_hangup(struct tty_port *port) { struct tty_struct *tty; - unsigned long flags; =20 - spin_lock_irqsave(&port->lock, flags); - port->count =3D 0; - tty =3D port->tty; - if (tty) - set_bit(TTY_IO_ERROR, &tty->flags); - port->tty =3D NULL; - spin_unlock_irqrestore(&port->lock, flags); + scoped_guard(spinlock_irqsave, &port->lock) { + port->count =3D 0; + tty =3D port->tty; + if (tty) + set_bit(TTY_IO_ERROR, &tty->flags); + port->tty =3D NULL; + } + tty_port_set_active(port, false); tty_port_shutdown(port, tty); tty_kref_put(tty); @@ -393,15 +382,16 @@ EXPORT_SYMBOL(tty_port_hangup); =20 void __tty_port_tty_hangup(struct tty_port *port, bool check_clocal, bool = async) { - struct tty_struct *tty =3D tty_port_tty_get(port); + scoped_guard(tty_port_tty, port) { + struct tty_struct *tty =3D scoped_tty(); =20 - if (tty && (!check_clocal || !C_CLOCAL(tty))) { - if (async) - tty_hangup(tty); - else - tty_vhangup(tty); + if (!check_clocal || !C_CLOCAL(tty)) { + if (async) + tty_hangup(tty); + else + tty_vhangup(tty); + } } - tty_kref_put(tty); } EXPORT_SYMBOL_GPL(__tty_port_tty_hangup); =20 @@ -490,7 +480,6 @@ int tty_port_block_til_ready(struct tty_port *port, struct tty_struct *tty, struct file *filp) { int do_clocal =3D 0, retval; - unsigned long flags; DEFINE_WAIT(wait); =20 /* if non-blocking mode is set we can pass directly to open unless @@ -519,10 +508,10 @@ int tty_port_block_til_ready(struct tty_port *port, retval =3D 0; =20 /* The port lock protects the port counts */ - spin_lock_irqsave(&port->lock, flags); - port->count--; - port->blocked_open++; - spin_unlock_irqrestore(&port->lock, flags); + scoped_guard(spinlock_irqsave, &port->lock) { + port->count--; + port->blocked_open++; + } =20 while (1) { /* Indicate we are open */ @@ -561,11 +550,11 @@ int tty_port_block_til_ready(struct tty_port *port, /* Update counts. A parallel hangup will have set count to zero and * we must not mess that up further. */ - spin_lock_irqsave(&port->lock, flags); - if (!tty_hung_up_p(filp)) - port->count++; - port->blocked_open--; - spin_unlock_irqrestore(&port->lock, flags); + scoped_guard(spinlock_irqsave, &port->lock) { + if (!tty_hung_up_p(filp)) + port->count++; + port->blocked_open--; + } if (retval =3D=3D 0) tty_port_set_active(port, true); return retval; @@ -604,28 +593,24 @@ static void tty_port_drain_delay(struct tty_port *por= t, struct tty_struct *tty) int tty_port_close_start(struct tty_port *port, struct tty_struct *tty, struct file *filp) { - unsigned long flags; - if (tty_hung_up_p(filp)) return 0; =20 - spin_lock_irqsave(&port->lock, flags); - if (tty->count =3D=3D 1 && port->count !=3D 1) { - tty_warn(tty, "%s: tty->count =3D 1 port count =3D %d\n", __func__, - port->count); - port->count =3D 1; - } - if (--port->count < 0) { - tty_warn(tty, "%s: bad port count (%d)\n", __func__, - port->count); - port->count =3D 0; - } + scoped_guard(spinlock_irqsave, &port->lock) { + if (tty->count =3D=3D 1 && port->count !=3D 1) { + tty_warn(tty, "%s: tty->count =3D 1 port count =3D %d\n", __func__, + port->count); + port->count =3D 1; + } + if (--port->count < 0) { + tty_warn(tty, "%s: bad port count (%d)\n", __func__, + port->count); + port->count =3D 0; + } =20 - if (port->count) { - spin_unlock_irqrestore(&port->lock, flags); - return 0; + if (port->count) + return 0; } - spin_unlock_irqrestore(&port->lock, flags); =20 tty->closing =3D 1; =20 @@ -744,9 +729,8 @@ EXPORT_SYMBOL_GPL(tty_port_install); int tty_port_open(struct tty_port *port, struct tty_struct *tty, struct file *filp) { - spin_lock_irq(&port->lock); - ++port->count; - spin_unlock_irq(&port->lock); + scoped_guard(spinlock_irq, &port->lock) + ++port->count; tty_port_tty_set(port, tty); =20 /* @@ -755,21 +739,17 @@ int tty_port_open(struct tty_port *port, struct tty_s= truct *tty, * port mutex. */ =20 - mutex_lock(&port->mutex); - - if (!tty_port_initialized(port)) { + scoped_guard(mutex, &port->mutex) { + if (tty_port_initialized(port)) + break; clear_bit(TTY_IO_ERROR, &tty->flags); if (port->ops->activate) { int retval =3D port->ops->activate(port, tty); - - if (retval) { - mutex_unlock(&port->mutex); + if (retval) return retval; - } } tty_port_set_initialized(port, true); } - mutex_unlock(&port->mutex); return tty_port_block_til_ready(port, tty, filp); } EXPORT_SYMBOL(tty_port_open); --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 0C7B527146B; Thu, 14 Aug 2025 07:25:08 +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=1755156309; cv=none; b=XVdXoeejk1X7Kn4EM0LTGCBxU/m+nppcZKhiXc2eislPHmQcmoHm7yRobLWycmS56/rCRpfVfIk8bcQM0YlOWUmNLdzqmIDJUritjV1zOQ7ixzSNHpeJifgNExngg0YzwtXfrnR2ad2Eqp6I/mdm7wNNdDcDH9ZL91UmnewAlQU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156309; c=relaxed/simple; bh=SZxDq7QAhVN1IAYE84RwYsUZjBe/0T/DfTN+tw2c/G4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qehCqHOdU4wAP5WPD4NdQyev47Wf+4XXigL0wfIRuMRvyqkISyv4LH15MBqSLCwDX/n8i/dAX9TBIz55CCfd/k3R8l+t/otrRT90Sr0KU2f383lSZiOXLd0bqQRrw3Ttv7Q5wkIUFRuPlP22ouyH6icb5tZp1Ey4zjPmmGjuyHY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZPKxkaN2; 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="ZPKxkaN2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 826D7C4CEF5; Thu, 14 Aug 2025 07:25:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156308; bh=SZxDq7QAhVN1IAYE84RwYsUZjBe/0T/DfTN+tw2c/G4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZPKxkaN2RRlS5aaX7OgShzCwVGRYjdad1FO60ujGaHYvRtiisQctBfyimMU7zNUBZ Fjgy3n8QnJCz58DmF5pCXM1btPBqQ0T8btxxKW0+ReHJfxmT8abNbBR79q9UEntgGC hv8TPoBlTSFJUOuhqs6r4Cb0zpvK3NdeFO10c0fvZvZT66umON42qzxrFh81GtAhQv +BZykdYX23TNwMR4TsrksC2/j+unQiTLLD2NuMCsmhfikGm2C+QUIhF12U6hLwUGql pWQkmxWkcx5wBEiVP/ZmaFUGd7sSXie7qi5GGM9g0ZfzFIfqTxBm36ZYCr8xk3l1yB zqf2EXqymDomg== 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/16] mxser: use tty_port_tty guard() in mxser_port_isr() Date: Thu, 14 Aug 2025 09:24:46 +0200 Message-ID: <20250814072456.182853-7-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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 scoped_guard() and reorder the function. This is done separately from the other changes, as it is slighly more intrusive: scoped_guard() handles the have-tty case and returns. The non-tty case is done at the end of the function. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/mxser.c | 62 +++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 2fc13cc02cc5..b070ebf9f51a 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c @@ -1600,54 +1600,50 @@ static void mxser_transmit_chars(struct tty_struct = *tty, struct mxser_port *port =20 static bool mxser_port_isr(struct mxser_port *port) { - struct tty_struct *tty; u8 iir, status; - bool error =3D false; =20 iir =3D inb(port->ioaddr + UART_IIR); if (iir & UART_IIR_NO_INT) return true; =20 iir &=3D MOXA_MUST_IIR_MASK; - tty =3D tty_port_tty_get(&port->port); - if (!tty) { - status =3D inb(port->ioaddr + UART_LSR); - outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, - port->ioaddr + UART_FCR); - inb(port->ioaddr + UART_MSR); =20 - error =3D true; - goto put_tty; - } + scoped_guard(tty_port_tty, &port->port) { + struct tty_struct *tty =3D scoped_tty(); =20 - status =3D inb(port->ioaddr + UART_LSR); + status =3D inb(port->ioaddr + UART_LSR); =20 - if (port->board->must_hwid) { - if (iir =3D=3D MOXA_MUST_IIR_GDA || - iir =3D=3D MOXA_MUST_IIR_RDA || - iir =3D=3D MOXA_MUST_IIR_RTO || - iir =3D=3D MOXA_MUST_IIR_LSR) - status =3D mxser_receive_chars(tty, port, status); - } else { - status &=3D port->read_status_mask; - if (status & UART_LSR_DR) - status =3D mxser_receive_chars(tty, port, status); - } + if (port->board->must_hwid) { + if (iir =3D=3D MOXA_MUST_IIR_GDA || + iir =3D=3D MOXA_MUST_IIR_RDA || + iir =3D=3D MOXA_MUST_IIR_RTO || + iir =3D=3D MOXA_MUST_IIR_LSR) + status =3D mxser_receive_chars(tty, port, status); + } else { + status &=3D port->read_status_mask; + if (status & UART_LSR_DR) + status =3D mxser_receive_chars(tty, port, status); + } =20 - mxser_check_modem_status(tty, port); + mxser_check_modem_status(tty, port); =20 - if (port->board->must_hwid) { - if (iir =3D=3D 0x02 && (status & UART_LSR_THRE)) - mxser_transmit_chars(tty, port); - } else { - if (status & UART_LSR_THRE) - mxser_transmit_chars(tty, port); + if (port->board->must_hwid) { + if (iir =3D=3D 0x02 && (status & UART_LSR_THRE)) + mxser_transmit_chars(tty, port); + } else { + if (status & UART_LSR_THRE) + mxser_transmit_chars(tty, port); + } + + return false; } =20 -put_tty: - tty_kref_put(tty); + status =3D inb(port->ioaddr + UART_LSR); + outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, + port->ioaddr + UART_FCR); + inb(port->ioaddr + UART_MSR); =20 - return error; + return true; } =20 /* --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 3D89126B973; Thu, 14 Aug 2025 07:25:10 +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=1755156310; cv=none; b=A2Wis1xQyoIn/zOf4oJedsqx58qWmeJ3JulB/Zx8tfBaB4gotiG0DczPel97znJiqXxNrpVcYU98tqWu4mKB4Q1BTw8baGgWUiXjL1R9IjSd9pwalGExn8xJM3uPDSpEoU2ToV1VtT/z1tIGZ0TZeeiHwaVhZXlIT/2johGJKnY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156310; c=relaxed/simple; bh=jxmK01jIcUruME/7KPiUOrqBxkdlfWc2u7Wy+ABq91I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qoHRLpwS3qYs0i1GckvkRHL8tv5t2buYhX16s+z4SvKFHk56dnvGDbSqWXpc3aZ6y9ksHDorvPAmo6JMptSBGseqdR4vmuw9737+/ZKxMg0BZSo0opZEb6LybGQAAE+8eOSOWsBMDdFI+OLPCj4mIPHyv/vUNkGalQH5w0OL9wc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q5eYowzm; 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="Q5eYowzm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C2CAC4CEEF; Thu, 14 Aug 2025 07:25:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156310; bh=jxmK01jIcUruME/7KPiUOrqBxkdlfWc2u7Wy+ABq91I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q5eYowzm16qTjGq7vQw1+A7OJGRUdoQKBgo8Abj0E4btywSUthyjCU/qmZvzIsILV KZqvkoiiRKMUprTAGLjLkvKi3A+ag86yoAo1wwrK+ZL0YO5NftvtZ/smAyM8Wk55DT 8H8bHwgu4LY0GefEVfyPi4loK2hbyAq2EcGNpkyYjC47Gq8iglhZ5cnbk2QPXbPj2y RvPU+PMbR7aA8nuqUEPzwTT7X8GUfmctlZLmVATJ4qLOicZtXwL6N9zrCVCk6oYnPd c1IEzOlYvN79J0pugFQCN3PqFcpeoAkei4i+qbhSz2+WSqTo471JjrSPaL/kaw9wwm oZpjulxZBXRsA== 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/16] mxser: use guard()s Date: Thu, 14 Aug 2025 09:24:47 +0200 Message-ID: <20250814072456.182853-8-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the mxser code. This improves readability, makes error handling easier, and marks locked portions of code explicit. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/mxser.c | 197 +++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 123 deletions(-) diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index b070ebf9f51a..94677fec685e 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c @@ -442,11 +442,8 @@ static void __mxser_start_tx(struct mxser_port *info) =20 static void mxser_start_tx(struct mxser_port *info) { - unsigned long flags; - - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); __mxser_start_tx(info); - spin_unlock_irqrestore(&info->slock, flags); } =20 static void __mxser_stop_tx(struct mxser_port *info) @@ -465,17 +462,15 @@ static bool mxser_carrier_raised(struct tty_port *por= t) static void mxser_dtr_rts(struct tty_port *port, bool active) { struct mxser_port *mp =3D container_of(port, struct mxser_port, port); - unsigned long flags; u8 mcr; =20 - spin_lock_irqsave(&mp->slock, flags); + guard(spinlock_irqsave)(&mp->slock); mcr =3D inb(mp->ioaddr + UART_MCR); if (active) mcr |=3D UART_MCR_DTR | UART_MCR_RTS; else mcr &=3D ~(UART_MCR_DTR | UART_MCR_RTS); outb(mcr, mp->ioaddr + UART_MCR); - spin_unlock_irqrestore(&mp->slock, flags); } =20 static int mxser_set_baud(struct tty_struct *tty, speed_t newspd) @@ -828,32 +823,28 @@ static void mxser_stop_rx(struct mxser_port *info) static void mxser_shutdown_port(struct tty_port *port) { struct mxser_port *info =3D container_of(port, struct mxser_port, port); - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); - - mxser_stop_rx(info); - - /* - * clear delta_msr_wait queue to avoid mem leaks: we may free the irq - * here so the queue might never be waken up - */ - wake_up_interruptible(&info->port.delta_msr_wait); + scoped_guard(spinlock_irqsave, &info->slock) { + mxser_stop_rx(info); =20 - info->IER =3D 0; - outb(0x00, info->ioaddr + UART_IER); - - /* clear Rx/Tx FIFO's */ - mxser_disable_and_clear_FIFO(info); + /* + * clear delta_msr_wait queue to avoid mem leaks: we may free the irq + * here so the queue might never be waken up + */ + wake_up_interruptible(&info->port.delta_msr_wait); =20 - /* read data port to reset things */ - (void) inb(info->ioaddr + UART_RX); + info->IER =3D 0; + outb(0x00, info->ioaddr + UART_IER); =20 + /* clear Rx/Tx FIFO's */ + mxser_disable_and_clear_FIFO(info); =20 - if (info->board->must_hwid) - mxser_must_no_sw_flow_control(info->ioaddr); + /* read data port to reset things */ + (void)inb(info->ioaddr + UART_RX); =20 - spin_unlock_irqrestore(&info->slock, flags); + if (info->board->must_hwid) + mxser_must_no_sw_flow_control(info->ioaddr); + } =20 /* make sure ISR is not running while we free the buffer */ synchronize_irq(info->board->irq); @@ -880,15 +871,13 @@ static int mxser_open(struct tty_struct *tty, struct = file *filp) static void mxser_flush_buffer(struct tty_struct *tty) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); - kfifo_reset(&info->port.xmit_fifo); + scoped_guard(spinlock_irqsave, &info->slock) { + kfifo_reset(&info->port.xmit_fifo); =20 - outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, - info->ioaddr + UART_FCR); - - spin_unlock_irqrestore(&info->slock, flags); + outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, + info->ioaddr + UART_FCR); + } =20 tty_wakeup(tty); } @@ -901,14 +890,13 @@ static void mxser_close(struct tty_struct *tty, struc= t file *filp) static ssize_t mxser_write(struct tty_struct *tty, const u8 *buf, size_t c= ount) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; size_t written; bool is_empty; =20 - spin_lock_irqsave(&info->slock, flags); - written =3D kfifo_in(&info->port.xmit_fifo, buf, count); - is_empty =3D kfifo_is_empty(&info->port.xmit_fifo); - spin_unlock_irqrestore(&info->slock, flags); + scoped_guard(spinlock_irqsave, &info->slock) { + written =3D kfifo_in(&info->port.xmit_fifo, buf, count); + is_empty =3D kfifo_is_empty(&info->port.xmit_fifo); + } =20 if (!is_empty && !tty->flow.stopped) if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) @@ -920,14 +908,9 @@ static ssize_t mxser_write(struct tty_struct *tty, con= st u8 *buf, size_t count) static int mxser_put_char(struct tty_struct *tty, u8 ch) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; - int ret; - - spin_lock_irqsave(&info->slock, flags); - ret =3D kfifo_put(&info->port.xmit_fifo, ch); - spin_unlock_irqrestore(&info->slock, flags); =20 - return ret; + guard(spinlock_irqsave)(&info->slock); + return kfifo_put(&info->port.xmit_fifo, ch); } =20 =20 @@ -968,7 +951,7 @@ static int mxser_get_serial_info(struct tty_struct *tty, struct tty_port *port =3D &info->port; unsigned int closing_wait, close_delay; =20 - mutex_lock(&port->mutex); + guard(mutex)(&port->mutex); =20 close_delay =3D jiffies_to_msecs(info->port.close_delay) / 10; closing_wait =3D info->port.closing_wait; @@ -984,7 +967,7 @@ static int mxser_get_serial_info(struct tty_struct *tty, ss->close_delay =3D close_delay; ss->closing_wait =3D closing_wait; ss->custom_divisor =3D MXSER_CUSTOM_DIVISOR; - mutex_unlock(&port->mutex); + return 0; } =20 @@ -994,20 +977,15 @@ static int mxser_set_serial_info(struct tty_struct *t= ty, struct mxser_port *info =3D tty->driver_data; struct tty_port *port =3D &info->port; speed_t baud; - unsigned long sl_flags; unsigned int old_speed, close_delay, closing_wait; - int retval =3D 0; =20 if (tty_io_error(tty)) return -EIO; =20 - mutex_lock(&port->mutex); + guard(mutex)(&port->mutex); =20 - if (ss->irq !=3D info->board->irq || - ss->port !=3D info->ioaddr) { - mutex_unlock(&port->mutex); + if (ss->irq !=3D info->board->irq || ss->port !=3D info->ioaddr) return -EINVAL; - } =20 old_speed =3D port->flags & ASYNC_SPD_MASK; =20 @@ -1020,10 +998,9 @@ static int mxser_set_serial_info(struct tty_struct *t= ty, if ((ss->baud_base !=3D MXSER_BAUD_BASE) || (close_delay !=3D port->close_delay) || (closing_wait !=3D port->closing_wait) || - ((ss->flags & ~ASYNC_USR_MASK) !=3D (port->flags & ~ASYNC_USR_MASK))) { - mutex_unlock(&port->mutex); + ((ss->flags & ~ASYNC_USR_MASK) !=3D (port->flags & ~ASYNC_USR_MASK))) return -EPERM; - } + port->flags =3D (port->flags & ~ASYNC_USR_MASK) | (ss->flags & ASYNC_USR_MASK); } else { @@ -1039,10 +1016,9 @@ static int mxser_set_serial_info(struct tty_struct *= tty, (ss->baud_base !=3D MXSER_BAUD_BASE || ss->custom_divisor !=3D MXSER_CUSTOM_DIVISOR)) { - if (ss->custom_divisor =3D=3D 0) { - mutex_unlock(&port->mutex); + if (ss->custom_divisor =3D=3D 0) return -EINVAL; - } + baud =3D ss->baud_base / ss->custom_divisor; tty_encode_baud_rate(tty, baud, baud); } @@ -1054,16 +1030,17 @@ static int mxser_set_serial_info(struct tty_struct = *tty, =20 if (tty_port_initialized(port)) { if (old_speed !=3D (port->flags & ASYNC_SPD_MASK)) { - spin_lock_irqsave(&info->slock, sl_flags); + guard(spinlock_irqsave)(&info->slock); mxser_change_speed(tty, NULL); - spin_unlock_irqrestore(&info->slock, sl_flags); } - } else { - retval =3D mxser_activate(port, tty); - if (retval =3D=3D 0) - tty_port_set_initialized(port, true); + + return 0; } - mutex_unlock(&port->mutex); + + int retval =3D mxser_activate(port, tty); + if (retval =3D=3D 0) + tty_port_set_initialized(port, true); + return retval; } =20 @@ -1080,13 +1057,11 @@ static int mxser_set_serial_info(struct tty_struct = *tty, static int mxser_get_lsr_info(struct mxser_port *info, unsigned int __user *value) { - unsigned char status; unsigned int result; - unsigned long flags; + u8 status; =20 - spin_lock_irqsave(&info->slock, flags); - status =3D inb(info->ioaddr + UART_LSR); - spin_unlock_irqrestore(&info->slock, flags); + scoped_guard(spinlock_irqsave, &info->slock) + status =3D inb(info->ioaddr + UART_LSR); result =3D ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); return put_user(result, value); } @@ -1095,16 +1070,15 @@ static int mxser_tiocmget(struct tty_struct *tty) { struct mxser_port *info =3D tty->driver_data; unsigned char control; - unsigned long flags; u8 msr; =20 if (tty_io_error(tty)) return -EIO; =20 - spin_lock_irqsave(&info->slock, flags); - control =3D info->MCR; - msr =3D mxser_check_modem_status(tty, info); - spin_unlock_irqrestore(&info->slock, flags); + scoped_guard(spinlock_irqsave, &info->slock) { + control =3D info->MCR; + msr =3D mxser_check_modem_status(tty, info); + } =20 return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | @@ -1118,12 +1092,11 @@ static int mxser_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; =20 if (tty_io_error(tty)) return -EIO; =20 - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); =20 if (set & TIOCM_RTS) info->MCR |=3D UART_MCR_RTS; @@ -1136,7 +1109,7 @@ static int mxser_tiocmset(struct tty_struct *tty, info->MCR &=3D ~UART_MCR_DTR; =20 outb(info->MCR, info->ioaddr + UART_MCR); - spin_unlock_irqrestore(&info->slock, flags); + return 0; } =20 @@ -1144,12 +1117,11 @@ static int mxser_cflags_changed(struct mxser_port *= info, unsigned long arg, struct async_icount *cprev) { struct async_icount cnow; - unsigned long flags; int ret; =20 - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; /* atomic copy */ - spin_unlock_irqrestore(&info->slock, flags); + /* atomic copy */ + scoped_guard(spinlock_irqsave, &info->slock) + cnow =3D info->icount; =20 ret =3D ((arg & TIOCM_RNG) && (cnow.rng !=3D cprev->rng)) || ((arg & TIOCM_DSR) && (cnow.dsr !=3D cprev->dsr)) || @@ -1179,19 +1151,17 @@ static int mxser_ioctl_op_mode(struct mxser_port *p= ort, int index, bool set, if (opmode & ~OP_MODE_MASK) return -EINVAL; =20 - spin_lock_irq(&port->slock); + guard(spinlock_irq)(&port->slock); val =3D inb(port->opmode_ioaddr); val &=3D ~(OP_MODE_MASK << shiftbit); val |=3D (opmode << shiftbit); outb(val, port->opmode_ioaddr); - spin_unlock_irq(&port->slock); =20 return 0; } =20 - spin_lock_irq(&port->slock); - opmode =3D inb(port->opmode_ioaddr) >> shiftbit; - spin_unlock_irq(&port->slock); + scoped_guard(spinlock_irq, &port->slock) + opmode =3D inb(port->opmode_ioaddr) >> shiftbit; =20 return put_user(opmode & OP_MODE_MASK, u_opmode); } @@ -1201,7 +1171,6 @@ static int mxser_ioctl(struct tty_struct *tty, { struct mxser_port *info =3D tty->driver_data; struct async_icount cnow; - unsigned long flags; void __user *argp =3D (void __user *)arg; =20 if (cmd =3D=3D MOXA_SET_OP_MODE || cmd =3D=3D MOXA_GET_OP_MODE) @@ -1221,9 +1190,9 @@ static int mxser_ioctl(struct tty_struct *tty, * Caller should use TIOCGICOUNT to see which one it was */ case TIOCMIWAIT: - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; /* note the counters on entry */ - spin_unlock_irqrestore(&info->slock, flags); + /* note the counters on entry */ + scoped_guard(spinlock_irqsave, &info->slock) + cnow =3D info->icount; =20 return wait_event_interruptible(info->port.delta_msr_wait, mxser_cflags_changed(info, arg, &cnow)); @@ -1246,11 +1215,9 @@ static int mxser_get_icount(struct tty_struct *tty, { struct mxser_port *info =3D tty->driver_data; struct async_icount cnow; - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); - cnow =3D info->icount; - spin_unlock_irqrestore(&info->slock, flags); + scoped_guard(spinlock_irqsave, &info->slock) + cnow =3D info->icount; =20 icount->frame =3D cnow.frame; icount->brk =3D cnow.brk; @@ -1328,34 +1295,28 @@ static void mxser_unthrottle(struct tty_struct *tty) static void mxser_stop(struct tty_struct *tty) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); if (info->IER & UART_IER_THRI) __mxser_stop_tx(info); - spin_unlock_irqrestore(&info->slock, flags); } =20 static void mxser_start(struct tty_struct *tty) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); if (!kfifo_is_empty(&info->port.xmit_fifo)) __mxser_start_tx(info); - spin_unlock_irqrestore(&info->slock, flags); } =20 static void mxser_set_termios(struct tty_struct *tty, const struct ktermios *old_termios) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; =20 - spin_lock_irqsave(&info->slock, flags); - mxser_change_speed(tty, old_termios); - spin_unlock_irqrestore(&info->slock, flags); + scoped_guard(spinlock_irqsave, &info->slock) + mxser_change_speed(tty, old_termios); =20 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { tty->hw_stopped =3D false; @@ -1367,9 +1328,8 @@ static void mxser_set_termios(struct tty_struct *tty, tty->flow.stopped =3D 0; =20 if (info->board->must_hwid) { - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); mxser_must_set_rx_sw_flow_control(info->ioaddr, false); - spin_unlock_irqrestore(&info->slock, flags); } =20 mxser_start(tty); @@ -1378,14 +1338,8 @@ static void mxser_set_termios(struct tty_struct *tty, =20 static bool mxser_tx_empty(struct mxser_port *info) { - unsigned long flags; - u8 lsr; - - spin_lock_irqsave(&info->slock, flags); - lsr =3D inb(info->ioaddr + UART_LSR); - spin_unlock_irqrestore(&info->slock, flags); - - return !(lsr & UART_LSR_TEMT); + guard(spinlock_irqsave)(&info->slock); + return !(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT); } =20 /* @@ -1459,17 +1413,15 @@ static void mxser_hangup(struct tty_struct *tty) static int mxser_rs_break(struct tty_struct *tty, int break_state) { struct mxser_port *info =3D tty->driver_data; - unsigned long flags; u8 lcr; =20 - spin_lock_irqsave(&info->slock, flags); + guard(spinlock_irqsave)(&info->slock); lcr =3D inb(info->ioaddr + UART_LCR); if (break_state =3D=3D -1) lcr |=3D UART_LCR_SBC; else lcr &=3D ~UART_LCR_SBC; outb(lcr, info->ioaddr + UART_LCR); - spin_unlock_irqrestore(&info->slock, flags); =20 return 0; } @@ -1672,12 +1624,11 @@ static irqreturn_t mxser_interrupt(int irq, void *d= ev_id) port =3D &brd->ports[i]; =20 int_cnt =3D 0; - spin_lock(&port->slock); + guard(spinlock)(&port->slock); do { if (mxser_port_isr(port)) break; } while (int_cnt++ < MXSER_ISR_PASS_LIMIT); - spin_unlock(&port->slock); } } =20 --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 16E55259C83; Thu, 14 Aug 2025 07:25:11 +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=1755156312; cv=none; b=DjM/pBSbrUkZJSd75PHruyqPX/H1LY1pWlnIqVJq0OBg+6jcO5JVrA1/3BimzPmqiIr2Q9+aSaXU8R7s5rTUAjrF8EN6um8dtdgseIX76LBzmO9e/D2jrVMaTfqNQol3tliSLpRCVGjED9sUBZGjChm0Fh4CRKUjU5fCBXSyBMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156312; c=relaxed/simple; bh=8zCnvPjqso/GFN1c03Ur2Li/eUCKsRNs48dvx1To+O4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T4xF8B6KF/gLB6oXPmqYxC7CmlUSPYFL//A7mPGwuG+aV5sGYTjhSRjD3WD6MxY/5aiKfJi3pjEsIm4RRD4bHZWngk9WOxlRxEOGKKczAPsVL6Hl1UKePbYHyu5p7IWtXc69CEhggduQd/0B5PLrUhFMh+M+ZmkVpd82WIGiw58= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=X8YPhHLj; 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="X8YPhHLj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8A5E8C4CEF9; Thu, 14 Aug 2025 07:25:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156311; bh=8zCnvPjqso/GFN1c03Ur2Li/eUCKsRNs48dvx1To+O4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X8YPhHLjgoN9rqQOJGykoSQ/ndoJM0dBk0RgZ/p2dOvS8fzGE5X7XGEW7xb7/zyp+ 21URlmB8sEAy3/PsGVXOei3quGUzDh8rSA0/GXMzI5P26zHmee+jb9t7InFPV3iTqP J1eYFa8gJDMbwNb6DuQzCVhx427i/XGkSupyIjdCQUfouLJyl1UlETNqeRby5ZGUSl FDmrkeIWRu1YPVCcIbMjw/VBatUz40ZQmkCFUcXdLoUWRvp3kmi3tsWpJIKL0yaVEN dA7nxp4m5yDLFB65SuEobAnoqr4yzLljyYWCmU8Hmh3TXpXFq13YrYuj2oEuDRUmr6 uZvAZV+qs+xZA== 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/16] serial: serial_core: use guard()s Date: Thu, 14 Aug 2025 09:24:48 +0200 Message-ID: <20250814072456.182853-9-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the serial_core code. This improves readability, makes error handling easier, and marks locked portions of code explicit. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/serial_core.c | 143 +++++++++++++------------------ 1 file changed, 59 insertions(+), 84 deletions(-) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_c= ore.c index 86d404d649a3..4757293ece8c 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -177,15 +177,13 @@ static void uart_start(struct tty_struct *tty) static void uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int c= lear) { - unsigned long flags; unsigned int old; =20 - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); old =3D port->mctrl; port->mctrl =3D (old & ~clear) | set; if (old !=3D port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED)) port->ops->set_mctrl(port, port->mctrl); - uart_port_unlock_irqrestore(port, flags); } =20 #define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0) @@ -220,7 +218,7 @@ static void uart_change_line_settings(struct tty_struct= *tty, struct uart_state /* * Set modem status enables based on termios cflag */ - uart_port_lock_irq(uport); + guard(uart_port_lock_irq)(uport); if (termios->c_cflag & CRTSCTS) uport->status |=3D UPSTAT_CTS_ENABLE; else @@ -241,7 +239,6 @@ static void uart_change_line_settings(struct tty_struct= *tty, struct uart_state else __uart_start(state); } - uart_port_unlock_irq(uport); } =20 static int uart_alloc_xmit_buf(struct tty_port *port) @@ -711,7 +708,6 @@ static void uart_send_xchar(struct tty_struct *tty, u8 = ch) { struct uart_state *state =3D tty->driver_data; struct uart_port *port; - unsigned long flags; =20 port =3D uart_port_ref(state); if (!port) @@ -720,11 +716,10 @@ static void uart_send_xchar(struct tty_struct *tty, u= 8 ch) if (port->ops->send_xchar) port->ops->send_xchar(port, ch); else { - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); port->x_char =3D ch; if (ch) port->ops->start_tx(port); - uart_port_unlock_irqrestore(port, flags); } uart_port_deref(port); } @@ -1089,7 +1084,6 @@ static int uart_tiocmget(struct tty_struct *tty) struct uart_state *state =3D tty->driver_data; struct tty_port *port =3D &state->port; struct uart_port *uport; - int result; =20 guard(mutex)(&port->mutex); =20 @@ -1097,12 +1091,9 @@ static int uart_tiocmget(struct tty_struct *tty) if (!uport || tty_io_error(tty)) return -EIO; =20 - uart_port_lock_irq(uport); - result =3D uport->mctrl; - result |=3D uport->ops->get_mctrl(uport); - uart_port_unlock_irq(uport); + guard(uart_port_lock_irq)(uport); =20 - return result; + return uport->mctrl | uport->ops->get_mctrl(uport); } =20 static int @@ -1226,16 +1217,15 @@ static int uart_wait_modem_status(struct uart_state= *state, unsigned long arg) uport =3D uart_port_ref(state); if (!uport) return -EIO; - uart_port_lock_irq(uport); - memcpy(&cprev, &uport->icount, sizeof(struct uart_icount)); - uart_enable_ms(uport); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) { + memcpy(&cprev, &uport->icount, sizeof(struct uart_icount)); + uart_enable_ms(uport); + } =20 add_wait_queue(&port->delta_msr_wait, &wait); for (;;) { - uart_port_lock_irq(uport); - memcpy(&cnow, &uport->icount, sizeof(struct uart_icount)); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) + memcpy(&cnow, &uport->icount, sizeof(struct uart_icount)); =20 set_current_state(TASK_INTERRUPTIBLE); =20 @@ -1430,7 +1420,6 @@ static void uart_set_rs485_rx_during_tx(struct uart_p= ort *port, static int uart_rs485_config(struct uart_port *port) { struct serial_rs485 *rs485 =3D &port->rs485; - unsigned long flags; int ret; =20 if (!(rs485->flags & SER_RS485_ENABLED)) @@ -1440,9 +1429,8 @@ static int uart_rs485_config(struct uart_port *port) uart_set_rs485_termination(port, rs485); uart_set_rs485_rx_during_tx(port, rs485); =20 - uart_port_lock_irqsave(port, &flags); - ret =3D port->rs485_config(port, NULL, rs485); - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) + ret =3D port->rs485_config(port, NULL, rs485); if (ret) { memset(rs485, 0, sizeof(*rs485)); /* unset GPIOs */ @@ -1456,12 +1444,10 @@ static int uart_rs485_config(struct uart_port *port) static int uart_get_rs485_config(struct uart_port *port, struct serial_rs485 __user *rs485) { - unsigned long flags; struct serial_rs485 aux; =20 - uart_port_lock_irqsave(port, &flags); - aux =3D port->rs485; - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) + aux =3D port->rs485; =20 if (copy_to_user(rs485, &aux, sizeof(aux))) return -EFAULT; @@ -1474,7 +1460,6 @@ static int uart_set_rs485_config(struct tty_struct *t= ty, struct uart_port *port, { struct serial_rs485 rs485; int ret; - unsigned long flags; =20 if (!(port->rs485_supported.flags & SER_RS485_ENABLED)) return -ENOTTY; @@ -1489,16 +1474,16 @@ static int uart_set_rs485_config(struct tty_struct = *tty, struct uart_port *port, uart_set_rs485_termination(port, &rs485); uart_set_rs485_rx_during_tx(port, &rs485); =20 - uart_port_lock_irqsave(port, &flags); - ret =3D port->rs485_config(port, &tty->termios, &rs485); - if (!ret) { - port->rs485 =3D rs485; + scoped_guard(uart_port_lock_irqsave, port) { + ret =3D port->rs485_config(port, &tty->termios, &rs485); + if (!ret) { + port->rs485 =3D rs485; =20 - /* Reset RTS and other mctrl lines when disabling RS485 */ - if (!(rs485.flags & SER_RS485_ENABLED)) - port->ops->set_mctrl(port, port->mctrl); + /* Reset RTS and other mctrl lines when disabling RS485 */ + if (!(rs485.flags & SER_RS485_ENABLED)) + port->ops->set_mctrl(port, port->mctrl); + } } - uart_port_unlock_irqrestore(port, flags); if (ret) { /* restore old GPIO settings */ gpiod_set_value_cansleep(port->rs485_term_gpio, @@ -1517,15 +1502,13 @@ static int uart_set_rs485_config(struct tty_struct = *tty, struct uart_port *port, static int uart_get_iso7816_config(struct uart_port *port, struct serial_iso7816 __user *iso7816) { - unsigned long flags; struct serial_iso7816 aux; =20 if (!port->iso7816_config) return -ENOTTY; =20 - uart_port_lock_irqsave(port, &flags); - aux =3D port->iso7816; - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) + aux =3D port->iso7816; =20 if (copy_to_user(iso7816, &aux, sizeof(aux))) return -EFAULT; @@ -1537,8 +1520,7 @@ static int uart_set_iso7816_config(struct uart_port *= port, struct serial_iso7816 __user *iso7816_user) { struct serial_iso7816 iso7816; - int i, ret; - unsigned long flags; + int i; =20 if (!port->iso7816_config) return -ENOTTY; @@ -1554,11 +1536,11 @@ static int uart_set_iso7816_config(struct uart_port= *port, if (iso7816.reserved[i]) return -EINVAL; =20 - uart_port_lock_irqsave(port, &flags); - ret =3D port->iso7816_config(port, &iso7816); - uart_port_unlock_irqrestore(port, flags); - if (ret) - return ret; + scoped_guard(uart_port_lock_irqsave, port) { + int ret =3D port->iso7816_config(port, &iso7816); + if (ret) + return ret; + } =20 if (copy_to_user(iso7816_user, &port->iso7816, sizeof(port->iso7816))) return -EFAULT; @@ -1770,9 +1752,8 @@ static void uart_tty_port_shutdown(struct tty_port *p= ort) if (WARN(!uport, "detached port still initialized!\n")) return; =20 - uart_port_lock_irq(uport); - uport->ops->stop_rx(uport); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) + uport->ops->stop_rx(uport); =20 serial_base_port_shutdown(uport); uart_port_shutdown(port); @@ -2044,9 +2025,8 @@ static void uart_line_info(struct seq_file *m, struct= uart_state *state) pm_state =3D state->pm_state; if (pm_state !=3D UART_PM_STATE_ON) uart_change_pm(state, UART_PM_STATE_ON); - uart_port_lock_irq(uport); - status =3D uport->ops->get_mctrl(uport); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) + status =3D uport->ops->get_mctrl(uport); if (pm_state !=3D UART_PM_STATE_ON) uart_change_pm(state, pm_state); =20 @@ -2355,9 +2335,8 @@ int uart_suspend_port(struct uart_driver *drv, struct= uart_port *uport) */ if (!console_suspend_enabled && uart_console(uport)) { if (uport->ops->start_rx) { - uart_port_lock_irq(uport); + guard(uart_port_lock_irq)(uport); uport->ops->stop_rx(uport); - uart_port_unlock_irq(uport); } device_set_awake_path(uport->dev); return 0; @@ -2373,15 +2352,15 @@ int uart_suspend_port(struct uart_driver *drv, stru= ct uart_port *uport) tty_port_set_suspended(port, true); tty_port_set_initialized(port, false); =20 - uart_port_lock_irq(uport); - ops->stop_tx(uport); - if (!(uport->rs485.flags & SER_RS485_ENABLED)) - ops->set_mctrl(uport, 0); - /* save mctrl so it can be restored on resume */ - mctrl =3D uport->mctrl; - uport->mctrl =3D 0; - ops->stop_rx(uport); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) { + ops->stop_tx(uport); + if (!(uport->rs485.flags & SER_RS485_ENABLED)) + ops->set_mctrl(uport, 0); + /* save mctrl so it can be restored on resume */ + mctrl =3D uport->mctrl; + uport->mctrl =3D 0; + ops->stop_rx(uport); + } =20 /* * Wait for the transmitter to empty. @@ -2450,9 +2429,8 @@ int uart_resume_port(struct uart_driver *drv, struct = uart_port *uport) uart_change_pm(state, UART_PM_STATE_ON); uport->ops->set_termios(uport, &termios, NULL); if (!console_suspend_enabled && uport->ops->start_rx) { - uart_port_lock_irq(uport); + guard(uart_port_lock_irq)(uport); uport->ops->start_rx(uport); - uart_port_unlock_irq(uport); } if (console_suspend_enabled) console_resume(uport->cons); @@ -2463,10 +2441,9 @@ int uart_resume_port(struct uart_driver *drv, struct= uart_port *uport) int ret; =20 uart_change_pm(state, UART_PM_STATE_ON); - uart_port_lock_irq(uport); - if (!(uport->rs485.flags & SER_RS485_ENABLED)) - ops->set_mctrl(uport, 0); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) + if (!(uport->rs485.flags & SER_RS485_ENABLED)) + ops->set_mctrl(uport, 0); if (console_suspend_enabled || !uart_console(uport)) { /* Protected by port mutex for now */ struct tty_struct *tty =3D port->tty; @@ -2476,11 +2453,11 @@ int uart_resume_port(struct uart_driver *drv, struc= t uart_port *uport) if (tty) uart_change_line_settings(tty, state, NULL); uart_rs485_config(uport); - uart_port_lock_irq(uport); - if (!(uport->rs485.flags & SER_RS485_ENABLED)) - ops->set_mctrl(uport, uport->mctrl); - ops->start_tx(uport); - uart_port_unlock_irq(uport); + scoped_guard(uart_port_lock_irq, uport) { + if (!(uport->rs485.flags & SER_RS485_ENABLED)) + ops->set_mctrl(uport, uport->mctrl); + ops->start_tx(uport); + } tty_port_set_initialized(port, true); } else { /* @@ -2574,8 +2551,6 @@ uart_configure_port(struct uart_driver *drv, struct u= art_state *state, } =20 if (port->type !=3D PORT_UNKNOWN) { - unsigned long flags; - uart_report_port(drv, port); =20 /* Synchronize with possible boot console. */ @@ -2590,11 +2565,11 @@ uart_configure_port(struct uart_driver *drv, struct= uart_state *state, * keep the DTR setting that is set in uart_set_options() * We probably don't need a spinlock around this, but */ - uart_port_lock_irqsave(port, &flags); - port->mctrl &=3D TIOCM_DTR; - if (!(port->rs485.flags & SER_RS485_ENABLED)) - port->ops->set_mctrl(port, port->mctrl); - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) { + port->mctrl &=3D TIOCM_DTR; + if (!(port->rs485.flags & SER_RS485_ENABLED)) + port->ops->set_mctrl(port, port->mctrl); + } =20 uart_rs485_config(port); =20 --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 6F0C025C816; Thu, 14 Aug 2025 07:25:13 +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=1755156313; cv=none; b=LqR711NeGDgLH7fxgXQc1ybhtHZfqHu2VH4D30Y/PTUChSDOibLjCxZfeizADHhdsN2k5IK6edjteBQEdsJ7h0Ax3nxWnP7JGVcXl9UHP3A0AaHEUkNE91JgeQP0+s6LiM1H/VNmRkt43ukT9WtXcpyn90HJH0bOr9S2JxyyKKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156313; c=relaxed/simple; bh=fyOGyC7zfV6Z+z3/Hk6dYdPg+04GhhtJLqJqFI6bF9Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NNl2Aqhm4UUZF6pAvbYKTyE/aR8eMYHSFzqO5rnPTnlxvnuVTlHge0YpKBDvxtdO5I/lxHzpG7tUDSH1U/9SeM3gCdy2wUhgj1zCf6rRhaNsQMRibFOFH9FsY7Uii4NdHHRiOJmQWTq6ClPLWusZoyyPumTBJa7M0Fo8QjbSqXo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tf37YlSg; 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="tf37YlSg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13C9AC4CEF4; Thu, 14 Aug 2025 07:25:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156313; bh=fyOGyC7zfV6Z+z3/Hk6dYdPg+04GhhtJLqJqFI6bF9Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tf37YlSgdwmuVDAoElLqGZcnQ+i5sJaYPMBXgMruwG5l2NOoIdVGfos7e2d9Qn2Uo Ft079lbZ3m5JhzEIWk2IUj1c9nL3daZpb+26krXSFVeGaJ6vB3C6d2MqobtHpNTJa7 hrYQOpknJ/10h7qDMOVg4sZtZVf5vEJl9uXHPzSeYk8+YpL6hfR6OiUkfxKlKsB96i p57oPLZKdMl1orAAGE1dN2TfXDZOB2LarOXU78oSoRZATOOojX85IGjayVWfRyWV8T /zr0mc6K8I5DdR8GttySU9Bcjn2vzgbzot661dak8zz9za+Dvc/cZlNKeMR4+s4FTM 89k3hyKn/3iWg== 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/16] serial: 8250: use guard()s Date: Thu, 14 Aug 2025 09:24:49 +0200 Message-ID: <20250814072456.182853-10-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the 8250 code. This improves readability, makes error handling easier, and marks locked portions of code explicit. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250_core.c | 71 +++---- drivers/tty/serial/8250/8250_port.c | 292 +++++++++++----------------- 2 files changed, 143 insertions(+), 220 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/= 8250_core.c index feb920c5b2e8..82c3636451e5 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -72,7 +72,7 @@ static irqreturn_t serial8250_interrupt(int irq, void *de= v_id) struct list_head *l, *end =3D NULL; int pass_counter =3D 0, handled =3D 0; =20 - spin_lock(&i->lock); + guard(spinlock)(&i->lock); =20 l =3D i->head; do { @@ -91,8 +91,6 @@ static irqreturn_t serial8250_interrupt(int irq, void *de= v_id) break; } while (l !=3D end); =20 - spin_unlock(&i->lock); - return IRQ_RETVAL(handled); } =20 @@ -132,22 +130,19 @@ static struct irq_info *serial_get_or_create_irq_info= (const struct uart_8250_por { struct irq_info *i; =20 - mutex_lock(&hash_mutex); + guard(mutex)(&hash_mutex); =20 hash_for_each_possible(irq_lists, i, node, up->port.irq) if (i->irq =3D=3D up->port.irq) - goto unlock; + return i; =20 i =3D kzalloc(sizeof(*i), GFP_KERNEL); - if (i =3D=3D NULL) { - i =3D ERR_PTR(-ENOMEM); - goto unlock; - } + if (i =3D=3D NULL) + return ERR_PTR(-ENOMEM); + spin_lock_init(&i->lock); i->irq =3D up->port.irq; hash_add(irq_lists, &i->node, i->irq); -unlock: - mutex_unlock(&hash_mutex); =20 return i; } @@ -161,23 +156,21 @@ static int serial_link_irq_chain(struct uart_8250_por= t *up) if (IS_ERR(i)) return PTR_ERR(i); =20 - spin_lock_irq(&i->lock); + scoped_guard(spinlock_irq, &i->lock) { + if (i->head) { + list_add(&up->list, i->head); =20 - if (i->head) { - list_add(&up->list, i->head); - spin_unlock_irq(&i->lock); + return 0; + } =20 - ret =3D 0; - } else { INIT_LIST_HEAD(&up->list); i->head =3D &up->list; - spin_unlock_irq(&i->lock); - ret =3D request_irq(up->port.irq, serial8250_interrupt, - up->port.irqflags, up->port.name, i); - if (ret < 0) - serial_do_unlink(i, up); } =20 + ret =3D request_irq(up->port.irq, serial8250_interrupt, up->port.irqflags= , up->port.name, i); + if (ret < 0) + serial_do_unlink(i, up); + return ret; } =20 @@ -670,16 +663,12 @@ static struct uart_8250_port *serial8250_find_match_o= r_unused(const struct uart_ =20 static void serial_8250_overrun_backoff_work(struct work_struct *work) { - struct uart_8250_port *up =3D - container_of(to_delayed_work(work), struct uart_8250_port, - overrun_backoff); - struct uart_port *port =3D &up->port; - unsigned long flags; + struct uart_8250_port *up =3D container_of(to_delayed_work(work), struct = uart_8250_port, + overrun_backoff); =20 - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(&up->port); up->ier |=3D UART_IER_RLSI | UART_IER_RDI; serial_out(up, UART_IER, up->ier); - uart_port_unlock_irqrestore(port, flags); } =20 /** @@ -698,12 +687,12 @@ static void serial_8250_overrun_backoff_work(struct w= ork_struct *work) int serial8250_register_8250_port(const struct uart_8250_port *up) { struct uart_8250_port *uart; - int ret =3D -ENOSPC; + int ret; =20 if (up->port.uartclk =3D=3D 0) return -EINVAL; =20 - mutex_lock(&serial_mutex); + guard(mutex)(&serial_mutex); =20 uart =3D serial8250_find_match_or_unused(&up->port); if (!uart) { @@ -713,15 +702,13 @@ int serial8250_register_8250_port(const struct uart_8= 250_port *up) */ uart =3D serial8250_setup_port(nr_uarts); if (!uart) - goto unlock; + return -ENOSPC; nr_uarts++; } =20 /* Check if it is CIR already. We check this below again, see there why. = */ - if (uart->port.type =3D=3D PORT_8250_CIR) { - ret =3D -ENODEV; - goto unlock; - } + if (uart->port.type =3D=3D PORT_8250_CIR) + return -ENODEV; =20 if (uart->port.dev) uart_remove_one_port(&serial8250_reg, &uart->port); @@ -855,14 +842,10 @@ int serial8250_register_8250_port(const struct uart_8= 250_port *up) uart->overrun_backoff_time_ms =3D 0; } =20 -unlock: - mutex_unlock(&serial_mutex); - return ret; =20 err: uart->port.dev =3D NULL; - mutex_unlock(&serial_mutex); return ret; } EXPORT_SYMBOL(serial8250_register_8250_port); @@ -878,14 +861,11 @@ void serial8250_unregister_port(int line) { struct uart_8250_port *uart =3D &serial8250_ports[line]; =20 - mutex_lock(&serial_mutex); + guard(mutex)(&serial_mutex); =20 if (uart->em485) { - unsigned long flags; - - uart_port_lock_irqsave(&uart->port, &flags); + guard(uart_port_lock_irqsave)(&uart->port); serial8250_em485_destroy(uart); - uart_port_unlock_irqrestore(&uart->port, flags); } =20 uart_remove_one_port(&serial8250_reg, &uart->port); @@ -901,7 +881,6 @@ void serial8250_unregister_port(int line) } else { uart->port.dev =3D NULL; } - mutex_unlock(&serial_mutex); } EXPORT_SYMBOL(serial8250_unregister_port); =20 diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/= 8250_port.c index 5afae4025696..719faf92aa8a 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -674,28 +674,27 @@ static void serial8250_set_sleep(struct uart_8250_por= t *p, int sleep) { unsigned char lcr =3D 0, efr =3D 0; =20 - serial8250_rpm_get(p); - - if (p->capabilities & UART_CAP_SLEEP) { - /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(&p->port); - if (p->capabilities & UART_CAP_EFR) { - lcr =3D serial_in(p, UART_LCR); - efr =3D serial_in(p, UART_EFR); - serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); - serial_out(p, UART_EFR, UART_EFR_ECB); - serial_out(p, UART_LCR, 0); - } - serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); - if (p->capabilities & UART_CAP_EFR) { - serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); - serial_out(p, UART_EFR, efr); - serial_out(p, UART_LCR, lcr); - } - uart_port_unlock_irq(&p->port); - } + guard(serial8250_rpm)(p); + + if (!(p->capabilities & UART_CAP_SLEEP)) + return; + + /* Synchronize UART_IER access against the console. */ + guard(uart_port_lock_irq)(&p->port); =20 - serial8250_rpm_put(p); + if (p->capabilities & UART_CAP_EFR) { + lcr =3D serial_in(p, UART_LCR); + efr =3D serial_in(p, UART_EFR); + serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); + serial_out(p, UART_EFR, UART_EFR_ECB); + serial_out(p, UART_LCR, 0); + } + serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); + if (p->capabilities & UART_CAP_EFR) { + serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); + serial_out(p, UART_EFR, efr); + serial_out(p, UART_LCR, lcr); + } } =20 /* Clear the interrupt registers. */ @@ -1231,9 +1230,8 @@ static void autoconfig_irq(struct uart_8250_port *up) probe_irq_off(probe_irq_on()); save_mcr =3D serial8250_in_MCR(up); /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); - save_ier =3D serial_in(up, UART_IER); - uart_port_unlock_irq(port); + scoped_guard(uart_port_lock_irq, port) + save_ier =3D serial_in(up, UART_IER); serial8250_out_MCR(up, UART_MCR_OUT1 | UART_MCR_OUT2); =20 irqs =3D probe_irq_on(); @@ -1246,9 +1244,8 @@ static void autoconfig_irq(struct uart_8250_port *up) UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2); } /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); - serial_out(up, UART_IER, UART_IER_ALL_INTR); - uart_port_unlock_irq(port); + scoped_guard(uart_port_lock_irq, port) + serial_out(up, UART_IER, UART_IER_ALL_INTR); serial8250_clear_interrupts(port); serial_out(up, UART_TX, 0xFF); udelay(20); @@ -1256,9 +1253,8 @@ static void autoconfig_irq(struct uart_8250_port *up) =20 serial8250_out_MCR(up, save_mcr); /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); - serial_out(up, UART_IER, save_ier); - uart_port_unlock_irq(port); + scoped_guard(uart_port_lock_irq, port) + serial_out(up, UART_IER, save_ier); =20 if (port->flags & UPF_FOURPORT) outb_p(save_ICP, ICP); @@ -1273,12 +1269,10 @@ static void serial8250_stop_rx(struct uart_port *po= rt) /* Port locked to synchronize UART_IER access against the console. */ lockdep_assert_held_once(&port->lock); =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); =20 up->ier &=3D ~(UART_IER_RLSI | UART_IER_RDI); serial_port_out(port, UART_IER, up->ier); - - serial8250_rpm_put(up); } =20 /** @@ -1322,17 +1316,15 @@ static enum hrtimer_restart serial8250_em485_handle= _stop_tx(struct hrtimer *t) struct uart_8250_em485 *em485 =3D container_of(t, struct uart_8250_em485, stop_tx_timer); struct uart_8250_port *p =3D em485->port; - unsigned long flags; =20 - serial8250_rpm_get(p); - uart_port_lock_irqsave(&p->port, &flags); + guard(serial8250_rpm)(p); + guard(uart_port_lock_irqsave)(&p->port); + if (em485->active_timer =3D=3D &em485->stop_tx_timer) { p->rs485_stop_tx(p, true); em485->active_timer =3D NULL; em485->tx_stopped =3D true; } - uart_port_unlock_irqrestore(&p->port, flags); - serial8250_rpm_put(p); =20 return HRTIMER_NORESTART; } @@ -1407,7 +1399,7 @@ static void serial8250_stop_tx(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); __stop_tx(up); =20 /* @@ -1417,7 +1409,6 @@ static void serial8250_stop_tx(struct uart_port *port) up->acr |=3D UART_ACR_TXDIS; serial_icr_write(up, UART_ACR, up->acr); } - serial8250_rpm_put(up); } =20 static inline void __start_tx(struct uart_port *port) @@ -1512,14 +1503,13 @@ static enum hrtimer_restart serial8250_em485_handle= _start_tx(struct hrtimer *t) struct uart_8250_em485 *em485 =3D container_of(t, struct uart_8250_em485, start_tx_timer); struct uart_8250_port *p =3D em485->port; - unsigned long flags; =20 - uart_port_lock_irqsave(&p->port, &flags); + guard(uart_port_lock_irqsave)(&p->port); + if (em485->active_timer =3D=3D &em485->start_tx_timer) { __start_tx(&p->port); em485->active_timer =3D NULL; } - uart_port_unlock_irqrestore(&p->port, flags); =20 return HRTIMER_NORESTART; } @@ -1587,9 +1577,8 @@ static void serial8250_enable_ms(struct uart_port *po= rt) =20 up->ier |=3D UART_IER_MSI; =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); serial_port_out(port, UART_IER, up->ier); - serial8250_rpm_put(up); } =20 void serial8250_read_char(struct uart_8250_port *up, u16 lsr) @@ -1850,15 +1839,11 @@ static int serial8250_default_handle_irq(struct uar= t_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); unsigned int iir; - int ret; =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); =20 iir =3D serial_port_in(port, UART_IIR); - ret =3D serial8250_handle_irq(port, iir); - - serial8250_rpm_put(up); - return ret; + return serial8250_handle_irq(port, iir); } =20 /* @@ -1869,16 +1854,14 @@ static int serial8250_default_handle_irq(struct uar= t_port *port) */ static int serial8250_tx_threshold_handle_irq(struct uart_port *port) { - unsigned long flags; unsigned int iir =3D serial_port_in(port, UART_IIR); =20 /* TX Threshold IRQ triggered so load up FIFO */ if ((iir & UART_IIR_ID) =3D=3D UART_IIR_THRI) { struct uart_8250_port *up =3D up_to_u8250p(port); =20 - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); serial8250_tx_chars(up); - uart_port_unlock_irqrestore(port, flags); } =20 iir =3D serial_port_in(port, UART_IIR); @@ -1888,19 +1871,14 @@ static int serial8250_tx_threshold_handle_irq(struc= t uart_port *port) static unsigned int serial8250_tx_empty(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned int result =3D 0; - unsigned long flags; =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); + guard(uart_port_lock_irqsave)(port); =20 - uart_port_lock_irqsave(port, &flags); if (!serial8250_tx_dma_running(up) && uart_lsr_tx_empty(serial_lsr_in(up)= )) - result =3D TIOCSER_TEMT; - uart_port_unlock_irqrestore(port, flags); - - serial8250_rpm_put(up); + return TIOCSER_TEMT; =20 - return result; + return 0; } =20 unsigned int serial8250_do_get_mctrl(struct uart_port *port) @@ -1909,9 +1887,8 @@ unsigned int serial8250_do_get_mctrl(struct uart_port= *port) unsigned int status; unsigned int val; =20 - serial8250_rpm_get(up); - status =3D serial8250_modem_status(up); - serial8250_rpm_put(up); + scoped_guard(serial8250_rpm, up) + status =3D serial8250_modem_status(up); =20 val =3D serial8250_MSR_to_TIOCM(status); if (up->gpios) @@ -1955,17 +1932,15 @@ static void serial8250_set_mctrl(struct uart_port *= port, unsigned int mctrl) static void serial8250_break_ctl(struct uart_port *port, int break_state) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; =20 - serial8250_rpm_get(up); - uart_port_lock_irqsave(port, &flags); + guard(serial8250_rpm)(up); + guard(uart_port_lock_irqsave)(port); + if (break_state =3D=3D -1) up->lcr |=3D UART_LCR_SBC; else up->lcr &=3D ~UART_LCR_SBC; serial_port_out(port, UART_LCR, up->lcr); - uart_port_unlock_irqrestore(port, flags); - serial8250_rpm_put(up); } =20 /* Returns true if @bits were set, false on timeout */ @@ -2025,22 +2000,15 @@ static void wait_for_xmitr(struct uart_8250_port *u= p, int bits) static int serial8250_get_poll_char(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); - int status; u16 lsr; =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); =20 lsr =3D serial_port_in(port, UART_LSR); + if (!(lsr & UART_LSR_DR)) + return NO_POLL_CHAR; =20 - if (!(lsr & UART_LSR_DR)) { - status =3D NO_POLL_CHAR; - goto out; - } - - status =3D serial_port_in(port, UART_RX); -out: - serial8250_rpm_put(up); - return status; + return serial_port_in(port, UART_RX); } =20 =20 @@ -2058,7 +2026,7 @@ static void serial8250_put_poll_char(struct uart_port= *port, * should allow safe lockless usage here. */ =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); /* * First save the IER then disable the interrupts */ @@ -2077,7 +2045,6 @@ static void serial8250_put_poll_char(struct uart_port= *port, */ wait_for_xmitr(up, UART_LSR_BOTH_EMPTY); serial_port_out(port, UART_IER, ier); - serial8250_rpm_put(up); } =20 #endif /* CONFIG_CONSOLE_POLL */ @@ -2085,16 +2052,15 @@ static void serial8250_put_poll_char(struct uart_po= rt *port, static void serial8250_startup_special(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; =20 switch (port->type) { - case PORT_16C950: + case PORT_16C950: { /* * Wake up and initialize UART * * Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); up->acr =3D 0; serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); serial_port_out(port, UART_EFR, UART_EFR_ECB); @@ -2104,18 +2070,18 @@ static void serial8250_startup_special(struct uart_= port *port) serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); serial_port_out(port, UART_EFR, UART_EFR_ECB); serial_port_out(port, UART_LCR, 0); - uart_port_unlock_irqrestore(port, flags); break; + } case PORT_DA830: /* * Reset the port * * Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(port, &flags); - serial_port_out(port, UART_IER, 0); - serial_port_out(port, UART_DA830_PWREMU_MGMT, 0); - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) { + serial_port_out(port, UART_IER, 0); + serial_port_out(port, UART_DA830_PWREMU_MGMT, 0); + } mdelay(10); =20 /* Enable Tx, Rx and free run mode */ @@ -2173,7 +2139,6 @@ static void serial8250_set_TRG_levels(struct uart_por= t *port) static void serial8250_THRE_test(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; bool iir_noint1, iir_noint2; =20 if (!port->irq) @@ -2193,19 +2158,17 @@ static void serial8250_THRE_test(struct uart_port *= port) * * Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(port, &flags); - - wait_for_xmitr(up, UART_LSR_THRE); - serial_port_out_sync(port, UART_IER, UART_IER_THRI); - udelay(1); /* allow THRE to set */ - iir_noint1 =3D serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; - serial_port_out(port, UART_IER, 0); - serial_port_out_sync(port, UART_IER, UART_IER_THRI); - udelay(1); /* allow a working UART time to re-assert THRE */ - iir_noint2 =3D serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; - serial_port_out(port, UART_IER, 0); - - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) { + wait_for_xmitr(up, UART_LSR_THRE); + serial_port_out_sync(port, UART_IER, UART_IER_THRI); + udelay(1); /* allow THRE to set */ + iir_noint1 =3D serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; + serial_port_out(port, UART_IER, 0); + serial_port_out_sync(port, UART_IER, UART_IER_THRI); + udelay(1); /* allow a working UART time to re-assert THRE */ + iir_noint2 =3D serial_port_in(port, UART_IIR) & UART_IIR_NO_INT; + serial_port_out(port, UART_IER, 0); + } =20 if (port->irqflags & IRQF_SHARED) enable_irq(port->irq); @@ -2269,14 +2232,11 @@ static void serial8250_iir_txen_test(struct uart_po= rt *port) =20 static void serial8250_initialize(struct uart_port *port) { - unsigned long flags; - - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); serial_port_out(port, UART_LCR, UART_LCR_WLEN8); =20 serial8250_init_mctrl(port); serial8250_iir_txen_test(port); - uart_port_unlock_irqrestore(port, flags); } =20 int serial8250_do_startup(struct uart_port *port) @@ -2295,7 +2255,7 @@ int serial8250_do_startup(struct uart_port *port) if (port->iotype !=3D up->cur_iotype) set_io_from_upio(port); =20 - serial8250_rpm_get(up); + guard(serial8250_rpm)(up); =20 serial8250_startup_special(port); =20 @@ -2315,8 +2275,7 @@ int serial8250_do_startup(struct uart_port *port) if (!(port->flags & UPF_BUGGY_UART) && (serial_port_in(port, UART_LSR) =3D=3D 0xff)) { dev_info_ratelimited(port->dev, "LSR safety check engaged!\n"); - retval =3D -ENODEV; - goto out; + return -ENODEV; } =20 serial8250_set_TRG_levels(port); @@ -2327,7 +2286,7 @@ int serial8250_do_startup(struct uart_port *port) =20 retval =3D up->ops->setup_irq(up); if (retval) - goto out; + return retval; =20 serial8250_THRE_test(port); =20 @@ -2376,10 +2335,8 @@ int serial8250_do_startup(struct uart_port *port) outb_p(0x80, icp); inb_p(icp); } - retval =3D 0; -out: - serial8250_rpm_put(up); - return retval; + + return 0; } EXPORT_SYMBOL_GPL(serial8250_do_startup); =20 @@ -2393,7 +2350,6 @@ static int serial8250_startup(struct uart_port *port) void serial8250_do_shutdown(struct uart_port *port) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; =20 serial8250_rpm_get(up); /* @@ -2401,26 +2357,26 @@ void serial8250_do_shutdown(struct uart_port *port) * * Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(port, &flags); - up->ier =3D 0; - serial_port_out(port, UART_IER, 0); - uart_port_unlock_irqrestore(port, flags); + scoped_guard(uart_port_lock_irqsave, port) { + up->ier =3D 0; + serial_port_out(port, UART_IER, 0); + } =20 synchronize_irq(port->irq); =20 if (up->dma) serial8250_release_dma(up); =20 - uart_port_lock_irqsave(port, &flags); - if (port->flags & UPF_FOURPORT) { - /* reset interrupts on the AST Fourport board */ - inb((port->iobase & 0xfe0) | 0x1f); - port->mctrl |=3D TIOCM_OUT1; - } else - port->mctrl &=3D ~TIOCM_OUT2; + scoped_guard(uart_port_lock_irqsave, port) { + if (port->flags & UPF_FOURPORT) { + /* reset interrupts on the AST Fourport board */ + inb((port->iobase & 0xfe0) | 0x1f); + port->mctrl |=3D TIOCM_OUT1; + } else + port->mctrl &=3D ~TIOCM_OUT2; =20 - serial8250_set_mctrl(port, port->mctrl); - uart_port_unlock_irqrestore(port, flags); + serial8250_set_mctrl(port, port->mctrl); + } =20 /* * Disable break condition and FIFOs @@ -2612,33 +2568,27 @@ static unsigned int serial8250_get_baud_rate(struct= uart_port *port, void serial8250_update_uartclk(struct uart_port *port, unsigned int uartcl= k) { struct tty_port *tport =3D &port->state->port; - struct tty_struct *tty; =20 - tty =3D tty_port_tty_get(tport); - if (!tty) { - mutex_lock(&tport->mutex); - port->uartclk =3D uartclk; - mutex_unlock(&tport->mutex); - return; - } + scoped_guard(tty_port_tty, tport) { + struct tty_struct *tty =3D scoped_tty(); =20 - down_write(&tty->termios_rwsem); - mutex_lock(&tport->mutex); + guard(rwsem_write)(&tty->termios_rwsem); + guard(mutex)(&tport->mutex); =20 - if (port->uartclk =3D=3D uartclk) - goto out_unlock; + if (port->uartclk =3D=3D uartclk) + return; =20 - port->uartclk =3D uartclk; + port->uartclk =3D uartclk; =20 - if (!tty_port_initialized(tport)) - goto out_unlock; + if (!tty_port_initialized(tport)) + return; =20 - serial8250_do_set_termios(port, &tty->termios, NULL); + serial8250_do_set_termios(port, &tty->termios, NULL); =20 -out_unlock: - mutex_unlock(&tport->mutex); - up_write(&tty->termios_rwsem); - tty_kref_put(tty); + return; + } + guard(mutex)(&tport->mutex); + port->uartclk =3D uartclk; } EXPORT_SYMBOL_GPL(serial8250_update_uartclk); =20 @@ -2793,7 +2743,6 @@ serial8250_do_set_termios(struct uart_port *port, str= uct ktermios *termios, const struct ktermios *old) { struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; unsigned int baud, quot, frac =3D 0; u8 lcr; =20 @@ -2803,27 +2752,24 @@ serial8250_do_set_termios(struct uart_port *port, s= truct ktermios *termios, quot =3D serial8250_get_divisor(port, baud, &frac); =20 /* - * Ok, we're now changing the port state. Do it with - * interrupts disabled. + * Ok, we're now changing the port state. Do it with interrupts disabled. * * Synchronize UART_IER access against the console. */ - serial8250_rpm_get(up); - uart_port_lock_irqsave(port, &flags); - - up->lcr =3D lcr; - serial8250_set_trigger_for_slow_speed(port, termios, baud); - serial8250_set_afe(port, termios); - uart_update_timeout(port, termios->c_cflag, baud); - serial8250_set_errors_and_ignores(port, termios); - serial8250_set_ier(port, termios); - serial8250_set_efr(port, termios); - serial8250_set_divisor(port, baud, quot, frac); - serial8250_set_fcr(port, termios); - serial8250_set_mctrl(port, port->mctrl); + scoped_guard(serial8250_rpm, up) { + guard(uart_port_lock_irqsave)(port); =20 - uart_port_unlock_irqrestore(port, flags); - serial8250_rpm_put(up); + up->lcr =3D lcr; + serial8250_set_trigger_for_slow_speed(port, termios, baud); + serial8250_set_afe(port, termios); + uart_update_timeout(port, termios->c_cflag, baud); + serial8250_set_errors_and_ignores(port, termios); + serial8250_set_ier(port, termios); + serial8250_set_efr(port, termios); + serial8250_set_divisor(port, baud, quot, frac); + serial8250_set_fcr(port, termios); + serial8250_set_mctrl(port, port->mctrl); + } =20 /* Don't rewrite B0 */ if (tty_termios_baud_rate(termios)) @@ -2845,15 +2791,13 @@ void serial8250_do_set_ldisc(struct uart_port *port= , struct ktermios *termios) { if (termios->c_line =3D=3D N_PPS) { port->flags |=3D UPF_HARDPPS_CD; - uart_port_lock_irq(port); + guard(uart_port_lock_irq)(port); serial8250_enable_ms(port); - uart_port_unlock_irq(port); } else { port->flags &=3D ~UPF_HARDPPS_CD; if (!UART_ENABLE_MS(port, termios->c_cflag)) { - uart_port_lock_irq(port); + guard(uart_port_lock_irq)(port); serial8250_disable_ms(port); - uart_port_unlock_irq(port); } } } --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 5E239265CCD; Thu, 14 Aug 2025 07:25:14 +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=1755156315; cv=none; b=bfT1hpZ1azhyD+u1etFJx3Pf6m3Ctfk4JcnvcHUVwt2W0aBPjDoAI3Qwy65ZSEQuWRlQtArU02HFgobVhbR/gh6/DA4ezVQY17TNIwwuVBQBW7OP+76VFCt8RcFEckMqWcIFWRkN9m6XckxNITB/K7TyxMOXg+Ht8l0U8CzFT/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156315; c=relaxed/simple; bh=KLx6NVm+RmsxH/8u32u5hO7DHm5qurcEHVq9Jk6noOg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q7wfkhSSN2P3KbsktUZ8N901+7PhvwhDWFIgRwg4NKtDWukNmQz5nG1Wd8MWX8etk4gNXlOjzrtjXl9YD1RbUTHcbx7t90tCT/Zs7rO7z3AnwGILJnLcw9XspjwzyL/nEs71AsCgIM+qK+CtvlMvvwFq1ECiy1meMBqlbSaj/ks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oFrrccDj; 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="oFrrccDj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BE3D3C4CEF4; Thu, 14 Aug 2025 07:25:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156314; bh=KLx6NVm+RmsxH/8u32u5hO7DHm5qurcEHVq9Jk6noOg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oFrrccDjAgCxWNWxnqt5H6NjAflfYZwFw14K7QjljioU3ldS1RB7CH+L4iw3aCDsu Go4QTKSgfIypvnl0BJUObgcM5gUhChu2t4/G4fogllAuwZ7vIHtaCDlhcl1WboGiuG 5F5Z9qRgTKt0pm7tHns35NTvEL1Jqa2fpz8kc9lNlrHy/+zLzepoNxz5sKlaaRuo2H tI4n3xXJi7xjfOYqiFL3l14MNtVMrT0kVZ1cBani5qvbebjb1ETqyUpvxvg4eC1ySi I8Fsu50tdiHnsQf1PAKSb/zGFruxxcfxSzkBLrlUk1z5Jg1E1fMBoA/sVu2KT9kk0R n895xjgLbZHdA== 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/16] serial: 8250_core: use guard() in serial_unlink_irq_chain() Date: Thu, 14 Aug 2025 09:24:50 +0200 Message-ID: <20250814072456.182853-11-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the 8250 code. This improves readability, makes error handling easier, and marks locked portions of code explicit. serial_unlink_irq_chain() is done separately here because with the guard() used, those BUG_ON()s can be switched WARN_ON()s as we can actually handle the conditions and return (despite something went really wrong). Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250_core.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/= 8250_core.c index 82c3636451e5..7d931693b311 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -178,20 +178,22 @@ static void serial_unlink_irq_chain(struct uart_8250_= port *up) { struct irq_info *i; =20 - mutex_lock(&hash_mutex); + guard(mutex)(&hash_mutex); =20 hash_for_each_possible(irq_lists, i, node, up->port.irq) - if (i->irq =3D=3D up->port.irq) - break; + if (i->irq =3D=3D up->port.irq) { + if (WARN_ON(i->head =3D=3D NULL)) + return; =20 - BUG_ON(i =3D=3D NULL); - BUG_ON(i->head =3D=3D NULL); + if (list_empty(i->head)) + free_irq(up->port.irq, i); =20 - if (list_empty(i->head)) - free_irq(up->port.irq, i); + serial_do_unlink(i, up); + + return; + } =20 - serial_do_unlink(i, up); - mutex_unlock(&hash_mutex); + WARN_ON(1); } =20 /* --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 B89D52750FA; Thu, 14 Aug 2025 07:25:16 +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=1755156316; cv=none; b=Au1OP26TKi7dicjvuCciYceOOlng+27Hc1XvbrI+b3Uiyp7inUzKuz5xTU7ixy0vjkZziWXj50DY7Xrq6xCPoABYtgZ9XI4qGmaBPhRDgxnNm9KlSQtKOpAGoI+1WL9ZZoYsKvyi0RrejKh9fzNs2Ji0dYDpJBAVxA/TUfr/jgs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156316; c=relaxed/simple; bh=JSvmbsUXGxQiTPTUgF6Q+ZmZQGZx3+bOh4O8C4iliTU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cvdb+bimS0B36uldGEF+6Zv0isR7xdVTEPr8vg0D+jPwn6z9vCGNwdjERrZC8BvweJxU6c/n3M0w6jY36NIS5p4rrt9/oS6c4KcJAXGXd/JBgjGpmk38NcPnv+K5vbTMg6Uzs8tSKVrP3TtA2W/TlwjHRV8VJd4D6Ovy61vrHAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nd2YzL67; 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="nd2YzL67" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4875FC4CEF5; Thu, 14 Aug 2025 07:25:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156316; bh=JSvmbsUXGxQiTPTUgF6Q+ZmZQGZx3+bOh4O8C4iliTU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nd2YzL67n28YT/6+mamTPxBHBP9aLRRqmHqAcWBiis92HlxBs9RJzggEusDFoFQ3Q XCEcHGIAsO0AgQjLqtI+k0mm0oz03rKewfZtzUukEgZAv1ObTAmwzZj4ISPqxk2J6P JSF+tlZGHrQgjnOoxaGS2gH+pBbNflwsMok8g+LHc2f/QviOCG6utTKsWCr8Z2mjTc uy/NHt/2EJ5Py8EF3gfFxYkuh5anwjmcTt1Z5HxML5ZjdfSCl3x+1rdeGMySHaBJZD GLIeLi67z5w2ppPFzFqCSlcfsGtB7zFX56Dez5vYH1fG03c5aY5NLBKMhmhGSkZuml Ke5bFHabHuAPg== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 11/16] serial: 8250_omap: extract omap_8250_set_termios_atomic() Date: Thu, 14 Aug 2025 09:24:51 +0200 Message-ID: <20250814072456.182853-12-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" To use guard()s easily in omap_8250_set_termios(), split it into atomic and non-atomic part. The former can be easily guarded -- without a need of indenting or moving code. omap_8250_set_termios() would likely profit from a cleanup similar to one in serial8250_do_set_termios() in commit cdc4a3e0b235 ("serial: 8250: extract serial8250_set_fcr()") and earlier. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250_omap.c | 39 ++++++++++++++++++----------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/= 8250_omap.c index 6707f55bdbe7..ba03955fdc6e 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -369,18 +369,12 @@ static void omap8250_restore_regs(struct uart_8250_po= rt *up) serial8250_em485_stop_tx(up, true); } =20 -/* - * OMAP can use "CLK / (16 or 13) / div" for baud rate. And then we have h= ave - * some differences in how we want to handle flow control. - */ -static void omap_8250_set_termios(struct uart_port *port, - struct ktermios *termios, - const struct ktermios *old) +static void omap_8250_set_termios_atomic(struct uart_port *port, struct kt= ermios *termios, + const struct ktermios *old, unsigned int baud) { struct uart_8250_port *up =3D up_to_u8250p(port); struct omap8250_priv *priv =3D port->private_data; - unsigned char cval =3D 0; - unsigned int baud; + u8 cval; =20 cval =3D UART_LCR_WLEN(tty_get_char_size(termios->c_cflag)); =20 @@ -393,12 +387,6 @@ static void omap_8250_set_termios(struct uart_port *po= rt, if (termios->c_cflag & CMSPAR) cval |=3D UART_LCR_SPAR; =20 - /* - * Ask the core to calculate the divisor for us. - */ - baud =3D uart_get_baud_rate(port, termios, old, - port->uartclk / 16 / UART_DIV_MAX, - port->uartclk / 13); omap_8250_get_divisor(port, baud, priv); =20 /* @@ -518,6 +506,27 @@ static void omap_8250_set_termios(struct uart_port *po= rt, uart_port_unlock_irq(&up->port); pm_runtime_mark_last_busy(port->dev); pm_runtime_put_autosuspend(port->dev); +} + +/* + * OMAP can use "CLK / (16 or 13) / div" for baud rate. And then we have h= ave + * some differences in how we want to handle flow control. + */ +static void omap_8250_set_termios(struct uart_port *port, + struct ktermios *termios, + const struct ktermios *old) +{ + struct omap8250_priv *priv =3D port->private_data; + unsigned int baud; + + /* + * Ask the core to calculate the divisor for us. + */ + baud =3D uart_get_baud_rate(port, termios, old, + port->uartclk / 16 / UART_DIV_MAX, + port->uartclk / 13); + + omap_8250_set_termios_atomic(port, termios, old, baud); =20 /* calculate wakeup latency constraint */ priv->calc_latency =3D USEC_PER_SEC * 64 * 8 / baud; --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 01B9F27701C; Thu, 14 Aug 2025 07:25:17 +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=1755156318; cv=none; b=mP5TiUkaryXXWG9Ke8dB+x1j6miBnxn9V5OuW627a5/DimIKdDPz3PX3i4TZscXzbaW+s9EShq5Bw/EYdEwMmdfptDgb9M+774kgVNomRTKcO5V2UkCNJbErtGAplVZ0CwuQWnvJQ4iYJ35Bq5x5v0Mnh/XwdW/0VtZuAoepV9I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156318; c=relaxed/simple; bh=qMJKQ8KFbQ1Yr99KHpbe0q7I6w90iEVuwbGYK6zXnV8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pycySnqeUFqfImY2TLy5oGIYu1O+JNg86z33BzSonnxbj/17SXugeVIuoYrypjNHTR15Z62fQ9NsYnP2wrZlskpNAxGKcR3l+wNViJyeg80OlWu2xPZCWZ2A6VNr50pcfn34oa13fjvMm3ib5zCqKXMlo/ndTCaNBNgXu5cCEAk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WdCp06fb; 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="WdCp06fb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C5CC9C4CEEF; Thu, 14 Aug 2025 07:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156317; bh=qMJKQ8KFbQ1Yr99KHpbe0q7I6w90iEVuwbGYK6zXnV8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WdCp06fbgXYMbkmAuX1Du/0jC184GYoZQKQejQFShe8POxZBfSPiMLhWO6/473kLJ UE2HeUkX/gIS2ns0EzwcXzmEaUIOdOajhd0CZcfur98siSkFEKtaZDEd/0oCRazKKe Fdw5nfwzTuk0q9USuhi+jb8qojbsdhvlYGFJQ3FMVz1Cf57hoH+XodAH8rpp4nQD+M by5lr9Z31esc4H6TMZZBBuGFeI4of/W6oi0rfj5ViorGtfYjaBjRJGawrHArKg/vvj gsv6uaV986s0GjeYcUHSQ6hvTnX+l4+lfY69Y2jr3i5vnSi2yzIPqPXvDa0akBVK8/ ImpQAjSvaMcDQ== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 12/16] serial: 8250_omap: use guard()s Date: Thu, 14 Aug 2025 09:24:52 +0200 Message-ID: <20250814072456.182853-13-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the 8250_omap code. This improves readability, makes error handling easier, and marks locked portions of code explicit. For this to work, UART_CAP_RPM has to be set to up->capabilities a bit earlier. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250_omap.c | 108 ++++++++++------------------ 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/= 8250_omap.c index ba03955fdc6e..bb23afdd63f2 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -393,8 +393,8 @@ static void omap_8250_set_termios_atomic(struct uart_po= rt *port, struct ktermios * Ok, we're now changing the port state. Do it with * interrupts disabled. */ - pm_runtime_get_sync(port->dev); - uart_port_lock_irq(port); + guard(serial8250_rpm)(up); + guard(uart_port_lock_irq)(port); =20 /* * Update the per-port timeout. @@ -502,10 +502,6 @@ static void omap_8250_set_termios_atomic(struct uart_p= ort *port, struct ktermios } } omap8250_restore_regs(up); - - uart_port_unlock_irq(&up->port); - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); } =20 /* @@ -546,10 +542,9 @@ static void omap_8250_pm(struct uart_port *port, unsig= ned int state, struct uart_8250_port *up =3D up_to_u8250p(port); u8 efr; =20 - pm_runtime_get_sync(port->dev); - + guard(serial8250_rpm)(up); /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); + guard(uart_port_lock_irq)(port); =20 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); efr =3D serial_in(up, UART_EFR); @@ -560,11 +555,6 @@ static void omap_8250_pm(struct uart_port *port, unsig= ned int state, serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); serial_out(up, UART_EFR, efr); serial_out(up, UART_LCR, 0); - - uart_port_unlock_irq(port); - - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); } =20 static void omap_serial_fill_features_erratas(struct uart_8250_port *up, @@ -736,7 +726,11 @@ static int omap_8250_startup(struct uart_port *port) return ret; } =20 - pm_runtime_get_sync(port->dev); +#ifdef CONFIG_PM + up->capabilities |=3D UART_CAP_RPM; +#endif + + guard(serial8250_rpm)(up); =20 serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); =20 @@ -759,14 +753,10 @@ static int omap_8250_startup(struct uart_port *port) } =20 /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); - up->ier =3D UART_IER_RLSI | UART_IER_RDI; - serial_out(up, UART_IER, up->ier); - uart_port_unlock_irq(port); - -#ifdef CONFIG_PM - up->capabilities |=3D UART_CAP_RPM; -#endif + scoped_guard(uart_port_lock_irq, port) { + up->ier =3D UART_IER_RLSI | UART_IER_RDI; + serial_out(up, UART_IER, up->ier); + } =20 /* Enable module level wake up */ priv->wer =3D OMAP_UART_WER_MOD_WKUP; @@ -775,15 +765,12 @@ static int omap_8250_startup(struct uart_port *port) serial_out(up, UART_OMAP_WER, priv->wer); =20 if (up->dma && !(priv->habit & UART_HAS_EFR2)) { - uart_port_lock_irq(port); + guard(uart_port_lock_irq)(port); up->dma->rx_dma(up); - uart_port_unlock_irq(port); } =20 enable_irq(port->irq); =20 - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); return 0; } =20 @@ -792,7 +779,7 @@ static void omap_8250_shutdown(struct uart_port *port) struct uart_8250_port *up =3D up_to_u8250p(port); struct omap8250_priv *priv =3D port->private_data; =20 - pm_runtime_get_sync(port->dev); + guard(serial8250_rpm)(up); =20 flush_work(&priv->qos_work); if (up->dma) @@ -803,10 +790,11 @@ static void omap_8250_shutdown(struct uart_port *port) serial_out(up, UART_OMAP_EFR2, 0x0); =20 /* Synchronize UART_IER access against the console. */ - uart_port_lock_irq(port); - up->ier =3D 0; - serial_out(up, UART_IER, 0); - uart_port_unlock_irq(port); + scoped_guard(uart_port_lock_irq, port) { + up->ier =3D 0; + serial_out(up, UART_IER, 0); + } + disable_irq_nosync(port->irq); dev_pm_clear_wake_irq(port->dev); =20 @@ -819,46 +807,33 @@ static void omap_8250_shutdown(struct uart_port *port) if (up->lcr & UART_LCR_SBC) serial_out(up, UART_LCR, up->lcr & ~UART_LCR_SBC); serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); - - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); } =20 static void omap_8250_throttle(struct uart_port *port) { struct omap8250_priv *priv =3D port->private_data; - unsigned long flags; =20 - pm_runtime_get_sync(port->dev); + guard(serial8250_rpm)(up_to_u8250p(port)); + guard(uart_port_lock_irqsave)(port); =20 - uart_port_lock_irqsave(port, &flags); port->ops->stop_rx(port); priv->throttled =3D true; - uart_port_unlock_irqrestore(port, flags); - - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); } =20 static void omap_8250_unthrottle(struct uart_port *port) { struct omap8250_priv *priv =3D port->private_data; struct uart_8250_port *up =3D up_to_u8250p(port); - unsigned long flags; - - pm_runtime_get_sync(port->dev); =20 + guard(serial8250_rpm)(up); /* Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(port, &flags); + guard(uart_port_lock_irqsave)(port); + priv->throttled =3D false; if (up->dma) up->dma->rx_dma(up); up->ier |=3D UART_IER_RLSI | UART_IER_RDI; serial_out(up, UART_IER, up->ier); - uart_port_unlock_irqrestore(port, flags); - - pm_runtime_mark_last_busy(port->dev); - pm_runtime_put_autosuspend(port->dev); } =20 static int omap8250_rs485_config(struct uart_port *port, @@ -996,30 +971,26 @@ static void __dma_rx_complete(void *param) struct omap8250_priv *priv =3D p->port.private_data; struct uart_8250_dma *dma =3D p->dma; struct dma_tx_state state; - unsigned long flags; =20 /* Synchronize UART_IER access against the console. */ - uart_port_lock_irqsave(&p->port, &flags); + guard(uart_port_lock_irqsave)(&p->port); =20 /* * If the tx status is not DMA_COMPLETE, then this is a delayed * completion callback. A previous RX timeout flush would have * already pushed the data, so exit. */ - if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) !=3D - DMA_COMPLETE) { - uart_port_unlock_irqrestore(&p->port, flags); + if (dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state) !=3D DMA_COM= PLETE) return; - } + __dma_rx_do_complete(p); - if (!priv->throttled) { - p->ier |=3D UART_IER_RLSI | UART_IER_RDI; - serial_out(p, UART_IER, p->ier); - if (!(priv->habit & UART_HAS_EFR2)) - omap_8250_rx_dma(p); - } + if (priv->throttled) + return; =20 - uart_port_unlock_irqrestore(&p->port, flags); + p->ier |=3D UART_IER_RLSI | UART_IER_RDI; + serial_out(p, UART_IER, p->ier); + if (!(priv->habit & UART_HAS_EFR2)) + omap_8250_rx_dma(p); } =20 static void omap_8250_rx_dma_flush(struct uart_8250_port *p) @@ -1117,14 +1088,13 @@ static void omap_8250_dma_tx_complete(void *param) struct uart_8250_port *p =3D param; struct uart_8250_dma *dma =3D p->dma; struct tty_port *tport =3D &p->port.state->port; - unsigned long flags; bool en_thri =3D false; struct omap8250_priv *priv =3D p->port.private_data; =20 dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, UART_XMIT_SIZE, DMA_TO_DEVICE); =20 - uart_port_lock_irqsave(&p->port, &flags); + guard(uart_port_lock_irqsave)(&p->port); =20 dma->tx_running =3D 0; =20 @@ -1152,8 +1122,6 @@ static void omap_8250_dma_tx_complete(void *param) dma->tx_err =3D 1; serial8250_set_THRI(p); } - - uart_port_unlock_irqrestore(&p->port, flags); } =20 static int omap_8250_tx_dma(struct uart_8250_port *p) @@ -1804,15 +1772,13 @@ static int omap8250_runtime_resume(struct device *d= ev) up =3D serial8250_get_port(priv->line); =20 if (up && omap8250_lost_context(up)) { - uart_port_lock_irq(&up->port); + guard(uart_port_lock_irq)(&up->port); omap8250_restore_regs(up); - uart_port_unlock_irq(&up->port); } =20 if (up && up->dma && up->dma->rxchan && !(priv->habit & UART_HAS_EFR2)) { - uart_port_lock_irq(&up->port); + guard(uart_port_lock_irq)(&up->port); omap_8250_rx_dma(up); - uart_port_unlock_irq(&up->port); } =20 atomic_set(&priv->active, 1); --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 DF217278E7E; Thu, 14 Aug 2025 07:25:19 +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=1755156320; cv=none; b=YZepQD6OmnySSVHSWYZ2uH56lCnXWVj3mHFNRmX1QvJJRQVZih62lyRvtnLjCraISJyDEuMe3WAGEGEdTr4/e2B7CeuMeP8IOZfgtrnrN4QwtWJpmmr/JseHfBxEDMg5wAk4JQiOjJfFe95FH/xw72wn1X7YsyVS8GE9+xPID0Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156320; c=relaxed/simple; bh=NEHsKObM4N+Xdy4uolnpMm7tU8yioXLoHI5CmmvF+eo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sxwLEW3Hd8Jg+xriX6EyHouZFNJu3JZ4vxIM8Q71L2R2Iz8+SbpsqKPbFcN0aDMdt0b4VhziM8dZPN1tHGlq2aMmhnfNaFGbbhKY35q4ZKVmmJ2BlUmUnKILae2DSv/qqqfjLLy88+XE4LTEC1zUHeNLiC8K8D3UVjNGi1iHGzM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DOgdLyZi; 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="DOgdLyZi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4F8D9C4CEEF; Thu, 14 Aug 2025 07:25:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156319; bh=NEHsKObM4N+Xdy4uolnpMm7tU8yioXLoHI5CmmvF+eo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DOgdLyZiOW0TEFUBmwYmvkxP3aOSQp6OjC4oMb5N6wixb9gtz1QQOM5+RQ1i2JC8b BmMCu9UAe+NRRgxIu53Wta8JlYOP0P4eDHyFZElfnVeKR3C8XNo6xEdj+yORBM5PrW RglrdEaSw8fZ6PKtkkR2+llL7CtpILfoNBY7tCTYAmNnCM/S1WfgDJ0hyMFbELJhAx PhdUVTO+OHUNz3Rd3AHe/NJTOosNRRktEccFPNVCUElCdewf+yGR8nLEwAU/vw2d/h zNhoT5+RQ7zYkKz4EqSiMqheLHlBn1B0wElPEwNRwRRvKhPAvk2/1PIBKetMsz1Ld+ 6VuoTrZvZ8XGw== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 13/16] serial: 8250_rsa: use guard()s Date: Thu, 14 Aug 2025 09:24:53 +0200 Message-ID: <20250814072456.182853-14-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the 8250_rsa code. This improves readability, makes error handling easier, and marks locked portions of code explicit. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/serial/8250/8250_rsa.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_rsa.c b/drivers/tty/serial/8250/8= 250_rsa.c index d34093cc03ad..ff52ad02f6be 100644 --- a/drivers/tty/serial/8250/8250_rsa.c +++ b/drivers/tty/serial/8250/8250_rsa.c @@ -140,9 +140,8 @@ void rsa_enable(struct uart_8250_port *up) return; =20 if (up->port.uartclk !=3D SERIAL_RSA_BAUD_BASE * 16) { - uart_port_lock_irq(&up->port); + guard(uart_port_lock_irq)(&up->port); __rsa_enable(up); - uart_port_unlock_irq(&up->port); } if (up->port.uartclk =3D=3D SERIAL_RSA_BAUD_BASE * 16) serial_out(up, UART_RSA_FRR, 0); @@ -165,7 +164,8 @@ void rsa_disable(struct uart_8250_port *up) if (up->port.uartclk !=3D SERIAL_RSA_BAUD_BASE * 16) return; =20 - uart_port_lock_irq(&up->port); + guard(uart_port_lock_irq)(&up->port); + mode =3D serial_in(up, UART_RSA_MSR); result =3D !(mode & UART_RSA_MSR_FIFO); =20 @@ -177,7 +177,6 @@ void rsa_disable(struct uart_8250_port *up) =20 if (result) up->port.uartclk =3D SERIAL_RSA_BAUD_BASE_LO * 16; - uart_port_unlock_irq(&up->port); } EXPORT_SYMBOL_GPL_FOR_MODULES(rsa_disable, "8250_base"); =20 --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 5A2072798E1; Thu, 14 Aug 2025 07:25:21 +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=1755156321; cv=none; b=FlmYv3LtqgvTMGKOjAiOP55tc61N6EOch93ntBHHOL5NisDWvLBd3vtgwp6OK8ABlUcmwxN4MNLVQRFtdddnCgC/nSLMqQdtwcKgqezQi9WXzZItissI/TbHxjSp9jq2vTi0qKpO7tYGcghWwZtDvmJ8E+Cba6eBtjsQzULK6mA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156321; c=relaxed/simple; bh=ikP8D9+lVXMFYOcdbTvUdAH0C7+FbtOqJ0QHfm3h56s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fFw2+nb9+996aSZ7ObZbtEGkZrt3ny5iT6qAYdAeb9lQd+4KcXxiPxOjrBjAMRVWJvjgSWXvG5gLEl2+kgVF+cZNpmq6y8NBLNOdVjinHD2Nu/uOkT96UvKnt/FbeK7KrrxjF+mGztTohvqAqZmnAQSgRBg/AUi/dKDXt3N2hZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lx+X+Zco; 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="lx+X+Zco" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CCD36C4CEF4; Thu, 14 Aug 2025 07:25:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156320; bh=ikP8D9+lVXMFYOcdbTvUdAH0C7+FbtOqJ0QHfm3h56s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lx+X+ZcoYMK4SRF+LjGdMB2nmlbx0kSbYgyVH4F+b/iC/ThhKYft87mpMZFg+SY5d 3kh3HNA9eEkARzCA+lYhFwTRZ0oDRXEnJidte6LAIo+AMsIAqpVe5nm0VcNPBMDpbG VtRS5crBZYc3+JhDyb7QhPL6AE7/kJmRrFhaydSOGqfSfoV9zFVYYw3QiE0C6gIE4T P1XMIdkjDIfsGQbrTJg51rKHdANqyhPMG85CTBah7Xd8zJ6N0k38oZla5gVeAwvjKt AQUCKwvDearKpyH4DEQlY6OysbzhUlL8GxZmmAPS81Jzgb6WV7HkhoIMfBEQCMgIRB v6LhTFExkZYWw== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 14/16] tty/vt: use guard()s in con_font_set/get() and con_{set,get}_unimap() Date: Thu, 14 Aug 2025 09:24:54 +0200 Message-ID: <20250814072456.182853-15-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the 8250_rsa code. This improves readability, makes error handling easier, and marks locked portions of code explicit. The new __free()-annotated declarations are moved to the allocation points as is preferred: https://lore.kernel.org/all/CAHk-=3Dwjvh_LUpa=3D864joG2JJXs3+viO-kLzLidR2JL= yMr4MNwA@mail.gmail.com/ Except font_data in con_font_get(). The scope in there would not match the expected lifetime. But the declaration is moved closer. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/vt/consolemap.c | 84 ++++++++++++++++------------------ drivers/tty/vt/vt.c | 89 +++++++++++++++++-------------------- 2 files changed, 78 insertions(+), 95 deletions(-) diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c index bb4bb272ebec..8eb9d745a868 100644 --- a/drivers/tty/vt/consolemap.c +++ b/drivers/tty/vt/consolemap.c @@ -637,32 +637,28 @@ static struct uni_pagedict *con_unshare_unimap(struct= vc_data *vc, =20 int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *l= ist) { - int err =3D 0, err1; struct uni_pagedict *dict; - struct unipair *unilist, *plist; + struct unipair *plist; + int err =3D 0; =20 if (!ct) return 0; =20 - unilist =3D vmemdup_array_user(list, ct, sizeof(*unilist)); + struct unipair *unilist __free(kvfree) =3D vmemdup_array_user(list, ct, s= izeof(*unilist)); if (IS_ERR(unilist)) return PTR_ERR(unilist); =20 - console_lock(); + guard(console_lock)(); =20 /* Save original vc_unipagdir_loc in case we allocate a new one */ dict =3D *vc->uni_pagedict_loc; - if (!dict) { - err =3D -EINVAL; - goto out_unlock; - } + if (!dict) + return -EINVAL; =20 if (dict->refcount > 1) { dict =3D con_unshare_unimap(vc, dict); - if (IS_ERR(dict)) { - err =3D PTR_ERR(dict); - goto out_unlock; - } + if (IS_ERR(dict)) + return PTR_ERR(dict); } else if (dict =3D=3D dflt) { dflt =3D NULL; } @@ -671,7 +667,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struc= t unipair __user *list) * Insert user specified unicode pairs into new table. */ for (plist =3D unilist; ct; ct--, plist++) { - err1 =3D con_insert_unipair(dict, plist->unicode, plist->fontpos); + int err1 =3D con_insert_unipair(dict, plist->unicode, plist->fontpos); if (err1) err =3D err1; } @@ -680,15 +676,12 @@ int con_set_unimap(struct vc_data *vc, ushort ct, str= uct unipair __user *list) * Merge with fontmaps of any other virtual consoles. */ if (con_unify_unimap(vc, dict)) - goto out_unlock; + return err; =20 for (enum translation_map m =3D FIRST_MAP; m <=3D LAST_MAP; m++) set_inverse_transl(vc, dict, m); set_inverse_trans_unicode(dict); =20 -out_unlock: - console_unlock(); - kvfree(unilist); return err; } =20 @@ -787,50 +780,49 @@ int con_get_unimap(struct vc_data *vc, ushort ct, ush= ort __user *uct, { ushort ect; struct uni_pagedict *dict; - struct unipair *unilist; unsigned int d, r, g; - int ret =3D 0; =20 - unilist =3D kvmalloc_array(ct, sizeof(*unilist), GFP_KERNEL); + struct unipair *unilist __free(kvfree) =3D kvmalloc_array(ct, sizeof(*uni= list), GFP_KERNEL); if (!unilist) return -ENOMEM; =20 - console_lock(); - - ect =3D 0; - dict =3D *vc->uni_pagedict_loc; - if (!dict) - goto unlock; - - for (d =3D 0; d < UNI_DIRS; d++) { - u16 **dir =3D dict->uni_pgdir[d]; - if (!dir) - continue; + scoped_guard(console_lock) { + ect =3D 0; + dict =3D *vc->uni_pagedict_loc; + if (!dict) + break; =20 - for (r =3D 0; r < UNI_DIR_ROWS; r++) { - u16 *row =3D dir[r]; - if (!row) + for (d =3D 0; d < UNI_DIRS; d++) { + u16 **dir =3D dict->uni_pgdir[d]; + if (!dir) continue; =20 - for (g =3D 0; g < UNI_ROW_GLYPHS; g++, row++) { - if (*row >=3D MAX_GLYPH) + for (r =3D 0; r < UNI_DIR_ROWS; r++) { + u16 *row =3D dir[r]; + if (!row) continue; - if (ect < ct) { - unilist[ect].unicode =3D UNI(d, r, g); - unilist[ect].fontpos =3D *row; + + for (g =3D 0; g < UNI_ROW_GLYPHS; g++, row++) { + if (*row >=3D MAX_GLYPH) + continue; + if (ect < ct) { + unilist[ect].unicode =3D UNI(d, r, g); + unilist[ect].fontpos =3D *row; + } + ect++; } - ect++; } } } -unlock: - console_unlock(); + if (copy_to_user(list, unilist, min(ect, ct) * sizeof(*unilist))) - ret =3D -EFAULT; + return -EFAULT; if (put_user(ect, uct)) - ret =3D -EFAULT; - kvfree(unilist); - return ret ? ret : (ect <=3D ct) ? 0 : -ENOMEM; + return -EFAULT; + if (ect > ct) + return -ENOMEM; + + return 0; } =20 /* diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 62049ceb34de..100d6cb26887 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -4801,57 +4801,51 @@ void reset_palette(struct vc_data *vc) static int con_font_get(struct vc_data *vc, struct console_font_op *op) { struct console_font font; - int rc =3D -EINVAL; int c; unsigned int vpitch =3D op->op =3D=3D KD_FONT_OP_GET_TALL ? op->height : = 32; =20 if (vpitch > max_font_height) return -EINVAL; =20 + void *font_data __free(kvfree) =3D NULL; if (op->data) { - font.data =3D kvzalloc(max_font_size, GFP_KERNEL); + font.data =3D font_data =3D kvzalloc(max_font_size, GFP_KERNEL); if (!font.data) return -ENOMEM; } else font.data =3D NULL; =20 - console_lock(); - if (vc->vc_mode !=3D KD_TEXT) - rc =3D -EINVAL; - else if (vc->vc_sw->con_font_get) - rc =3D vc->vc_sw->con_font_get(vc, &font, vpitch); - else - rc =3D -ENOSYS; - console_unlock(); + scoped_guard(console_lock) { + if (vc->vc_mode !=3D KD_TEXT) + return -EINVAL; + if (!vc->vc_sw->con_font_get) + return -ENOSYS; =20 - if (rc) - goto out; + int ret =3D vc->vc_sw->con_font_get(vc, &font, vpitch); + if (ret) + return ret; + } =20 c =3D (font.width+7)/8 * vpitch * font.charcount; =20 if (op->data && font.charcount > op->charcount) - rc =3D -ENOSPC; + return -ENOSPC; if (font.width > op->width || font.height > op->height) - rc =3D -ENOSPC; - if (rc) - goto out; + return -ENOSPC; =20 op->height =3D font.height; op->width =3D font.width; op->charcount =3D font.charcount; =20 if (op->data && copy_to_user(op->data, font.data, c)) - rc =3D -EFAULT; + return -EFAULT; =20 -out: - kvfree(font.data); - return rc; + return 0; } =20 static int con_font_set(struct vc_data *vc, const struct console_font_op *= op) { struct console_font font; - int rc =3D -EINVAL; int size; unsigned int vpitch =3D op->op =3D=3D KD_FONT_OP_SET_TALL ? op->height : = 32; =20 @@ -4870,7 +4864,7 @@ static int con_font_set(struct vc_data *vc, const str= uct console_font_op *op) if (size > max_font_size) return -ENOSPC; =20 - font.data =3D memdup_user(op->data, size); + void *font_data __free(kfree) =3D font.data =3D memdup_user(op->data, siz= e); if (IS_ERR(font.data)) return PTR_ERR(font.data); =20 @@ -4878,18 +4872,17 @@ static int con_font_set(struct vc_data *vc, const s= truct console_font_op *op) font.width =3D op->width; font.height =3D op->height; =20 - console_lock(); + guard(console_lock)(); + if (vc->vc_mode !=3D KD_TEXT) - rc =3D -EINVAL; - else if (vc->vc_sw->con_font_set) { - if (vc_is_sel(vc)) - clear_selection(); - rc =3D vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags); - } else - rc =3D -ENOSYS; - console_unlock(); - kfree(font.data); - return rc; + return -EINVAL; + if (!vc->vc_sw->con_font_set) + return -ENOSYS; + + if (vc_is_sel(vc)) + clear_selection(); + + return vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags); } =20 static int con_font_default(struct vc_data *vc, struct console_font_op *op) @@ -4897,8 +4890,6 @@ static int con_font_default(struct vc_data *vc, struc= t console_font_op *op) struct console_font font =3D {.width =3D op->width, .height =3D op->heigh= t}; char name[MAX_FONT_NAME]; char *s =3D name; - int rc; - =20 if (!op->data) s =3D NULL; @@ -4907,23 +4898,23 @@ static int con_font_default(struct vc_data *vc, str= uct console_font_op *op) else name[MAX_FONT_NAME - 1] =3D 0; =20 - console_lock(); - if (vc->vc_mode !=3D KD_TEXT) { - console_unlock(); - return -EINVAL; - } - if (vc->vc_sw->con_font_default) { + scoped_guard(console_lock) { + if (vc->vc_mode !=3D KD_TEXT) + return -EINVAL; + if (!vc->vc_sw->con_font_default) + return -ENOSYS; + if (vc_is_sel(vc)) clear_selection(); - rc =3D vc->vc_sw->con_font_default(vc, &font, s); - } else - rc =3D -ENOSYS; - console_unlock(); - if (!rc) { - op->width =3D font.width; - op->height =3D font.height; + int ret =3D vc->vc_sw->con_font_default(vc, &font, s); + if (ret) + return ret; } - return rc; + + op->width =3D font.width; + op->height =3D font.height; + + return 0; } =20 int con_font_op(struct vc_data *vc, struct console_font_op *op) --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 19135279DC5; Thu, 14 Aug 2025 07:25:22 +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=1755156324; cv=none; b=J+qL9XRuTzjT7Ton20nAjSXcsHYe8KR+jeoT4zUbK65Kq0h5PhplY37L1FT6Q4eKLLyuT/KQcnyqbtoYlwrOGxbAYJo09QA4Bij4W+kS3/1uOhajJZ8RIQRsbPyvACGhl1+MCR+rp2q7VlRqeDoYN1oDhdBfWknCLCTcgDnblA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156324; c=relaxed/simple; bh=dQnUKMcs6b08ZtMwS1mLWORnFN2eoNfA4YNem+Prk4s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rmB54QEEUqg8xoGNZ6PfiPUxIp/s9vPbXBwbo3TYqvn9FyjEZYWjj8Y4C8kjCnqChcxM4Fak/Kd5pk7227Jl4wcQsAbZ6rXT45SoWls0BjlUJ58JpHE4rg1+xvsXmAAIpWZ24jeMZh02KVUnKu9zBecs7Ddtj2xP2a49PZEu2NA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tES5zydb; 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="tES5zydb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 56A8AC4CEF6; Thu, 14 Aug 2025 07:25:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156322; bh=dQnUKMcs6b08ZtMwS1mLWORnFN2eoNfA4YNem+Prk4s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tES5zydb+44vZrDZntm9PcIrm2c7YXHv+xRi1Y7gMXcSS4t7xEA/z7B2aeXCcU67i m5hQEnRcQRSmB8995uZpKkr3wgVBxZSn/LrNS/0rhcgWPtGUi7s5nuf77/KCiwhNzd Gsdaf0eQozx0Z8n5eetlREejUCwe8xfu7OdpLIyVbuZELpjHrmi9mlkI6PfmFn5EDc IpysvR3NWFdBuMIxiQjNu4iArjSGFd1dVVOATQ0sL2ADLNlytIfeQsCz0754X1RyaC KIT9s0BFkRAWbRLyFH3XPA5E4GuESep2bSkMEeKLSjEtSMPcQoQlfinQcCW1xi3tat uoQjByjcQYkIQ== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" , linux-mm@kvack.org Subject: [PATCH 15/16] tty/vt: use guard()s Date: Thu, 14 Aug 2025 09:24:55 +0200 Message-ID: <20250814072456.182853-16-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having all the new guards, use them in the vt code. This improves readability, makes error handling easier, and marks locked portions of code explicit. A local free_page_ptr __free guard is introduced for __get_free_page/free_page (with proper casts). This could be made public in include/. But I am not sure if there are more possible users, so keeping completely private here. Signed-off-by: Jiri Slaby (SUSE) --- Cc: linux-mm@kvack.org MM fellows, just so you know: Apart from here included (and easy to define) __get_free_page() guard: DEFINE_FREE(free_page_ptr, void *, if (_T) free_page((unsigned long)_T)= ); it also could be extended to __get_free_pages(). But likely the only user which would profit from that one is raid6_select_algo(). And it's not that straighforward. Adding the free_pages guard for reference: struct gfp_holder { union { unsigned long mem; void *ptr; }; unsigned order; }; DEFINE_CLASS(get_free_pages, struct gfp_holder, free_pages(_T.mem, _T.ord= er), { .order =3D order }; t.mem =3D __get_free_pages(gfp, order), gfp_t gfp, unsigned order); #define ___get_free_pages_free(var, what, gfp, order, id) \ CLASS(get_free_pages, id)(gfp, order); \ var =3D id.what #define __get_free_pages_free(var, gfp, order) \ ___get_free_pages_free(var, mem, gfp, order, __UNIQUE_ID(xxx)) #define __get_free_pages_ptr_free(var, gfp, order) \ ___get_free_pages_free(var, ptr, gfp, order, __UNIQUE_ID(xxx)) Use like: __get_free_pages_ptr_free(char *disk_ptr, GFP_KERNEL, RAID6_TEST_DISKS_OR= DER); if (!disk_ptr) return -ENOMEM; disk_ptr[0] =3D 10; --- drivers/tty/vt/consolemap.c | 32 +++--- drivers/tty/vt/selection.c | 20 ++-- drivers/tty/vt/vc_screen.c | 74 ++++++-------- drivers/tty/vt/vt.c | 98 ++++++++----------- drivers/tty/vt/vt_ioctl.c | 190 ++++++++++++++++-------------------- 5 files changed, 170 insertions(+), 244 deletions(-) diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c index 8eb9d745a868..7a11c3f2e875 100644 --- a/drivers/tty/vt/consolemap.c +++ b/drivers/tty/vt/consolemap.c @@ -361,10 +361,10 @@ int con_set_trans_old(unsigned char __user * arg) inbuf[i] =3D UNI_DIRECT_BASE | ch; } =20 - console_lock(); + guard(console_lock)(); memcpy(translations[USER_MAP], inbuf, sizeof(inbuf)); update_user_maps(); - console_unlock(); + return 0; } =20 @@ -374,13 +374,11 @@ int con_get_trans_old(unsigned char __user * arg) unsigned short *p =3D translations[USER_MAP]; unsigned char outbuf[E_TABSZ]; =20 - console_lock(); - for (i =3D 0; i < ARRAY_SIZE(outbuf); i++) - { - ch =3D conv_uni_to_pc(vc_cons[fg_console].d, p[i]); - outbuf[i] =3D (ch & ~0xff) ? 0 : ch; - } - console_unlock(); + scoped_guard(console_lock) + for (i =3D 0; i < ARRAY_SIZE(outbuf); i++) { + ch =3D conv_uni_to_pc(vc_cons[fg_console].d, p[i]); + outbuf[i] =3D (ch & ~0xff) ? 0 : ch; + } =20 return copy_to_user(arg, outbuf, sizeof(outbuf)) ? -EFAULT : 0; } @@ -392,10 +390,10 @@ int con_set_trans_new(ushort __user * arg) if (copy_from_user(inbuf, arg, sizeof(inbuf))) return -EFAULT; =20 - console_lock(); + guard(console_lock)(); memcpy(translations[USER_MAP], inbuf, sizeof(inbuf)); update_user_maps(); - console_unlock(); + return 0; } =20 @@ -403,9 +401,8 @@ int con_get_trans_new(ushort __user * arg) { unsigned short outbuf[E_TABSZ]; =20 - console_lock(); - memcpy(outbuf, translations[USER_MAP], sizeof(outbuf)); - console_unlock(); + scoped_guard(console_lock) + memcpy(outbuf, translations[USER_MAP], sizeof(outbuf)); =20 return copy_to_user(arg, outbuf, sizeof(outbuf)) ? -EFAULT : 0; } @@ -571,11 +568,8 @@ static int con_do_clear_unimap(struct vc_data *vc) =20 int con_clear_unimap(struct vc_data *vc) { - int ret; - console_lock(); - ret =3D con_do_clear_unimap(vc); - console_unlock(); - return ret; + guard(console_lock)(); + return con_do_clear_unimap(vc); } =20 static struct uni_pagedict *con_unshare_unimap(struct vc_data *vc, diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c index 24b0a53e5a79..07d3b93975d3 100644 --- a/drivers/tty/vt/selection.c +++ b/drivers/tty/vt/selection.c @@ -127,9 +127,8 @@ int sel_loadlut(u32 __user *lut) if (copy_from_user(tmplut, lut, sizeof(inwordLut))) return -EFAULT; =20 - console_lock(); + guard(console_lock)(); memcpy(inwordLut, tmplut, sizeof(inwordLut)); - console_unlock(); =20 return 0; } @@ -375,15 +374,9 @@ static int vc_selection(struct vc_data *vc, struct tio= cl_selection *v, =20 int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty) { - int ret; - - mutex_lock(&vc_sel.lock); - console_lock(); - ret =3D vc_selection(vc_cons[fg_console].d, v, tty); - console_unlock(); - mutex_unlock(&vc_sel.lock); - - return ret; + guard(mutex)(&vc_sel.lock); + guard(console_lock)(); + return vc_selection(vc_cons[fg_console].d, v, tty); } EXPORT_SYMBOL_GPL(set_selection_kernel); =20 @@ -409,9 +402,8 @@ int paste_selection(struct tty_struct *tty) const char *bps =3D bp ? bracketed_paste_start : NULL; const char *bpe =3D bp ? bracketed_paste_end : NULL; =20 - console_lock(); - poke_blanked_console(); - console_unlock(); + scoped_guard(console_lock) + poke_blanked_console(); =20 ld =3D tty_ldisc_ref_wait(tty); if (!ld) diff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c index 79b33d998d43..c814644ef4ee 100644 --- a/drivers/tty/vt/vc_screen.c +++ b/drivers/tty/vt/vc_screen.c @@ -53,6 +53,8 @@ #define HEADER_SIZE 4u #define CON_BUF_SIZE (IS_ENABLED(CONFIG_BASE_SMALL) ? 256 : PAGE_SIZE) =20 +DEFINE_FREE(free_page_ptr, void *, if (_T) free_page((unsigned long)_T)); + /* * Our minor space: * @@ -72,7 +74,6 @@ #define use_unicode(inode) (iminor(inode) & 64) #define use_attributes(inode) (iminor(inode) & 128) =20 - struct vcs_poll_data { struct notifier_block notifier; unsigned int cons_num; @@ -231,15 +232,13 @@ static loff_t vcs_lseek(struct file *file, loff_t off= set, int orig) struct vc_data *vc; int size; =20 - console_lock(); - vc =3D vcs_vc(inode, NULL); - if (!vc) { - console_unlock(); - return -ENXIO; - } + scoped_guard(console_lock) { + vc =3D vcs_vc(inode, NULL); + if (!vc) + return -ENXIO; =20 - size =3D vcs_size(vc, use_attributes(inode), use_unicode(inode)); - console_unlock(); + size =3D vcs_size(vc, use_attributes(inode), use_unicode(inode)); + } if (size < 0) return size; return fixed_size_llseek(file, offset, orig, size); @@ -369,11 +368,10 @@ vcs_read(struct file *file, char __user *buf, size_t = count, loff_t *ppos) struct vcs_poll_data *poll; unsigned int read; ssize_t ret; - char *con_buf; loff_t pos; bool viewed, attr, uni_mode; =20 - con_buf =3D (char *) __get_free_page(GFP_KERNEL); + char *con_buf __free(free_page_ptr) =3D (char *)__get_free_page(GFP_KERNE= L); if (!con_buf) return -ENOMEM; =20 @@ -382,17 +380,16 @@ vcs_read(struct file *file, char __user *buf, size_t = count, loff_t *ppos) /* Select the proper current console and verify * sanity of the situation under the console lock. */ - console_lock(); + guard(console_lock)(); =20 uni_mode =3D use_unicode(inode); attr =3D use_attributes(inode); =20 - ret =3D -EINVAL; if (pos < 0) - goto unlock_out; + return -EINVAL; /* we enforce 32-bit alignment for pos and count in unicode mode */ if (uni_mode && (pos | count) & 3) - goto unlock_out; + return -EINVAL; =20 poll =3D file->private_data; if (count && poll) @@ -468,10 +465,8 @@ vcs_read(struct file *file, char __user *buf, size_t c= ount, loff_t *ppos) } *ppos +=3D read; if (read) - ret =3D read; -unlock_out: - console_unlock(); - free_page((unsigned long) con_buf); + return read; + return ret; } =20 @@ -591,7 +586,6 @@ vcs_write(struct file *file, const char __user *buf, si= ze_t count, loff_t *ppos) { struct inode *inode =3D file_inode(file); struct vc_data *vc; - char *con_buf; u16 *org0, *org; unsigned int written; int size; @@ -602,7 +596,7 @@ vcs_write(struct file *file, const char __user *buf, si= ze_t count, loff_t *ppos) if (use_unicode(inode)) return -EOPNOTSUPP; =20 - con_buf =3D (char *) __get_free_page(GFP_KERNEL); + char *con_buf __free(free_page_ptr) =3D (char *)__get_free_page(GFP_KERNE= L); if (!con_buf) return -ENOMEM; =20 @@ -611,22 +605,18 @@ vcs_write(struct file *file, const char __user *buf, = size_t count, loff_t *ppos) /* Select the proper current console and verify * sanity of the situation under the console lock. */ - console_lock(); + guard(console_lock)(); =20 attr =3D use_attributes(inode); - ret =3D -ENXIO; vc =3D vcs_vc(inode, &viewed); if (!vc) - goto unlock_out; + return -ENXIO; =20 size =3D vcs_size(vc, attr, false); - if (size < 0) { - ret =3D size; - goto unlock_out; - } - ret =3D -EINVAL; + if (size < 0) + return size; if (pos < 0 || pos > size) - goto unlock_out; + return -EINVAL; if (count > size - pos) count =3D size - pos; written =3D 0; @@ -651,8 +641,7 @@ vcs_write(struct file *file, const char __user *buf, si= ze_t count, loff_t *ppos) */ if (written) break; - ret =3D -EFAULT; - goto unlock_out; + return -EFAULT; } } =20 @@ -664,15 +653,13 @@ vcs_write(struct file *file, const char __user *buf, = size_t count, loff_t *ppos) if (!vc) { if (written) break; - ret =3D -ENXIO; - goto unlock_out; + return -ENXIO; } size =3D vcs_size(vc, attr, false); if (size < 0) { if (written) break; - ret =3D size; - goto unlock_out; + return size; } if (pos >=3D size) break; @@ -702,9 +689,6 @@ vcs_write(struct file *file, const char __user *buf, si= ze_t count, loff_t *ppos) if (written) vcs_scr_updated(vc); =20 -unlock_out: - console_unlock(); - free_page((unsigned long) con_buf); return ret; } =20 @@ -754,17 +738,17 @@ vcs_open(struct inode *inode, struct file *filp) unsigned int currcons =3D console(inode); bool attr =3D use_attributes(inode); bool uni_mode =3D use_unicode(inode); - int ret =3D 0; =20 /* we currently don't support attributes in unicode mode */ if (attr && uni_mode) return -EOPNOTSUPP; =20 - console_lock(); - if(currcons && !vc_cons_allocated(currcons-1)) - ret =3D -ENXIO; - console_unlock(); - return ret; + guard(console_lock)(); + + if (currcons && !vc_cons_allocated(currcons - 1)) + return -ENXIO; + + return 0; } =20 static int vcs_release(struct inode *inode, struct file *file) diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 100d6cb26887..869261141535 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -1317,12 +1317,9 @@ EXPORT_SYMBOL(__vc_resize); static int vt_resize(struct tty_struct *tty, struct winsize *ws) { struct vc_data *vc =3D tty->driver_data; - int ret; =20 - console_lock(); - ret =3D vc_do_resize(tty, vc, ws->ws_col, ws->ws_row, false); - console_unlock(); - return ret; + guard(console_lock)(); + return vc_do_resize(tty, vc, ws->ws_col, ws->ws_row, false); } =20 struct vc_data *vc_deallocate(unsigned int currcons) @@ -3135,12 +3132,11 @@ static int do_con_write(struct tty_struct *tty, con= st u8 *buf, int count) if (in_interrupt()) return count; =20 - console_lock(); + guard(console_lock)(); currcons =3D vc->vc_num; if (!vc_cons_allocated(currcons)) { /* could this happen? */ pr_warn_once("con_write: tty %d not allocated\n", currcons+1); - console_unlock(); return 0; } =20 @@ -3184,7 +3180,7 @@ static int do_con_write(struct tty_struct *tty, const= u8 *buf, int count) con_flush(vc, &draw); console_conditional_schedule(); notify_update(vc); - console_unlock(); + return n; } =20 @@ -3199,7 +3195,7 @@ static int do_con_write(struct tty_struct *tty, const= u8 *buf, int count) */ static void console_callback(struct work_struct *ignored) { - console_lock(); + guard(console_lock)(); =20 if (want_console >=3D 0) { if (want_console !=3D fg_console && @@ -3228,8 +3224,6 @@ static void console_callback(struct work_struct *igno= red) blank_timer_expired =3D 0; } notify_update(vc_cons[fg_console].d); - - console_unlock(); } =20 int set_console(int nr) @@ -3433,9 +3427,8 @@ int tioclinux(struct tty_struct *tty, unsigned long a= rg) return -EPERM; return paste_selection(tty); case TIOCL_UNBLANKSCREEN: - console_lock(); - unblank_screen(); - console_unlock(); + scoped_guard(console_lock) + unblank_screen(); break; case TIOCL_SELLOADLUT: if (!capable(CAP_SYS_ADMIN)) @@ -3451,9 +3444,8 @@ int tioclinux(struct tty_struct *tty, unsigned long a= rg) data =3D vt_get_shift_state(); return put_user(data, p); case TIOCL_GETMOUSEREPORTING: - console_lock(); /* May be overkill */ - data =3D mouse_reporting(); - console_unlock(); + scoped_guard(console_lock) /* May be overkill */ + data =3D mouse_reporting(); return put_user(data, p); case TIOCL_SETVESABLANK: return set_vesa_blanking(param); @@ -3484,15 +3476,14 @@ int tioclinux(struct tty_struct *tty, unsigned long= arg) * Needs the console lock here. Note that lots of other calls * need fixing before the lock is actually useful! */ - console_lock(); - scrollfront(vc_cons[fg_console].d, lines); - console_unlock(); + scoped_guard(console_lock) + scrollfront(vc_cons[fg_console].d, lines); break; case TIOCL_BLANKSCREEN: /* until explicitly unblanked, not only poked */ - console_lock(); - ignore_poke =3D 1; - do_blank_screen(0); - console_unlock(); + scoped_guard(console_lock) { + ignore_poke =3D 1; + do_blank_screen(0); + } break; case TIOCL_BLANKEDSCREEN: return console_blanked; @@ -3582,9 +3573,8 @@ static void con_flush_chars(struct tty_struct *tty) if (in_interrupt()) /* from flush_to_ldisc */ return; =20 - console_lock(); + guard(console_lock)(); set_cursor(vc); - console_unlock(); } =20 /* @@ -3596,22 +3586,20 @@ static int con_install(struct tty_driver *driver, s= truct tty_struct *tty) struct vc_data *vc; int ret; =20 - console_lock(); + guard(console_lock)(); ret =3D vc_allocate(currcons); if (ret) - goto unlock; + return ret; =20 vc =3D vc_cons[currcons].d; =20 /* Still being freed */ - if (vc->port.tty) { - ret =3D -ERESTARTSYS; - goto unlock; - } + if (vc->port.tty) + return -ERESTARTSYS; =20 ret =3D tty_port_install(&vc->port, driver, tty); if (ret) - goto unlock; + return ret; =20 tty->driver_data =3D vc; vc->port.tty =3D tty; @@ -3625,9 +3613,8 @@ static int con_install(struct tty_driver *driver, str= uct tty_struct *tty) tty->termios.c_iflag |=3D IUTF8; else tty->termios.c_iflag &=3D ~IUTF8; -unlock: - console_unlock(); - return ret; + + return 0; } =20 static int con_open(struct tty_struct *tty, struct file *filp) @@ -3646,9 +3633,9 @@ static void con_shutdown(struct tty_struct *tty) { struct vc_data *vc =3D tty->driver_data; BUG_ON(vc =3D=3D NULL); - console_lock(); + + guard(console_lock)(); vc->port.tty =3D NULL; - console_unlock(); } =20 static void con_cleanup(struct tty_struct *tty) @@ -4137,15 +4124,13 @@ static ssize_t store_bind(struct device *dev, struc= t device_attribute *attr, struct con_driver *con =3D dev_get_drvdata(dev); int bind =3D simple_strtoul(buf, NULL, 0); =20 - console_lock(); + guard(console_lock)(); =20 if (bind) vt_bind(con); else vt_unbind(con); =20 - console_unlock(); - return count; } =20 @@ -4155,9 +4140,8 @@ static ssize_t show_bind(struct device *dev, struct d= evice_attribute *attr, struct con_driver *con =3D dev_get_drvdata(dev); int bind; =20 - console_lock(); - bind =3D con_is_bound(con->con); - console_unlock(); + scoped_guard(console_lock) + bind =3D con_is_bound(con->con); =20 return sysfs_emit(buf, "%i\n", bind); } @@ -4429,7 +4413,7 @@ static void con_driver_unregister_callback(struct wor= k_struct *ignored) { int i; =20 - console_lock(); + guard(console_lock)(); =20 for (i =3D 0; i < MAX_NR_CON_DRIVER; i++) { struct con_driver *con_driver =3D ®istered_con_driver[i]; @@ -4454,8 +4438,6 @@ static void con_driver_unregister_callback(struct wor= k_struct *ignored) con_driver->first =3D 0; con_driver->last =3D 0; } - - console_unlock(); } =20 /* @@ -4491,9 +4473,8 @@ EXPORT_SYMBOL_GPL(do_take_over_console); */ void give_up_console(const struct consw *csw) { - console_lock(); + guard(console_lock)(); do_unregister_con_driver(csw); - console_unlock(); } EXPORT_SYMBOL(give_up_console); =20 @@ -4541,9 +4522,8 @@ static int set_vesa_blanking(u8 __user *mode_user) if (get_user(mode, mode_user)) return -EFAULT; =20 - console_lock(); + guard(console_lock)(); vesa_blank_mode =3D (mode <=3D VESA_BLANK_MAX) ? mode : VESA_NO_BLANKING; - console_unlock(); =20 return 0; } @@ -4729,7 +4709,7 @@ int con_set_cmap(unsigned char __user *arg) if (copy_from_user(colormap, arg, sizeof(colormap))) return -EFAULT; =20 - console_lock(); + guard(console_lock)(); for (i =3D k =3D 0; i < 16; i++) { default_red[i] =3D colormap[k++]; default_grn[i] =3D colormap[k++]; @@ -4745,7 +4725,6 @@ int con_set_cmap(unsigned char __user *arg) } set_palette(vc_cons[i].d); } - console_unlock(); =20 return 0; } @@ -4755,13 +4734,12 @@ int con_get_cmap(unsigned char __user *arg) int i, k; unsigned char colormap[3*16]; =20 - console_lock(); - for (i =3D k =3D 0; i < 16; i++) { - colormap[k++] =3D default_red[i]; - colormap[k++] =3D default_grn[i]; - colormap[k++] =3D default_blu[i]; - } - console_unlock(); + scoped_guard(console_lock) + for (i =3D k =3D 0; i < 16; i++) { + colormap[k++] =3D default_red[i]; + colormap[k++] =3D default_grn[i]; + colormap[k++] =3D default_blu[i]; + } =20 if (copy_to_user(arg, colormap, sizeof(colormap))) return -EFAULT; diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index 61342e06970a..c9f11c4bd9fe 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c @@ -373,15 +373,13 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigne= d int cmd, break; } =20 - case KDSETMODE: + case KDSETMODE: { if (!perm) return -EPERM; =20 - console_lock(); - ret =3D vt_kdsetmode(vc, arg); - console_unlock(); - return ret; - + guard(console_lock)(); + return vt_kdsetmode(vc, arg); + } case KDGETMODE: return put_user(vc->vc_mode, (int __user *)arg); =20 @@ -601,23 +599,21 @@ static int vt_setactivate(struct vt_setactivate __use= r *sa) =20 vsa.console--; vsa.console =3D array_index_nospec(vsa.console, MAX_NR_CONSOLES); - console_lock(); - ret =3D vc_allocate(vsa.console); - if (ret) { - console_unlock(); - return ret; - } + scoped_guard(console_lock) { + ret =3D vc_allocate(vsa.console); + if (ret) + return ret; =20 - /* - * This is safe providing we don't drop the console sem between - * vc_allocate and finishing referencing nvc. - */ - nvc =3D vc_cons[vsa.console].d; - nvc->vt_mode =3D vsa.mode; - nvc->vt_mode.frsig =3D 0; - put_pid(nvc->vt_pid); - nvc->vt_pid =3D get_pid(task_pid(current)); - console_unlock(); + /* + * This is safe providing we don't drop the console sem between + * vc_allocate and finishing referencing nvc. + */ + nvc =3D vc_cons[vsa.console].d; + nvc->vt_mode =3D vsa.mode; + nvc->vt_mode.frsig =3D 0; + put_pid(nvc->vt_pid); + nvc->vt_pid =3D get_pid(task_pid(current)); + } =20 /* Commence switch and lock */ /* Review set_console locks */ @@ -630,19 +626,18 @@ static int vt_setactivate(struct vt_setactivate __use= r *sa) static int vt_disallocate(unsigned int vc_num) { struct vc_data *vc =3D NULL; - int ret =3D 0; =20 - console_lock(); - if (vt_busy(vc_num)) - ret =3D -EBUSY; - else if (vc_num) - vc =3D vc_deallocate(vc_num); - console_unlock(); + scoped_guard(console_lock) { + if (vt_busy(vc_num)) + return -EBUSY; + if (vc_num) + vc =3D vc_deallocate(vc_num); + } =20 if (vc && vc_num >=3D MIN_NR_CONSOLES) tty_port_put(&vc->port); =20 - return ret; + return 0; } =20 /* deallocate all unused consoles, but leave 0 */ @@ -651,13 +646,12 @@ static void vt_disallocate_all(void) struct vc_data *vc[MAX_NR_CONSOLES]; int i; =20 - console_lock(); - for (i =3D 1; i < MAX_NR_CONSOLES; i++) - if (!vt_busy(i)) - vc[i] =3D vc_deallocate(i); - else - vc[i] =3D NULL; - console_unlock(); + scoped_guard(console_lock) + for (i =3D 1; i < MAX_NR_CONSOLES; i++) + if (!vt_busy(i)) + vc[i] =3D vc_deallocate(i); + else + vc[i] =3D NULL; =20 for (i =3D 1; i < MAX_NR_CONSOLES; i++) { if (vc[i] && i >=3D MIN_NR_CONSOLES) @@ -703,7 +697,7 @@ static int vt_resizex(struct vc_data *vc, struct vt_con= size __user *cs) =20 if (!vc_cons[i].d) continue; - console_lock(); + guard(console_lock)(); vcp =3D vc_cons[i].d; if (vcp) { int ret; @@ -718,11 +712,9 @@ static int vt_resizex(struct vc_data *vc, struct vt_co= nsize __user *cs) if (ret) { vcp->vc_scan_lines =3D save_scan_lines; vcp->vc_cell_height =3D save_cell_height; - console_unlock(); return ret; } } - console_unlock(); } =20 return 0; @@ -770,7 +762,7 @@ int vt_ioctl(struct tty_struct *tty, if (tmp.mode !=3D VT_AUTO && tmp.mode !=3D VT_PROCESS) return -EINVAL; =20 - console_lock(); + guard(console_lock)(); vc->vt_mode =3D tmp; /* the frsig is ignored, so we set it to 0 */ vc->vt_mode.frsig =3D 0; @@ -778,7 +770,6 @@ int vt_ioctl(struct tty_struct *tty, vc->vt_pid =3D get_pid(task_pid(current)); /* no switch is required -- saw@shade.msu.ru */ vc->vt_newvt =3D -1; - console_unlock(); break; } =20 @@ -787,9 +778,8 @@ int vt_ioctl(struct tty_struct *tty, struct vt_mode tmp; int rc; =20 - console_lock(); - memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); - console_unlock(); + scoped_guard(console_lock) + memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); =20 rc =3D copy_to_user(up, &tmp, sizeof(struct vt_mode)); if (rc) @@ -811,12 +801,10 @@ int vt_ioctl(struct tty_struct *tty, return -EFAULT; =20 state =3D 1; /* /dev/tty0 is always open */ - console_lock(); /* required by vt_in_use() */ - for (i =3D 0, mask =3D 2; i < MAX_NR_CONSOLES && mask; - ++i, mask <<=3D 1) - if (vt_in_use(i)) - state |=3D mask; - console_unlock(); + scoped_guard(console_lock) /* required by vt_in_use() */ + for (i =3D 0, mask =3D 2; i < MAX_NR_CONSOLES && mask; ++i, mask <<=3D = 1) + if (vt_in_use(i)) + state |=3D mask; return put_user(state, &vtstat->v_state); } =20 @@ -824,11 +812,10 @@ int vt_ioctl(struct tty_struct *tty, * Returns the first available (non-opened) console. */ case VT_OPENQRY: - console_lock(); /* required by vt_in_use() */ - for (i =3D 0; i < MAX_NR_CONSOLES; ++i) - if (!vt_in_use(i)) - break; - console_unlock(); + scoped_guard(console_lock) /* required by vt_in_use() */ + for (i =3D 0; i < MAX_NR_CONSOLES; ++i) + if (!vt_in_use(i)) + break; i =3D i < MAX_NR_CONSOLES ? (i+1) : -1; return put_user(i, (int __user *)arg); =20 @@ -845,11 +832,11 @@ int vt_ioctl(struct tty_struct *tty, =20 arg--; arg =3D array_index_nospec(arg, MAX_NR_CONSOLES); - console_lock(); - ret =3D vc_allocate(arg); - console_unlock(); - if (ret) - return ret; + scoped_guard(console_lock) { + ret =3D vc_allocate(arg); + if (ret) + return ret; + } set_console(arg); break; =20 @@ -880,15 +867,13 @@ int vt_ioctl(struct tty_struct *tty, * 2: completed switch-to OK */ case VT_RELDISP: + { if (!perm) return -EPERM; =20 - console_lock(); - ret =3D vt_reldisp(vc, arg); - console_unlock(); - - return ret; - + guard(console_lock)(); + return vt_reldisp(vc, arg); + } =20 /* * Disallocate memory associated to VT (but leave VT1) @@ -917,7 +902,7 @@ int vt_ioctl(struct tty_struct *tty, get_user(cc, &vtsizes->v_cols)) return -EFAULT; =20 - console_lock(); + guard(console_lock)(); for (i =3D 0; i < MAX_NR_CONSOLES; i++) { vc =3D vc_cons[i].d; =20 @@ -926,7 +911,6 @@ int vt_ioctl(struct tty_struct *tty, __vc_resize(vc_cons[i].d, cc, ll, true); } } - console_unlock(); break; } =20 @@ -996,20 +980,17 @@ void vc_SAK(struct work_struct *work) struct vc_data *vc; struct tty_struct *tty; =20 - console_lock(); + guard(console_lock)(); vc =3D vc_con->d; - if (vc) { - /* FIXME: review tty ref counting */ - tty =3D vc->port.tty; - /* - * SAK should also work in all raw modes and reset - * them properly. - */ - if (tty) - __do_SAK(tty); - reset_vc(vc); - } - console_unlock(); + if (!vc) + return; + + /* FIXME: review tty ref counting */ + tty =3D vc->port.tty; + /* SAK should also work in all raw modes and reset them properly. */ + if (tty) + __do_SAK(tty); + reset_vc(vc); } =20 #ifdef CONFIG_COMPAT @@ -1287,31 +1268,29 @@ int vt_move_to_console(unsigned int vt, int alloc) { int prev; =20 - console_lock(); - /* Graphics mode - up to X */ - if (disable_vt_switch) { - console_unlock(); - return 0; - } - prev =3D fg_console; + scoped_guard(console_lock) { + /* Graphics mode - up to X */ + if (disable_vt_switch) + return 0; =20 - if (alloc && vc_allocate(vt)) { - /* we can't have a free VC for now. Too bad, - * we don't want to mess the screen for now. */ - console_unlock(); - return -ENOSPC; - } + prev =3D fg_console; =20 - if (set_console(vt)) { - /* - * We're unable to switch to the SUSPEND_CONSOLE. - * Let the calling function know so it can decide - * what to do. - */ - console_unlock(); - return -EIO; + if (alloc && vc_allocate(vt)) { + /* + * We can't have a free VC for now. Too bad, we don't want to mess the + * screen for now. + */ + return -ENOSPC; + } + + if (set_console(vt)) { + /* + * We're unable to switch to the SUSPEND_CONSOLE. Let the calling funct= ion + * know so it can decide what to do. + */ + return -EIO; + } } - console_unlock(); if (vt_waitactive(vt + 1)) { pr_debug("Suspend: Can't switch VCs."); return -EINTR; @@ -1328,8 +1307,7 @@ int vt_move_to_console(unsigned int vt, int alloc) */ void pm_set_vt_switch(int do_switch) { - console_lock(); + guard(console_lock)(); disable_vt_switch =3D !do_switch; - console_unlock(); } EXPORT_SYMBOL(pm_set_vt_switch); --=20 2.50.1 From nobody Sat Oct 4 17:30:14 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 9870527A12B; Thu, 14 Aug 2025 07:25:25 +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=1755156325; cv=none; b=KW28gAdGu6Ty71MVKZ+S7NhXO/zDea1bbUnpXBRQkRddZ3qmiBLHn0l55Vc9bLK69QypThCfkksQG9aYmirUPt2K0d4Yf4HmFWGA5SFNNpB1Y2oXcHrTz+Zfw/b1vHpg3Fb+np6GuA9pHnTawvc/yBGLR9joNB8w68D1BsdXO6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755156325; c=relaxed/simple; bh=dcZVeE1ooG0iHensGTvf7QUr3epXcu5dw0Q3AjF9SyM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s1CsNhnI7CYn2fDP0kE+LEOq6ASuBiSdjdrcREnh2sQeyeW0kJKfCrmoDlHOI8NORcsIhCBjDMY6Kb+enBm7XfwU1ATfncUFKN+TEe64agVtezqFnKCO4KaqOdSNA1VRAJQs48Nozi9xrgsyXrEKoFegArFdhv32XwmSuCZrNR0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NTw9pk9z; 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="NTw9pk9z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0DB67C4CEF5; Thu, 14 Aug 2025 07:25:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755156325; bh=dcZVeE1ooG0iHensGTvf7QUr3epXcu5dw0Q3AjF9SyM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NTw9pk9zEckH+7fhLTV/dF3QHgE5Qjnw//AyXwLQY0t6rJ1RQ/hyummnbTP0FAtS0 P4zi3z8CbNGXisvLpRFU0MIOWMMABpulcHjZyKObuwNURgSdso/XMdCk05FSuHjpSe 8ci15YRw+0v0b/qaXaUHH0ToZiCRRH1TIdIItx0dOXw40/jujFv4+zfgSJFgcHSk6c VF+Nent4sc4euKVAGluE0uMfGm4ZKcly2c/6brM/UN3m/oWqpQ05rgsyUIh418kClc +9w+OlLcZsYKjaXxAco1HnsK1uaJ9vsvMn7tvmMPUGq0Pl6U4gK7StNaPNnyLXdfEv VYjpN9qyHkqKg== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , linux-s390@vger.kernel.org Subject: [PATCH 16/16] s390/char/con3270: use tty_port_tty guard() Date: Thu, 14 Aug 2025 09:24:56 +0200 Message-ID: <20250814072456.182853-17-jirislaby@kernel.org> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250814072456.182853-1-jirislaby@kernel.org> References: <20250814072456.182853-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" Having the new tty_port_tty guard, use it in tty3270_resize(). This makes the code easier to read. The winsize is now defined in the scope and initialized immediately, so that it's obvious. Signed-off-by: Jiri Slaby (SUSE) Cc: Heiko Carstens Cc: Vasily Gorbik Cc: Alexander Gordeev Cc: Christian Borntraeger Cc: Sven Schnelle Acked-by: Heiko Carstens --- Cc: linux-s390@vger.kernel.org --- drivers/s390/char/con3270.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index b78b86e8f281..a367f95c7c53 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c @@ -970,8 +970,6 @@ static void tty3270_resize(struct raw3270_view *view, char **old_rcl_lines, **new_rcl_lines; char *old_prompt, *new_prompt; char *old_input, *new_input; - struct tty_struct *tty; - struct winsize ws; size_t prompt_sz; int new_allocated, old_allocated =3D tp->allocated_lines; =20 @@ -1023,14 +1021,14 @@ static void tty3270_resize(struct raw3270_view *vie= w, kfree(old_prompt); tty3270_free_recall(old_rcl_lines); tty3270_set_timer(tp, 1); - /* Informat tty layer about new size */ - tty =3D tty_port_tty_get(&tp->port); - if (!tty) - return; - ws.ws_row =3D tty3270_tty_rows(tp); - ws.ws_col =3D tp->view.cols; - tty_do_resize(tty, &ws); - tty_kref_put(tty); + /* Inform the tty layer about new size */ + scoped_guard(tty_port_tty, &tp->port) { + struct winsize ws =3D { + .ws_row =3D tty3270_tty_rows(tp), + .ws_col =3D tp->view.cols, + }; + tty_do_resize(scoped_tty(), &ws); + } return; out_screen: tty3270_free_screen(screen, new_rows); --=20 2.50.1