Message ID | 20231128080033.288050-6-urezki@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce62:0:b0:403:3b70:6f57 with SMTP id o2csp3751616vqx; Tue, 28 Nov 2023 00:01:38 -0800 (PST) X-Google-Smtp-Source: AGHT+IHv2bReC4RP1rzcpoAsxDep8UgjtkL7Xwk/wtoh1JfCzyfgvdNswBoj1bjM/wgoLz2IZ519 X-Received: by 2002:a17:902:ecc2:b0:1cf:fa40:379d with SMTP id a2-20020a170902ecc200b001cffa40379dmr959948plh.42.1701158497973; Tue, 28 Nov 2023 00:01:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701158497; cv=none; d=google.com; s=arc-20160816; b=X2n30wMM39P5kwPpX7OhNmKW0kfdLabtd0etvbQwottCPz3AWPnaA18IDIXO4bwr0C mhph1FCMR/4ptZSaJezmjTm1Kc7bOxfFPgEcKvpP+TMDTXdog47ENyxdh9G/6QRqZhd5 u3sB1WTi4lCvUguvGG2ZiF+iI0RIGMlQZu7HpbtXRb2BdIxJMK4ttqZerd7wTsgxBWcI ZOXpcNoirqVr9FukCsGKHxK45adomZXBHR6I81qvgjNyZ2rPQnOcpQE4Bbbwy4LbHtlV J3aKugzIU6n9/5CJCUEJXWBQmkGIS9W2vrjZV6pOqeIzG09bAvSGElx24cmb0DCMsxnx vUaQ== 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=MRdqwIFL2uVW5SxPC7i3fG3JaqKAc+zofDkQy5XD79k=; fh=4iZcRCmzpaCZKgp7nvxh/m3AX3kfm//yPbGO/jIXleI=; b=dPCkogOSFsYKidfRf5KDd+sXa3bON+wa23CfuTn9SCzGEt/5DxmOE0ZSQtS2lQzHA1 yxB9q4MsX7WfueSFiXW1KkilndueWfDZngXt15Nj57wlzrSBnxNOajFYUXV6IG0gNZaO 0vzxxN4AuKZnM5xHc3E9OVA6HtNuAKcoeT4bncbBbLCYUZG6d/KxTo0+M7cM6KpdhKU/ bQ0+5LPJwjY3dHS9CEojL7forPIxpgIJa1HEmIvJqL0dtofXiCiY3jDj18y5+4pspWXN QNgccNxtw6wU5x2Otnv8uHjzwZm/h1cCxFjZak+1/I9dM6ArpBYVvcWlsRYG6ZiAy9MU of1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=LfhBQkt4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id p14-20020a170902e74e00b001cff62f4c75si1222616plf.53.2023.11.28.00.01.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Nov 2023 00:01:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=LfhBQkt4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id C8A5D804E6AF; Tue, 28 Nov 2023 00:01:24 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343990AbjK1IBG (ORCPT <rfc822;toshivichauhan@gmail.com> + 99 others); Tue, 28 Nov 2023 03:01:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343963AbjK1IAh (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 28 Nov 2023 03:00:37 -0500 Received: from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com [IPv6:2a00:1450:4864:20::12c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75B4CB6; Tue, 28 Nov 2023 00:00:42 -0800 (PST) Received: by mail-lf1-x12c.google.com with SMTP id 2adb3069b0e04-50abb83866bso6932977e87.3; Tue, 28 Nov 2023 00:00:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701158441; x=1701763241; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MRdqwIFL2uVW5SxPC7i3fG3JaqKAc+zofDkQy5XD79k=; b=LfhBQkt4wO0EbJX2OvRJREaSOnZEbNUkktBqO1TRXMgOZ8ds3NkB2YsMFzPlLmtLmY wBk5SyDZy4tQiciLSbv791qs56flA+8XRMJWbgrxJpNkrrxeskv8H37gkmRmXazphcW6 LKXj14loIRF0rTWMV3GuAPUcWNBh+zBL4m7U2N7+uV4CiHJ68Dx3VCYaBso3Me3B3bWw /RcXClN2pPmQTsf68A0giys4f+DhwnkRwgj3P0rtheFnll0oxTVLLYIShtYIK/3gzGuU J3dtw/zqc3IFuy8nEHs0+yXdh4JesRQmrhUnI8Y8kr66mf74JoQ00UN0XGDyI+mBpN+W WjBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701158441; x=1701763241; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MRdqwIFL2uVW5SxPC7i3fG3JaqKAc+zofDkQy5XD79k=; b=V4x4lDDxhXBTebb9mjzmNjFdURqOPPLqJ0nae87okG7YgDDgEeGIMrlg1GnE1lxPRf W61rBva6utkhWmIke7xMzVc9r/KL5qi5CCFjnuV8XZpyDcLxGAMoJnwN2w63HSR1qZ1O hC3SXFi+foFgmdJBkrVhq1H1ClRfSLqF4MItDZzfciz5CC0WqVm4AaO36M6r2daHoJGp +blkhDEFNrFuLN3sjPLe+GUqGVzFRVPU2uOrcClQUgEZ/wnKQkMrgj+eC8amFrLlPsRc ocRQhfXOquleSMbecCFbEOJV/Yd+ZNl8BAzvZKjEDRjeDlbbdm7YCiM82JrVPdI7NnMk q/wA== X-Gm-Message-State: AOJu0YwTvdclA3soNl3y+WeV1FDYoNe4lDqvFwTdcK3ujOwnUSO4utk0 Wp5Q+GORhIVVBGSaTga2nG0= X-Received: by 2002:a05:6512:1282:b0:50b:ae9f:bf9c with SMTP id u2-20020a056512128200b0050bae9fbf9cmr5286278lfs.55.1701158440567; Tue, 28 Nov 2023 00:00:40 -0800 (PST) Received: from pc638.lan ([155.137.26.201]) by smtp.gmail.com with ESMTPSA id o16-20020ac24bd0000000b004fe202a5c7csm1765501lfq.135.2023.11.28.00.00.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Nov 2023 00:00:40 -0800 (PST) From: "Uladzislau Rezki (Sony)" <urezki@gmail.com> To: "Paul E . McKenney" <paulmck@kernel.org> Cc: RCU <rcu@vger.kernel.org>, Neeraj upadhyay <Neeraj.Upadhyay@amd.com>, Boqun Feng <boqun.feng@gmail.com>, Hillf Danton <hdanton@sina.com>, Joel Fernandes <joel@joelfernandes.org>, LKML <linux-kernel@vger.kernel.org>, Uladzislau Rezki <urezki@gmail.com>, Oleksiy Avramchenko <oleksiy.avramchenko@sony.com>, Frederic Weisbecker <frederic@kernel.org> Subject: [PATCH v3 5/7] rcu: Support direct wake-up of synchronize_rcu() users Date: Tue, 28 Nov 2023 09:00:31 +0100 Message-Id: <20231128080033.288050-6-urezki@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231128080033.288050-1-urezki@gmail.com> References: <20231128080033.288050-1-urezki@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 28 Nov 2023 00:01:24 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783793973138841903 X-GMAIL-MSGID: 1783793973138841903 |
Series |
Reduce synchronize_rcu() latency(V3)
|
|
Commit Message
Uladzislau Rezki
Nov. 28, 2023, 8 a.m. UTC
This patch introduces a small enhancement which allows to do a
direct wake-up of synchronize_rcu() callers. It occurs after a
completion of grace period, thus by the gp-kthread.
Number of clients is limited by the hard-coded maximum allowed
threshold. The remaining part, if still exists is deferred to
a main worker.
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
kernel/rcu/tree.c | 39 +++++++++++++++++++++++++++++++++++++--
1 file changed, 37 insertions(+), 2 deletions(-)
Comments
On Tue, Nov 28, 2023 at 09:00:31AM +0100, Uladzislau Rezki (Sony) wrote: > This patch introduces a small enhancement which allows to do a > direct wake-up of synchronize_rcu() callers. It occurs after a > completion of grace period, thus by the gp-kthread. > > Number of clients is limited by the hard-coded maximum allowed > threshold. The remaining part, if still exists is deferred to > a main worker. > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Nice optimization! One question below. > --- > kernel/rcu/tree.c | 39 +++++++++++++++++++++++++++++++++++++-- > 1 file changed, 37 insertions(+), 2 deletions(-) > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index d7b48996825f..69663a6d5050 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -1384,6 +1384,12 @@ static void rcu_poll_gp_seq_end_unlocked(unsigned long *snap) > raw_spin_unlock_irqrestore_rcu_node(rnp, flags); > } > > +/* > + * A max threshold for synchronize_rcu() users which are > + * awaken directly by the rcu_gp_kthread(). Left part is > + * deferred to the main worker. > + */ > +#define SR_MAX_USERS_WAKE_FROM_GP 5 > #define SR_NORMAL_GP_WAIT_HEAD_MAX 5 > > struct sr_wait_node { > @@ -1617,7 +1623,8 @@ static DECLARE_WORK(sr_normal_gp_cleanup, rcu_sr_normal_gp_cleanup_work); > */ > static void rcu_sr_normal_gp_cleanup(void) > { > - struct llist_node *wait_tail; > + struct llist_node *wait_tail, *head, *rcu; > + int done = 0; > > wait_tail = sr.srs_wait_tail; > if (wait_tail == NULL) > @@ -1626,11 +1633,39 @@ static void rcu_sr_normal_gp_cleanup(void) > sr.srs_wait_tail = NULL; > ASSERT_EXCLUSIVE_WRITER(sr.srs_wait_tail); > > + WARN_ON_ONCE(!rcu_sr_is_wait_head(wait_tail)); > + head = wait_tail->next; > + > + /* > + * Process (a) and (d) cases. See an illustration. Apart of > + * that it handles the scenario when all clients are done, > + * wait-head is released if last. The worker is not kicked. > + */ > + llist_for_each_safe(rcu, head, head) { This does appear to be a clever way to save eight bytes on the stack, but is our stack space really so restricted? We are being invoked from the RCU GP kthread, which isn't using much stack, right? If so, let's spend the extra local variable and spare the reader a trip to the llist_for_each_safe() definition. > + if (rcu_sr_is_wait_head(rcu)) { > + if (!rcu->next) { > + rcu_sr_put_wait_head(rcu); > + wait_tail->next = NULL; > + } else { > + wait_tail->next = rcu; > + } > + > + break; > + } > + > + rcu_sr_normal_complete(rcu); > + // It can be last, update a next on this step. > + wait_tail->next = head; > + > + if (++done == SR_MAX_USERS_WAKE_FROM_GP) > + break; > + } > + > // concurrent sr_normal_gp_cleanup work might observe this update. > smp_store_release(&sr.srs_done_tail, wait_tail); > ASSERT_EXCLUSIVE_WRITER(sr.srs_done_tail); > > - if (wait_tail) > + if (wait_tail->next) > queue_work(system_highpri_wq, &sr_normal_gp_cleanup); > } > > -- > 2.39.2 >
On Tue, Dec 19, 2023 at 05:46:11PM -0800, Paul E. McKenney wrote: > On Tue, Nov 28, 2023 at 09:00:31AM +0100, Uladzislau Rezki (Sony) wrote: > > This patch introduces a small enhancement which allows to do a > > direct wake-up of synchronize_rcu() callers. It occurs after a > > completion of grace period, thus by the gp-kthread. > > > > Number of clients is limited by the hard-coded maximum allowed > > threshold. The remaining part, if still exists is deferred to > > a main worker. > > > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> > > Nice optimization! > > One question below. > > > --- > > kernel/rcu/tree.c | 39 +++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 37 insertions(+), 2 deletions(-) > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index d7b48996825f..69663a6d5050 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -1384,6 +1384,12 @@ static void rcu_poll_gp_seq_end_unlocked(unsigned long *snap) > > raw_spin_unlock_irqrestore_rcu_node(rnp, flags); > > } > > > > +/* > > + * A max threshold for synchronize_rcu() users which are > > + * awaken directly by the rcu_gp_kthread(). Left part is > > + * deferred to the main worker. > > + */ > > +#define SR_MAX_USERS_WAKE_FROM_GP 5 > > #define SR_NORMAL_GP_WAIT_HEAD_MAX 5 > > > > struct sr_wait_node { > > @@ -1617,7 +1623,8 @@ static DECLARE_WORK(sr_normal_gp_cleanup, rcu_sr_normal_gp_cleanup_work); > > */ > > static void rcu_sr_normal_gp_cleanup(void) > > { > > - struct llist_node *wait_tail; > > + struct llist_node *wait_tail, *head, *rcu; > > + int done = 0; > > > > wait_tail = sr.srs_wait_tail; > > if (wait_tail == NULL) > > @@ -1626,11 +1633,39 @@ static void rcu_sr_normal_gp_cleanup(void) > > sr.srs_wait_tail = NULL; > > ASSERT_EXCLUSIVE_WRITER(sr.srs_wait_tail); > > > > + WARN_ON_ONCE(!rcu_sr_is_wait_head(wait_tail)); > > + head = wait_tail->next; > > + > > + /* > > + * Process (a) and (d) cases. See an illustration. Apart of > > + * that it handles the scenario when all clients are done, > > + * wait-head is released if last. The worker is not kicked. > > + */ > > + llist_for_each_safe(rcu, head, head) { > > This does appear to be a clever way to save eight bytes on the stack, > but is our stack space really so restricted? We are being invoked from > the RCU GP kthread, which isn't using much stack, right? > > If so, let's spend the extra local variable and spare the reader a > trip to the llist_for_each_safe() definition. > OK, you mean to go with an extra "next" variable to use it in the llist-loop. I will change it accordingly! -- Uladzislau Rezki
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index d7b48996825f..69663a6d5050 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -1384,6 +1384,12 @@ static void rcu_poll_gp_seq_end_unlocked(unsigned long *snap) raw_spin_unlock_irqrestore_rcu_node(rnp, flags); } +/* + * A max threshold for synchronize_rcu() users which are + * awaken directly by the rcu_gp_kthread(). Left part is + * deferred to the main worker. + */ +#define SR_MAX_USERS_WAKE_FROM_GP 5 #define SR_NORMAL_GP_WAIT_HEAD_MAX 5 struct sr_wait_node { @@ -1617,7 +1623,8 @@ static DECLARE_WORK(sr_normal_gp_cleanup, rcu_sr_normal_gp_cleanup_work); */ static void rcu_sr_normal_gp_cleanup(void) { - struct llist_node *wait_tail; + struct llist_node *wait_tail, *head, *rcu; + int done = 0; wait_tail = sr.srs_wait_tail; if (wait_tail == NULL) @@ -1626,11 +1633,39 @@ static void rcu_sr_normal_gp_cleanup(void) sr.srs_wait_tail = NULL; ASSERT_EXCLUSIVE_WRITER(sr.srs_wait_tail); + WARN_ON_ONCE(!rcu_sr_is_wait_head(wait_tail)); + head = wait_tail->next; + + /* + * Process (a) and (d) cases. See an illustration. Apart of + * that it handles the scenario when all clients are done, + * wait-head is released if last. The worker is not kicked. + */ + llist_for_each_safe(rcu, head, head) { + if (rcu_sr_is_wait_head(rcu)) { + if (!rcu->next) { + rcu_sr_put_wait_head(rcu); + wait_tail->next = NULL; + } else { + wait_tail->next = rcu; + } + + break; + } + + rcu_sr_normal_complete(rcu); + // It can be last, update a next on this step. + wait_tail->next = head; + + if (++done == SR_MAX_USERS_WAKE_FROM_GP) + break; + } + // concurrent sr_normal_gp_cleanup work might observe this update. smp_store_release(&sr.srs_done_tail, wait_tail); ASSERT_EXCLUSIVE_WRITER(sr.srs_done_tail); - if (wait_tail) + if (wait_tail->next) queue_work(system_highpri_wq, &sr_normal_gp_cleanup); }