Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp2817016rwb; Wed, 30 Nov 2022 11:14:17 -0800 (PST) X-Google-Smtp-Source: AA0mqf48geY7P6OuiHNfXwozKHOvLE1quRQ8TRkUeWjO4gbKBYS+xcNEwamcuUQO8aCs/DAv0cL5 X-Received: by 2002:a17:906:32d1:b0:7b2:af38:ef00 with SMTP id k17-20020a17090632d100b007b2af38ef00mr50628198ejk.546.1669835657639; Wed, 30 Nov 2022 11:14:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669835657; cv=none; d=google.com; s=arc-20160816; b=ESWvQhpXMJgFhlX8kki8u1I7wqeimkTg/oEZRDGgBOpYTJlEiNg3jeMFqZTWg0VTVd j44854hNVRKm19mTUfEsC1QCuB979RWKrOuOn9ajr8Vf6Srt8z6yLaL/bu6WioRpKZk3 tbfsSZV5rhElrydYNfa8BbfxOt57UcmxOCwpYQGBPk7XTcvuICfFMmjv9WzNVsqGwRt0 eugcZfVoz5akfMvfszR5CfVDf/SamgZqDMnHWgtm08PiM/gae6o25xlF5vp5d9LnwM/r sidHrxsoOxNy4X2Dx9UmvPSJKKg0vOu69tN6SatVG6oHNeNUOpBWQ1Ne+hH1DJNmknHS 48jQ== 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=ozKhBfyN+FxyuLIwEkPQLFxihGTESoRyKpstG62wPHM=; b=a6uSfbQVxYsi0B/4Sd3F/7r3MYGAfvm3Hz8VCVh6Qv+8DF4LNmeLeFCW0lNIX2fpe2 3Hee1UjCAIJtwSdtjdwgWDMHCxO/AK/Nz7meNAf7s8aXl7DDaDhS2EmRSsdSoT9SfWyU lI4enZnqIEzmbs0jlWx4c6G62nG+97t4m1Olsmw4fs1fpA+/K9h790RI9G/hIm25vB/3 q4En8DqW9XJUBtaqOlimzOBbn509EIpuFIOcr5RhtArSqCXlqR14o+EtBoPMJTLXfjTa n6WT0Fi4MnsaB4sUPklr2dJpjtFEElq7WJB4s32fQkl7+cJw8OHDqTW8t7wRBfSKLwjW 7UOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=oZ4GteHy; 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 s7-20020a056402520700b00469a9937122si2136920edd.111.2022.11.30.11.13.56; Wed, 30 Nov 2022 11:14:17 -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=oZ4GteHy; 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 S230203AbiK3SOB (ORCPT + 83 others); Wed, 30 Nov 2022 13:14:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230116AbiK3SNb (ORCPT ); Wed, 30 Nov 2022 13:13:31 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57740862D2; Wed, 30 Nov 2022 10:13:30 -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 ams.source.kernel.org (Postfix) with ESMTPS id 03D24B81C97; Wed, 30 Nov 2022 18:13:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A9F05C433B5; Wed, 30 Nov 2022 18:13:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1669832007; bh=JgCYhsIq4xhCHA9e/N+ivpZlC63szLfECFNNQENWSoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oZ4GteHyu0gnGxMqABOVcD9Dxi6EMrRfdI/0I+c/8WyoaHzOcbNuRXFJercOt1gc5 DR2zF2t2Ypo/uoW4J3F9Ugza4XapYc8PzYoLGvRx35iR/YPJEIfMdtbT6JhOA/0C4p +4yYw6R0d+oZL57J4aUMt+1BSDQIUVvchk6C6SiUlSSQaA8qMhPZTR5ttBhLXO2Ity F8H7YhHPEywYMXW8xmoYYAwbOsggnSs0NCj5JTKqRIUpie6OMDOtE6bWlyFhUBF80G Y3oGpYjoZG8xvSVwnv6stpFfPc3dCDqTTHocOKrlg3T9NW38YNhnqsgfS1wNMxJLfn +OQFbdWwP8ECg== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 59E9E5C0863; Wed, 30 Nov 2022 10:13:27 -0800 (PST) From: "Paul E. McKenney" To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, rostedt@goodmis.org, Frederic Weisbecker , Joel Fernandes , "Paul E . McKenney" Subject: [PATCH rcu 03/16] rcu: Fix missing nocb gp wake on rcu_barrier() Date: Wed, 30 Nov 2022 10:13:12 -0800 Message-Id: <20221130181325.1012760-3-paulmck@kernel.org> X-Mailer: git-send-email 2.31.1.189.g2e36527f23 In-Reply-To: <20221130181316.GA1012431@paulmck-ThinkPad-P17-Gen-1> References: <20221130181316.GA1012431@paulmck-ThinkPad-P17-Gen-1> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,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: Frederic Weisbecker In preparation for RCU lazy changes, wake up the RCU nocb gp thread if needed after an entrain. This change prevents the RCU barrier callback from waiting in the queue for several seconds before the lazy callbacks in front of it are serviced. Reported-by: Joel Fernandes (Google) Signed-off-by: Frederic Weisbecker Signed-off-by: Joel Fernandes (Google) Signed-off-by: Paul E. McKenney --- kernel/rcu/tree.c | 11 +++++++++++ kernel/rcu/tree.h | 1 + kernel/rcu/tree_nocb.h | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 6bb8e72bc8151..fb7a1b95af71e 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3894,6 +3894,8 @@ static void rcu_barrier_entrain(struct rcu_data *rdp) { unsigned long gseq = READ_ONCE(rcu_state.barrier_sequence); unsigned long lseq = READ_ONCE(rdp->barrier_seq_snap); + bool wake_nocb = false; + bool was_alldone = false; lockdep_assert_held(&rcu_state.barrier_lock); if (rcu_seq_state(lseq) || !rcu_seq_state(gseq) || rcu_seq_ctr(lseq) != rcu_seq_ctr(gseq)) @@ -3902,7 +3904,14 @@ static void rcu_barrier_entrain(struct rcu_data *rdp) rdp->barrier_head.func = rcu_barrier_callback; debug_rcu_head_queue(&rdp->barrier_head); rcu_nocb_lock(rdp); + /* + * Flush bypass and wakeup rcuog if we add callbacks to an empty regular + * queue. This way we don't wait for bypass timer that can reach seconds + * if it's fully lazy. + */ + was_alldone = rcu_rdp_is_offloaded(rdp) && !rcu_segcblist_pend_cbs(&rdp->cblist); WARN_ON_ONCE(!rcu_nocb_flush_bypass(rdp, NULL, jiffies)); + wake_nocb = was_alldone && rcu_segcblist_pend_cbs(&rdp->cblist); if (rcu_segcblist_entrain(&rdp->cblist, &rdp->barrier_head)) { atomic_inc(&rcu_state.barrier_cpu_count); } else { @@ -3910,6 +3919,8 @@ static void rcu_barrier_entrain(struct rcu_data *rdp) rcu_barrier_trace(TPS("IRQNQ"), -1, rcu_state.barrier_sequence); } rcu_nocb_unlock(rdp); + if (wake_nocb) + wake_nocb_gp(rdp, false); smp_store_release(&rdp->barrier_seq_snap, gseq); } diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index d4a97e40ea9c3..925dd98f8b23b 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -439,6 +439,7 @@ static void zero_cpu_stall_ticks(struct rcu_data *rdp); static struct swait_queue_head *rcu_nocb_gp_get(struct rcu_node *rnp); static void rcu_nocb_gp_cleanup(struct swait_queue_head *sq); static void rcu_init_one_nocb(struct rcu_node *rnp); +static bool wake_nocb_gp(struct rcu_data *rdp, bool force); static bool rcu_nocb_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp, unsigned long j); static bool rcu_nocb_try_bypass(struct rcu_data *rdp, struct rcu_head *rhp, diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h index f77a6d7e13564..094fd454b6c38 100644 --- a/kernel/rcu/tree_nocb.h +++ b/kernel/rcu/tree_nocb.h @@ -1558,6 +1558,11 @@ static void rcu_init_one_nocb(struct rcu_node *rnp) { } +static bool wake_nocb_gp(struct rcu_data *rdp, bool force) +{ + return false; +} + static bool rcu_nocb_flush_bypass(struct rcu_data *rdp, struct rcu_head *rhp, unsigned long j) { -- 2.31.1.189.g2e36527f23