Received: by 2002:a89:d88:0:b0:1fa:5c73:8e2d with SMTP id eb8csp1877388lqb; Sun, 26 May 2024 23:42:42 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCV4aIfAoTO/CVec1Ne1+ekUiq5CSg7VijtpqAkec/Bx7F3PFme7vkeaSsMbOWbrPQ0pS0j0x6dkrYvd2A0UvcMgPC67Xmo59c9MXf6ANw== X-Google-Smtp-Source: AGHT+IEN7QX3KFwQdxcpa8P6e5hK2PhxMgCkUI3lnNAovkJ44ZoYTv/FzD1cgmUst99fxlM4rqce X-Received: by 2002:a05:6808:170f:b0:3ca:b8b0:4f76 with SMTP id 5614622812f47-3d1a7176057mr11045476b6e.38.1716792162425; Sun, 26 May 2024 23:42:42 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1716792162; cv=pass; d=google.com; s=arc-20160816; b=LBkOsUz3kdhrgXptY0oxByhjp2oYLz4vKdAQQMol17ksE3YGDGb3zXzK3F14pv9BJd cAUtjKiActxKfR5ecxPRa8edidAAGzl++QJXXX2jf7EjeaG0730gOtnA1vV3umJnfmex ljMFOdcrGNC71GFJVyEYb28JEgjVq4PgC6J7o+1fGVR3djYZL++3EUvpDJKLDPfzkANY SpXb5tjexYOdgd3ouSnqSGLVWPUy0ukLMc5phSVkhED1/aKISYpV2TfKYv8UXKa3esuv 5RFizT09xmHtV8JsSHqUGu2O6Y4s3ORCqbrylMcHpaxUn48Fm1WqGvBMe8v62BzA1YG3 Tq6w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:dkim-signature:dkim-signature:from; bh=VKsa/1j/hsc2hNgT7N6RhGj9XG+uFyRNJKfZ/KePOvo=; fh=XmYTsvJep+3n/kwj2WQNRDd8hkdAE9pQedkTVHXYIew=; b=XZ9LHpYcryogBkhflqFHr3fJlDsherXSEqpzcJQdakk4zm65ONbyv6L6Vj127WeClW BtyHmLDQrK4kr5bVlDnw3Lf8C349IAyxGazuh+4hWgtZUb5IsrzTUuP0isxwKl5rM1mV g/Ko2JIxg1bTHtbxaVIOL3a37rsv0YAGTuxe8csJ1TXr6LIO9f1kE1B2q6TVn9mWzHLm jLsHbp239OjHfKDex/TtPnDhWqguYDkFXWfDx2fd0D36JsMoPpxzKEHKPtV87y5zKuQY S2V8RbJ3UR5svxlPrQgjnFGDbrL25X4XXKL3UP1izW97c+v49BWRveKJkhhWphrlWfka q3nw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b="Pcr/AejG"; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; arc=pass (i=1 spf=pass spfdomain=linutronix.de dkim=pass dkdomain=linutronix.de dmarc=pass fromdomain=linutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-190098-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-190098-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id 41be03b00d2f7-68229d0d586si5871704a12.693.2024.05.26.23.42.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 May 2024 23:42:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-190098-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b="Pcr/AejG"; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; arc=pass (i=1 spf=pass spfdomain=linutronix.de dkim=pass dkdomain=linutronix.de dmarc=pass fromdomain=linutronix.de); spf=pass (google.com: domain of linux-kernel+bounces-190098-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-190098-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id BA8C7281F95 for ; Mon, 27 May 2024 06:42:08 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7F6E113C3C5; Mon, 27 May 2024 06:38:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Pcr/AejG"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ujFHwQJC" Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (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 CDFF013A26F for ; Mon, 27 May 2024 06:38:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716791910; cv=none; b=PAGjxy2EExmWML+G7/ugy/05z5kuOhK9TJAmJlX2iNf/7YgWAFvsz8KT1h+vk1nN53MOezoM7VreLwA8Vts8nb4wt34HGJTTYKmLJoEXmwRP+nyHr0pF/+4Td9wwbTtFGXKMY4WKCNjZb9bxuGtGJD02JQLAJrqdjp/dgHaB9d8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716791910; c=relaxed/simple; bh=OFWO2IRbRo8ynzt2DKXpmd6oX4CkmFfn02/npsx3lxQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=o7kNqmPQFEks8cLDRr4aNT2dmWce7oyz57+Q0LtiILBQlBghSfeRrILaRXT6FiZc/jXCc/pGYOT1C49OpjPo10cPFF0WuRkIIttVyHdGKkUs/nmxYO9hpv4cNd996z4k0L6acpnCAzdI7pdBUqgBKPJBso86bUxuPui7uQnKAKg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Pcr/AejG; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ujFHwQJC; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de From: John Ogness DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1716791906; 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: in-reply-to:in-reply-to:references:references; bh=VKsa/1j/hsc2hNgT7N6RhGj9XG+uFyRNJKfZ/KePOvo=; b=Pcr/AejGQ7hMb43qAB4NsL/348lGjh3T4gn4T9AVNyXvAxOdd7JTjKU5pKYtClspZzdr/D agZWBP8W8TngvGzeMTkKpy92JS+5m5XKaWuoKVD4keJehwXDhf2icmu4RfpliqgoYGNAwp cNXlEEFJMaZdRmlPiN0GBjcIk0tahAi6RXfPpMlwy60wI1WM66+UdArr+SNEbRhNuXHho1 NvZdyrzTXO5y9GMTRi/cIEEYXBU+eborb/+3g5RT5s8FLLfVkbJXW0j9xHwi5Unkam1+dv jo3q7fMJPdn/NJpGXGm1W44jeQKTulZK5WgqvqkjUHmNoaVM+HqJwjDMIR3XiA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1716791906; 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: in-reply-to:in-reply-to:references:references; bh=VKsa/1j/hsc2hNgT7N6RhGj9XG+uFyRNJKfZ/KePOvo=; b=ujFHwQJCDxGCpxj7jemjrcGwkg3kn+mWScSViB9BLNiXyBUti68EC5RQoqLGrqNSRNIc8S p8G4lv/nosJZolBA== To: Petr Mladek Cc: Sergey Senozhatsky , Steven Rostedt , Thomas Gleixner , linux-kernel@vger.kernel.org, Andrew Morton , Lukas Wunner , Uros Bizjak , Kefeng Wang , Arnd Bergmann Subject: [PATCH printk v6 25/30] printk: Coordinate direct printing in panic Date: Mon, 27 May 2024 08:43:44 +0206 Message-Id: <20240527063749.391035-26-john.ogness@linutronix.de> In-Reply-To: <20240527063749.391035-1-john.ogness@linutronix.de> References: <20240527063749.391035-1-john.ogness@linutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Perform printing by nbcon consoles on the panic CPU from the printk() caller context in order to get panic messages printed as soon as possible. If legacy and nbcon consoles are registered, the legacy consoles will no longer perform direct printing on the panic CPU until after the backtrace has been stored. This will give the safe nbcon consoles a chance to print the panic messages before allowing the unsafe legacy consoles to print. If no nbcon consoles are registered, there is no change in behavior (i.e. legacy consoles will always attempt to print from the printk() caller context). Signed-off-by: John Ogness Reviewed-by: Petr Mladek --- include/linux/printk.h | 5 ++++ kernel/panic.c | 2 ++ kernel/printk/printk.c | 62 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 4d93d95cd5f0..69f40a71c438 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -195,6 +195,7 @@ void show_regs_print_info(const char *log_lvl); extern asmlinkage void dump_stack_lvl(const char *log_lvl) __cold; extern asmlinkage void dump_stack(void) __cold; void printk_trigger_flush(void); +void printk_legacy_allow_panic_sync(void); extern bool nbcon_device_try_acquire(struct console *con); extern void nbcon_device_release(struct console *con); void nbcon_atomic_flush_unsafe(void); @@ -278,6 +279,10 @@ static inline void printk_trigger_flush(void) { } +static inline void printk_legacy_allow_panic_sync(void) +{ +} + static inline bool nbcon_device_try_acquire(struct console *con) { return false; diff --git a/kernel/panic.c b/kernel/panic.c index c039f8e1ddae..de8115c829cf 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -364,6 +364,8 @@ void panic(const char *fmt, ...) panic_other_cpus_shutdown(_crash_kexec_post_notifiers); + printk_legacy_allow_panic_sync(); + /* * Run any panic handlers, including those that might need to * add information to the kmsg dump output. diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index d087711242de..57e190fbecd7 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -471,7 +471,9 @@ static DEFINE_MUTEX(syslog_lock); static bool have_legacy_console; /* - * Specifies if an nbcon console is registered. + * Specifies if an nbcon console is registered. If nbcon consoles are present, + * synchronous printing of legacy consoles will not occur during panic until + * the backtrace has been stored to the ringbuffer. */ static bool have_nbcon_console; @@ -2330,12 +2332,29 @@ int vprintk_store(int facility, int level, return ret; } +static bool legacy_allow_panic_sync; + +/* + * This acts as a one-way switch to allow legacy consoles to print from + * the printk() caller context on a panic CPU. It also attempts to flush + * the legacy consoles in this context. + */ +void printk_legacy_allow_panic_sync(void) +{ + legacy_allow_panic_sync = true; + + if (printing_via_unlock && !in_nmi()) { + if (console_trylock()) + console_unlock(); + } +} + asmlinkage int vprintk_emit(int facility, int level, const struct dev_printk_info *dev_info, const char *fmt, va_list args) { + bool do_trylock_unlock = printing_via_unlock; int printed_len; - bool in_sched = false; /* Suppress unimportant messages after panic happens */ if (unlikely(suppress_printk)) @@ -2351,15 +2370,42 @@ asmlinkage int vprintk_emit(int facility, int level, if (level == LOGLEVEL_SCHED) { level = LOGLEVEL_DEFAULT; - in_sched = true; + /* If called from the scheduler, we can not call up(). */ + do_trylock_unlock = false; } printk_delay(level); printed_len = vprintk_store(facility, level, dev_info, fmt, args); - /* If called from the scheduler, we can not call up(). */ - if (!in_sched && printing_via_unlock) { + if (have_nbcon_console && !have_boot_console) { + bool is_panic_context = this_cpu_in_panic(); + + /* + * In panic, the legacy consoles are not allowed to print from + * the printk calling context unless explicitly allowed. This + * gives the safe nbcon consoles a chance to print out all the + * panic messages first. This restriction only applies if + * there are nbcon consoles registered. + */ + if (is_panic_context) + do_trylock_unlock &= legacy_allow_panic_sync; + + /* + * There are situations where nbcon atomic printing should + * happen in the printk() caller context: + * + * - When this CPU is in panic. + * + * Note that if boot consoles are registered, the console + * lock/unlock dance must be relied upon instead because nbcon + * consoles cannot print simultaneously with boot consoles. + */ + if (is_panic_context) + nbcon_atomic_flush_pending(); + } + + if (do_trylock_unlock) { /* * The caller may be holding system-critical or * timing-sensitive locks. Disable preemption during @@ -2379,10 +2425,10 @@ asmlinkage int vprintk_emit(int facility, int level, preempt_enable(); } - if (in_sched) - defer_console_output(); - else + if (do_trylock_unlock) wake_up_klogd(); + else + defer_console_output(); return printed_len; } -- 2.39.2