Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp7628431rwr; Wed, 10 May 2023 10:26:22 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ65JqhvUASgDuiW4V2/uTEixKEcc8ZNaERsSRS4y/9QkphjCkelAQFmyHj/N9dpMkJirogb X-Received: by 2002:a17:902:ed8e:b0:1a9:765c:77ac with SMTP id e14-20020a170902ed8e00b001a9765c77acmr18379715plj.7.1683739581908; Wed, 10 May 2023 10:26:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683739581; cv=none; d=google.com; s=arc-20160816; b=bi6OKcrciZluqr5R8qvMXctxyWci26kAD1MMmYcmrm+A4gk76tpzjC5xfR6IfnmWy/ aY/yJAIy+eOjz7uql4wBoWfDQ+FqIGsgwof6U9J0OmbUfW/cbF9n7Yw2NFrB8laB7DSl KSjNOI7OCBYuDQ+AWzAkohjUeZoezsxywDppz58r3VEe3W0rlyGAC4IX8BhTco14AyoH M7t0908HUYXNQGVSpHfu0Oo1YVZUutTy1mizRxJYlxhsLpcbWJRgHOqwGGBoEfYrvOYF LCP2AGkksyRtnLp+5m+++VQMyrZM8HY+rl9lCMnBlaRlkInSYvODnW3fYEAbkrzukfqT fehQ== 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=TwiF+QjZv2z2Bxu/IGRhBK+dnA0wmR/QDsvLqO2LWSQ=; b=d7rewLDBNbw0okBVlkGiuQY6IICPFrp61z9zGPuF2VGZO0Idf2wagdtI3PCBmBR9kL zQvBuKI5fYqc3DJ3pfeQnc62iiaB6Ki8LfRbBL83U+pTWn8TvUPWSSkxB7R4/7M8uOX7 UsmdgUQXP8/BSO+Vigsam4r5PSn58b0kkDjQqCs4NA6cnMAv4LCy559g6FWTpZyzuW5x ldpKqn0CVvgNQgE38uQV+M4gNIjilyE6QlTSFs803y7orJq7x+TQiZVojqdxgLMDbfef vXmYBbjsA27xyqN0PSkX6cRMfrc+02a7HD+P5db6FkoYDqD3GohSX1/WiGBcqWIWbSY0 ENQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=hwaz01Rx; 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 j7-20020a170902da8700b001ac910345d9si4735976plx.589.2023.05.10.10.26.07; Wed, 10 May 2023 10:26:21 -0700 (PDT) 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=hwaz01Rx; 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 S236339AbjEJRGb (ORCPT + 99 others); Wed, 10 May 2023 13:06:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49918 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236319AbjEJRGX (ORCPT ); Wed, 10 May 2023 13:06:23 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D0A70A8; Wed, 10 May 2023 10:06:11 -0700 (PDT) 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 352D163F2F; Wed, 10 May 2023 17:06:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 88A69C433D2; Wed, 10 May 2023 17:06:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1683738370; bh=XH5sB07f3Ey9Nxv2UrTDaQPS9YGvRkyAeAe39j1qiZg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hwaz01RxSf5T8D6+ZZpqvWlINKfEHlDRz/ABaTt1G1sGGGfhJx4n2w29hOaNxWGIm Jxtfn5KGGnL/LOS+HDItbHCrRKnfeJpQAYDOTvkHG+6/dayMtQjv2B/scYCtI5HmPC 0GJ2bTDErbVBuQlPk3Z/iS7mnNZEOekQcqlkG+CFhfVKmLzEE/xjDH48uPeS4yPSvj nBT8tj+IOKOo+RiYSCgw4dprENveCuFMsC1M73Bo+tYJiUXwyQsj5lwh9DteNLkGWa eS7hpqr2yLr12VOFpv4EVvCm4jUWBexqcMNj35teRBAfM5S4ptaYZGQPya7zUqiJvj HD2FrfZQyHzJw== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 2F6C4CE1279; Wed, 10 May 2023 10:06:10 -0700 (PDT) From: "Paul E. McKenney" To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, rostedt@goodmis.org, Frederic Weisbecker , "Paul E . McKenney" Subject: [PATCH rcu 2/4] rcu/nocb: Fix shrinker race against callback enqueuer Date: Wed, 10 May 2023 10:06:05 -0700 Message-Id: <20230510170607.2187978-2-paulmck@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <9c5fae22-e25e-4548-b6e9-117495b29e62@paulmck-laptop> References: <9c5fae22-e25e-4548-b6e9-117495b29e62@paulmck-laptop> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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: Frederic Weisbecker The shrinker resets the lazy callbacks counter in order to trigger the pending lazy queue flush though the rcuog kthread. The counter reset is protected by the ->nocb_lock against concurrent accesses...except for one of them. Here is a list of existing synchronized readers/writer: 1) The first lazy enqueuer (incrementing ->lazy_len to 1) does so under ->nocb_lock and ->nocb_bypass_lock. 2) The further lazy enqueuers (incrementing ->lazy_len above 1) do so under ->nocb_bypass_lock _only_. 3) The lazy flush checks and resets to 0 under ->nocb_lock and ->nocb_bypass_lock. The shrinker protects its ->lazy_len reset against cases 1) and 3) but not against 2). As such, setting ->lazy_len to 0 under the ->nocb_lock may be cancelled right away by an overwrite from an enqueuer, leading rcuog to ignore the flush. To avoid that, use the proper bypass flush API which takes care of all those details. Signed-off-by: Frederic Weisbecker Signed-off-by: Paul E. McKenney --- kernel/rcu/tree_nocb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h index 1a86883902ce..c321fce2af8e 100644 --- a/kernel/rcu/tree_nocb.h +++ b/kernel/rcu/tree_nocb.h @@ -1364,7 +1364,7 @@ lazy_rcu_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) continue; rcu_nocb_lock_irqsave(rdp, flags); - WRITE_ONCE(rdp->lazy_len, 0); + WARN_ON_ONCE(!rcu_nocb_flush_bypass(rdp, NULL, jiffies, false)); rcu_nocb_unlock_irqrestore(rdp, flags); wake_nocb_gp(rdp, false); sc->nr_to_scan -= _count; -- 2.40.1