From patchwork Mon Nov 14 16:28:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Ogness X-Patchwork-Id: 1614 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2237572wru; Mon, 14 Nov 2022 08:30:26 -0800 (PST) X-Google-Smtp-Source: AA0mqf6N7DEnwISzPd7kNmwc9Rspghz+Jp9F1kDvFDcC1YmRXmVz2L8b2mvLkFm+xqXsSzicoj1F X-Received: by 2002:a05:6a00:1d8e:b0:56b:d68e:41f6 with SMTP id z14-20020a056a001d8e00b0056bd68e41f6mr14430894pfw.36.1668443425710; Mon, 14 Nov 2022 08:30:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668443425; cv=none; d=google.com; s=arc-20160816; b=FPHmo3xmHsEVrr6Tdszi5Iuh0KRXi4IL8zRdSWChSAcRX0yEdAFQLDu4ip7Jmlcvde 34uAjfmGXTAa/endvi2eTSChfO0miVz2/5hwRp5ffkfx97oFFtOAKoQuUJaOLWbX/4Ns zEqgNZCokExuJgtS61DC5MZC2/aNhQPdwweL8Lax+ij+Vdm6dyrZg1b4mPiLbTjDifyY yvn9kFgyKfOm2u1H/FqXwKqYcCV0y9h+WwSrFdEn7viKBFdXF4SJIXDy/CdsBmsVbJCV c/3kTaunGCu/4N7EJxBE1qOOmCjU1jEkViH1J+ocSuThTSIhca7XHJhk5HdVCrJKE6po 8lSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:dkim-signature:dkim-signature:from; bh=2ia89HZSRLXOgXaOdEDVfM/lt8urljrOhJdnHfXmKjU=; b=Ab+UowvQlozeeyavOYIlezsdHal/qGDdGZQq7x1epJBCqYyj2HKBqEpsvFJ2hTv1k3 qpnQD88IV9KSNXFiG9HJPhE2037YXhpozzZ9BlJJkjLjBVRKeiDb81vhf7uYTctWqeVY L6osY5tENyMf/psO2wRmighs7G/9kbvDev038jexBYye7bYhGG0+b8gvR/wnacxd/Czr pjESHEpkpfpg4lpn+057ren2ydDZn8hhhKS23CTc2/jE8d2ZXH8YKEkIgj3KaDWmjEaj utzcOXJ5U17Jw9z/EOmuReNzcoa9n7dOwAovV2ct4bL3aVUmthHBTdUaW19hPLOS6Fy1 5gwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=YiZgYIzb; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id rm11-20020a17090b3ecb00b00213353d1109si10376124pjb.169.2022.11.14.08.29.57; Mon, 14 Nov 2022 08:30:25 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=YiZgYIzb; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237544AbiKNQ3l (ORCPT + 99 others); Mon, 14 Nov 2022 11:29:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237426AbiKNQ3h (ORCPT ); Mon, 14 Nov 2022 11:29:37 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 34119140D1; Mon, 14 Nov 2022 08:29:36 -0800 (PST) From: John Ogness DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1668443374; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=2ia89HZSRLXOgXaOdEDVfM/lt8urljrOhJdnHfXmKjU=; b=YiZgYIzbGCS66YXIbnxE6HJSvuTozQJVm58tUWdD2n4y28gjtW1uZFFKiE4stX4GyLd79p +YNdGDP8PJqfheCbYANqK1Acwttrp3+h1Arxlm6dnx/imsSfHBTsvWINJO1FTQWjJLFhec x9r0v+8OmvuighJO6BPLWW3526LiM9UaibGBRmcynkQdxf8FtKRpskdXdCeaQDDIl9q+DS /iw1SO/WUFNDXJkVPXBCXepuK+u5fcd7eB1JJwMSHpqzBybgcxVOcAekyMdJIDu6B57+G0 3iJH018PYhIpqraxqEXvulW/RG3bmOcweaxcG4nokqF6cr2lDsbBuWvm+JkA9A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1668443374; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=2ia89HZSRLXOgXaOdEDVfM/lt8urljrOhJdnHfXmKjU=; b=yWQ3DUdGxE8HiQ+BCoA7MfdIFiUkgVb02pKvTJXiNVqXlQM6ZDYyW+UBcx0rL+UguDA25s z9obC1MVjJfJPMCg== To: Petr Mladek Cc: Sergey Senozhatsky , Steven Rostedt , Thomas Gleixner , linux-kernel@vger.kernel.org, Jason Wessel , Daniel Thompson , Douglas Anderson , Greg Kroah-Hartman , Jiri Slaby , kgdb-bugreport@lists.sourceforge.net, linux-serial@vger.kernel.org, linux-fsdevel@vger.kernel.org, Miguel Ojeda , Richard Weinberger , Anton Ivanov , Johannes Berg , linux-um@lists.infradead.org, Luis Chamberlain , Aaron Tomlin , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Andy Shevchenko , Lukas Wunner , Geert Uytterhoeven , Geert Uytterhoeven , linux-m68k@lists.linux-m68k.org, Ard Biesheuvel , linux-efi@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, Krzysztof Kozlowski , Alim Akhtar , linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, Michal Simek , Peter Zijlstra , Mathias Nyman , linux-usb@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , netdev@vger.kernel.org, Helge Deller , Javier Martinez Canillas , Thomas Zimmermann , Juergen Gross , Boris Ostrovsky , Tom Rix , linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH printk v4 00/39] reduce console_lock scope Date: Mon, 14 Nov 2022 17:34:53 +0106 Message-Id: <20221114162932.141883-1-john.ogness@linutronix.de> MIME-Version: 1.0 X-Spam-Status: No, score=-3.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,INVALID_DATE_TZ_ABSURD, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749489733462298701?= X-GMAIL-MSGID: =?utf-8?q?1749489733462298701?= This is v4 of a series to prepare for threaded/atomic printing. v3 is here [0]. This series focuses on reducing the scope of the BKL console_lock. It achieves this by switching to SRCU and a dedicated mutex for console list iteration and modification, respectively. The console_lock will no longer offer this protection. Also, during the review of v2 it came to our attention that many console drivers are checking CON_ENABLED to see if they are registered. Because this flag can change without unregistering and because this flag does not represent an atomic point when an (un)registration process is complete, a new console_is_registered() function is introduced. This function uses the console_list_lock to synchronize with the (un)registration process to provide a reliable status. All users of the console_lock for list iteration have been modified. For the call sites where the console_lock is still needed (for other reasons), comments are added to explain exactly why the console_lock was needed. All users of CON_ENABLED for registration status have been modified to use console_is_registered(). Note that there are still users of CON_ENABLED, but this is for legitimate purposes about a registered console being able to print. The base commit for this series is from Paul McKenney's RCU tree and provides an NMI-safe SRCU implementation [1]. Without the NMI-safe SRCU implementation, this series is not less safe than mainline. But we will need the NMI-safe SRCU implementation for atomic consoles anyway, so we might as well get it in now. Especially since it _does_ increase the reliability for mainline in the panic path. Changes since v3: general: - Implement console_srcu_read_flags() and console_srcu_write_flags() to be used for console->flags access under the srcu_read_lock or console_list_lock, respectively. The functions document their relationship to one another and use data_race(), READ_ONCE(), and WRITE_ONCE() macros to annotate their relationship. They also make use of lockdep to warn if used in improper contexts. - Replace all console_is_enabled() usage with console_srcu_read_flags() (all were under the srcu_read_lock). serial_core: - For uart_console_registered(), check uart_console() before taking the console_list_lock to avoid unnecessary lock contention for non-console ports. m68k/emu/nfcon: - Only explicitly enable the console if registering via debug=nfcon. tty/serial/sh-sci: - Add comments about why @options will always be NULL for the earlyprintk console. kdb: - Add comments explaining the expectations for console drivers to work correctly. printk: - Some code sites under SRCU were checking flags directly. Use console_srcu_read_flags() instead. - In register_console() rename bootcon_enabled/realcon_enabled to bootcon_registered/realcon_registered to avoid confusion. - In register_console() only check for boot console sequences if a boot console is registered and !keep_bootcon. In this case, also take the console_lock to guarantee safe access to console->seq. - In console_force_preferred_locked() use hlist_del_rcu() instead of hlist_del_init_rcu() so that there is never a window where the console can be viewed as unregistered. John Ogness [0] https://lore.kernel.org/lkml/20221107141638.3790965-1-john.ogness@linutronix.de [1] https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/log/?h=srcunmisafe.2022.11.09a John Ogness (37): printk: Prepare for SRCU console list protection printk: register_console: use "registered" for variable names printk: fix setting first seq for consoles um: kmsg_dump: only dump when no output console available tty: serial: kgdboc: document console_lock usage tty: tty_io: document console_lock usage proc: consoles: document console_lock usage printk: introduce console_list_lock console: introduce wrappers to read/write console flags um: kmsg_dumper: use srcu console list iterator kdb: use srcu console list iterator printk: console_flush_all: use srcu console list iterator printk: __pr_flush: use srcu console list iterator printk: console_is_usable: use console_srcu_read_flags printk: console_unblank: use srcu console list iterator printk: console_flush_on_panic: use srcu console list iterator printk: console_device: use srcu console list iterator console: introduce console_is_registered() serial_core: replace uart_console_enabled() with uart_console_registered() tty: nfcon: use console_is_registered() efi: earlycon: use console_is_registered() tty: hvc: use console_is_registered() tty: serial: earlycon: use console_is_registered() tty: serial: pic32_uart: use console_is_registered() tty: serial: samsung_tty: use console_is_registered() tty: serial: xilinx_uartps: use console_is_registered() usb: early: xhci-dbc: use console_is_registered() netconsole: avoid CON_ENABLED misuse to track registration printk, xen: fbfront: create/use safe function for forcing preferred tty: tty_io: use console_list_lock for list synchronization proc: consoles: use console_list_lock for list iteration tty: serial: kgdboc: use srcu console list iterator tty: serial: kgdboc: use console_list_lock for list traversal tty: serial: kgdboc: synchronize tty_find_polling_driver() and register_console() tty: serial: kgdboc: use console_list_lock to trap exit printk: relieve console_lock of list synchronization duties tty: serial: sh-sci: use setup() callback for early console Thomas Gleixner (2): serial: kgdboc: Lock console list in probe function printk: Convert console_drivers list to hlist .clang-format | 1 + arch/m68k/emu/nfcon.c | 9 +- arch/um/kernel/kmsg_dump.c | 24 +- drivers/firmware/efi/earlycon.c | 8 +- drivers/net/netconsole.c | 21 +- drivers/tty/hvc/hvc_console.c | 4 +- drivers/tty/serial/8250/8250_core.c | 2 +- drivers/tty/serial/earlycon.c | 4 +- drivers/tty/serial/kgdboc.c | 46 ++- drivers/tty/serial/pic32_uart.c | 4 +- drivers/tty/serial/samsung_tty.c | 2 +- drivers/tty/serial/serial_core.c | 14 +- drivers/tty/serial/sh-sci.c | 20 +- drivers/tty/serial/xilinx_uartps.c | 2 +- drivers/tty/tty_io.c | 18 +- drivers/usb/early/xhci-dbc.c | 2 +- drivers/video/fbdev/xen-fbfront.c | 12 +- fs/proc/consoles.c | 21 +- include/linux/console.h | 129 +++++++- include/linux/serial_core.h | 10 +- kernel/debug/kdb/kdb_io.c | 18 +- kernel/printk/printk.c | 459 +++++++++++++++++++++------- 22 files changed, 648 insertions(+), 182 deletions(-) base-commit: f733615e39aa2d6ddeef33b7b2c9aa6a5a2c2785