From nobody Mon Sep 8 23:56:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B7F3CC7EE2D for ; Sat, 25 Feb 2023 03:34:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229557AbjBYDe3 (ORCPT ); Fri, 24 Feb 2023 22:34:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49926 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229473AbjBYDe2 (ORCPT ); Fri, 24 Feb 2023 22:34:28 -0500 Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C28422737 for ; Fri, 24 Feb 2023 19:34:26 -0800 (PST) Received: by mail-qt1-x830.google.com with SMTP id z6so1632867qtv.0 for ; Fri, 24 Feb 2023 19:34:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=lTPRVqT9c+Qejh0XjVuubW839LJl+9CnF91VITFhncA=; b=srM0xtNWyXhWb6lmCc+QAgMeBYieaOVdffjZpKGqtNVyWRv2ETLmIGPlyNUgLq5Asa OAMR5V68ZSa+zxLHJ3DOo5yVfY+AmAiKRu3RuDPsb9VI4aQunNjy3/o79t0Vo3dXdPDf D9SKPYhZu/33MVR6CYUlGVu4vOh6PdEFVM7No= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lTPRVqT9c+Qejh0XjVuubW839LJl+9CnF91VITFhncA=; b=Ytzupx64yNqNvM68CS5UD5rn3eqAve4ipOIfr/t3+7ji+bLRDoun55abOV9A30LdfW ndIHqtHTeg9lK1YxNqbKzri8tqXVNokMmMEtPv7MLlpbFpr7ta+QAuuIYg2fZxEXKnE/ z1n6xbqqHlcm8Eejqty7zH3ke0HrQ4JTTTJT+oKDNsdW8mohRAWdSS7BFFhT3BnaHts7 3OhOmZZSZP/GTkcgFXbBG9mhVIKiQz0/mkKLQfI7Ecx5Adeug+M3N7SvFzhis03CmtQQ Rfu5RnOwUizxKoAcgQegvu2GcqE6ndK6eLKRPpke8Gyi8SQX1MdoekC++xmsNeYHD8J2 Gh9A== X-Gm-Message-State: AO0yUKXmVpd2KfnkT7vG4yfPy/aUYbn6yAo9aIi2yisEMxgdnTUCD3XT PsiZ3zOHwCHXpmvpTc5aRIq6nHeYG1N/dFi1 X-Google-Smtp-Source: AK7set8sBZgUP7fgQVLfptauUzyRNyh+EtmS+xyielupZECD18g64E7imQBNQfxaZyGoWJyDLNMFHw== X-Received: by 2002:a05:622a:18f:b0:3b6:2f31:efc4 with SMTP id s15-20020a05622a018f00b003b62f31efc4mr17719729qtw.66.1677296065147; Fri, 24 Feb 2023 19:34:25 -0800 (PST) Received: from joelboxx.c.googlers.com.com (129.239.188.35.bc.googleusercontent.com. [35.188.239.129]) by smtp.gmail.com with ESMTPSA id p186-20020a3742c3000000b0074240840c25sm506403qka.108.2023.02.24.19.34.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 19:34:24 -0800 (PST) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Frederic Weisbecker , Lai Jiangshan , linux-doc@vger.kernel.org, "Paul E. McKenney" , rcu@vger.kernel.org Subject: [PATCH RFC v2] rcu: Add a minimum time for marking boot as completed Date: Sat, 25 Feb 2023 03:34:21 +0000 Message-Id: <20230225033421.3323164-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.39.2.637.g21b0678d19-goog MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" On many systems, a great deal of boot happens after the kernel thinks the b= oot has completed. It is difficult to determine if the system has really booted from the kernel side. Some features like lazy-RCU can risk slowing down boot time if, say, a callback has been added that the boot synchronously depends= on. Further, it is better to boot systems which pass 'rcu_normal_after_boot' to stay expedited for as long as the system is still booting. For these reasons, this commit adds a config option 'CONFIG_RCU_BOOT_END_DELAY' and a boot parameter rcupdate.boot_end_delay. By default, this value is 20s. A system designer can choose to specify a va= lue here to keep RCU from marking boot completion. The boot sequence will not = be marked ended until at least boot_end_delay milliseconds have passed. Signed-off-by: Joel Fernandes (Google) --- v1->v2: Update some comments and description. .../admin-guide/kernel-parameters.txt | 4 +++ cc_list | 7 ++++++ kernel/rcu/Kconfig | 12 +++++++++ kernel/rcu/update.c | 25 +++++++++++++++++-- 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 cc_list diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 2429b5e3184b..0943139fdf01 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -5085,6 +5085,10 @@ rcutorture.verbose=3D [KNL] Enable additional printk() statements. =20 + rcupdate.boot_end_delay=3D [KNL] + Minimum time that must elapse before the boot + sequence can be marked as completed. + rcupdate.rcu_cpu_stall_ftrace_dump=3D [KNL] Dump ftrace buffer after reporting RCU CPU stall warning. diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig index 9071182b1284..0d77006a948f 100644 --- a/kernel/rcu/Kconfig +++ b/kernel/rcu/Kconfig @@ -217,6 +217,18 @@ config RCU_BOOST_DELAY =20 Accept the default if unsure. =20 +config RCU_BOOT_END_DELAY + int "Minimum time before RCU may consider in-kernel boot as completed" + range 0 120000 + default 20000 + help + This option specifies the minimum time in milliseconds from boot start + before RCU believes boot has completed. The actual delay can be + higher than this if the kernel takes a long time to initialize + but it will never be smaller than this. + + Accept the default if unsure. + config RCU_EXP_KTHREAD bool "Perform RCU expedited work in a real-time kthread" depends on RCU_BOOST && RCU_EXPERT diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 19bf6fa3ee6a..cbdad7b46841 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c @@ -62,6 +62,10 @@ module_param(rcu_normal_after_boot, int, 0444); #endif #endif /* #ifndef CONFIG_TINY_RCU */ =20 +/* Minimum time in ms until RCU can consider in-kernel boot as completed. = */ +static int boot_end_delay =3D CONFIG_RCU_BOOT_END_DELAY; +module_param(boot_end_delay, int, 0444); + #ifdef CONFIG_DEBUG_LOCK_ALLOC /** * rcu_read_lock_held_common() - might we be in RCU-sched read-side critic= al section? @@ -225,12 +229,29 @@ void rcu_unexpedite_gp(void) EXPORT_SYMBOL_GPL(rcu_unexpedite_gp); =20 static bool rcu_boot_ended __read_mostly; - /* - * Inform RCU of the end of the in-kernel boot sequence. + * Inform RCU of the end of the in-kernel boot sequence. The boot sequence= will + * not be marked ended until at least boot_end_delay milliseconds have pas= sed. */ +void rcu_end_inkernel_boot(void); +static void boot_rcu_work_fn(struct work_struct *work) +{ + rcu_end_inkernel_boot(); +} +static DECLARE_DELAYED_WORK(boot_rcu_work, boot_rcu_work_fn); + void rcu_end_inkernel_boot(void) { + if (boot_end_delay) { + u64 boot_ms =3D ktime_get_boot_fast_ns() / 1000000UL; + + if (boot_ms < boot_end_delay) { + schedule_delayed_work(&boot_rcu_work, + boot_end_delay - boot_ms); + return; + } + } + rcu_unexpedite_gp(); rcu_async_relax(); if (rcu_normal_after_boot) --=20 2.39.2.637.g21b0678d19-goog