Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp5186761rwb; Mon, 21 Nov 2022 18:17:42 -0800 (PST) X-Google-Smtp-Source: AA0mqf7jqOHhXcTSPoY2NFR1/MyTmdXpVs/eKBXjd7NSVETUJdQDkE6utBnddVy2Ba2GEzL9hi1i X-Received: by 2002:a63:ce0e:0:b0:457:dced:8ba9 with SMTP id y14-20020a63ce0e000000b00457dced8ba9mr6068308pgf.221.1669083461891; Mon, 21 Nov 2022 18:17:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669083461; cv=none; d=google.com; s=arc-20160816; b=u0M2vUZrQuR0O/pX3azW6LgVCfxfdcWt9BDql7VLAYGRuosSPfmqCYY0c6yR1TwSJY rkcnpMstjRgeVfSADWnLi75gtjUOLv8Pu0wQ5tFl/F3Mph0ivw9mxhT29Ft8HqX+/mzB Tn8uPp+Ptl4b8Ha14t7VD9zvS2nTV+yjACI0ISMcSurKcnasBWvjqxLuJiZjTPZSBHDr +Lfk0A1brW055KqrgCZFK5p0eGR41xO7jTm3JNkAzcVmnSVqeScvTvU9sUFwo1l5MKBu Jij24d22Ho3QixRBx1gVkBUM4G89LReZxG1e33juNcm2CAziJMCWMvjVwHCsqW+IXc5A RqWQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=KpkkHRs6NSlaA30zXYSvuq9VaM3mDcAD5+jXqlQvvlo=; b=r8XEZ2LHGqeMdIKZE3MTo1qfukFJIdsEyGoR3raIz7W+T1IOuC86II1TOeMswf9Olt 1BxspDZ7Q+jUm3IDqRrbccuntIFCWBCZMgRrzYDsx03vkY2/Dlv8HGUe/BjgwegRLi+s 14JoSL/LKNsH6ABvhK1AjM/FGpYuPYXkvgEzxWGItmYPzUcy4JcUb9DVoXk0MTgBGaLX Vl9xh/yB1TlQ63fQ+RT+worCN7SBDDplD03AoB8fEzbK/jYGD7TRprbKGZHHa6TQVeQ4 GrIVTc2DzPhepvpxsOD8QJdR649o52WmRyMjbWyC9Fs3C9J9gEic/Np9BmEcRF7khKMq Mygw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=l80XZpuR; 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=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ng4-20020a17090b1a8400b00218cf92fc62si343922pjb.89.2022.11.21.18.17.28; Mon, 21 Nov 2022 18:17:41 -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=@kernel.org header.s=k20201202 header.b=l80XZpuR; 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=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232070AbiKVBEm (ORCPT + 91 others); Mon, 21 Nov 2022 20:04:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44808 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231935AbiKVBEZ (ORCPT ); Mon, 21 Nov 2022 20:04:25 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A08CADE9A; Mon, 21 Nov 2022 17:04:24 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id F0AE06151C; Tue, 22 Nov 2022 01:04:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1A663C43151; Tue, 22 Nov 2022 01:04:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1669079063; bh=hIFNQHcIbY8YtBkmBJx5icL1buQHNTtIxJeozRTrMW8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l80XZpuRLUSSJsfBa+XlMP4gcQbNsw2NpaOiGOrWZDuoa2xpSHx4WmtNaVKRVe8O0 ZylXtgqWLL1Aof0vdX+L2M+9DM8OvANGbU/rLbX47UnsyD8H3pj1PARWK+P2skct8K sahbDCb47N+kfh7+vnqWmpMsjiEa/X9Fj66FDAXbXTv4xk3y0DVadRw18JldcpDO4d PKKT8fidKmlnBctadwf/v+xZWx1iyBlGYGs4DkXI5nuL7qy2+/vrFszkhlFCXlufO3 NljYnSE3YelGoIzCERzGJg014E5/c76UNpkHnNQwaLDuw+1uXCPn1p+Uk4F7p8GU/a AFvJewBwASYmA== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 7BA6B5C1219; Mon, 21 Nov 2022 17:04:22 -0800 (PST) From: "Paul E. McKenney" To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, rostedt@goodmis.org, Vineeth Pillai , Joel Fernandes , "Paul E . McKenney" Subject: [PATCH v2 rcu 06/16] rcu: Shrinker for lazy rcu Date: Mon, 21 Nov 2022 17:04:11 -0800 Message-Id: <20221122010421.3799681-6-paulmck@kernel.org> X-Mailer: git-send-email 2.31.1.189.g2e36527f23 In-Reply-To: <20221122010408.GA3799268@paulmck-ThinkPad-P17-Gen-1> References: <20221122010408.GA3799268@paulmck-ThinkPad-P17-Gen-1> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, 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 From: Vineeth Pillai The shrinker is used to speed up the free'ing of memory potentially held by RCU lazy callbacks. RCU kernel module test cases show this to be effective. Test is introduced in a later patch. Signed-off-by: Vineeth Pillai Signed-off-by: Joel Fernandes (Google) Signed-off-by: Paul E. McKenney --- kernel/rcu/tree_nocb.h | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h index 213daf81c057f..9e1c8caec5ceb 100644 --- a/kernel/rcu/tree_nocb.h +++ b/kernel/rcu/tree_nocb.h @@ -1312,6 +1312,55 @@ int rcu_nocb_cpu_offload(int cpu) } EXPORT_SYMBOL_GPL(rcu_nocb_cpu_offload); +static unsigned long +lazy_rcu_shrink_count(struct shrinker *shrink, struct shrink_control *sc) +{ + int cpu; + unsigned long count = 0; + + /* Snapshot count of all CPUs */ + for_each_possible_cpu(cpu) { + struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); + + count += READ_ONCE(rdp->lazy_len); + } + + return count ? count : SHRINK_EMPTY; +} + +static unsigned long +lazy_rcu_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) +{ + int cpu; + unsigned long flags; + unsigned long count = 0; + + /* Snapshot count of all CPUs */ + for_each_possible_cpu(cpu) { + struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); + int _count = READ_ONCE(rdp->lazy_len); + + if (_count == 0) + continue; + rcu_nocb_lock_irqsave(rdp, flags); + WRITE_ONCE(rdp->lazy_len, 0); + rcu_nocb_unlock_irqrestore(rdp, flags); + wake_nocb_gp(rdp, false); + sc->nr_to_scan -= _count; + count += _count; + if (sc->nr_to_scan <= 0) + break; + } + return count ? count : SHRINK_STOP; +} + +static struct shrinker lazy_rcu_shrinker = { + .count_objects = lazy_rcu_shrink_count, + .scan_objects = lazy_rcu_shrink_scan, + .batch = 0, + .seeks = DEFAULT_SEEKS, +}; + void __init rcu_init_nohz(void) { int cpu; @@ -1342,6 +1391,9 @@ void __init rcu_init_nohz(void) if (!rcu_state.nocb_is_setup) return; + if (register_shrinker(&lazy_rcu_shrinker, "rcu-lazy")) + pr_err("Failed to register lazy_rcu shrinker!\n"); + if (!cpumask_subset(rcu_nocb_mask, cpu_possible_mask)) { pr_info("\tNote: kernel parameter 'rcu_nocbs=', 'nohz_full', or 'isolcpus=' contains nonexistent CPUs.\n"); cpumask_and(rcu_nocb_mask, cpu_possible_mask, -- 2.31.1.189.g2e36527f23