Received: by 2002:ab2:620c:0:b0:1ef:ffd0:ce49 with SMTP id o12csp1022436lqt; Tue, 19 Mar 2024 10:24:26 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWHn2BJhH1qjzo65dyhpl04Fpm9mZPHrLVc11ZoFs885LhmRvwcswMR9eCUmq9UXLghOg17yt3XoTH/+JnCwAZviSMbQ08Jc4atPw15+A== X-Google-Smtp-Source: AGHT+IGElpbhpZGYO5MwT3N+4Axg9C5FGdlQA8uWQC2t/XU4ryrBnIQh/cMNNb+lE8jL1jDc51L4 X-Received: by 2002:a05:6402:4028:b0:568:befc:372f with SMTP id d40-20020a056402402800b00568befc372fmr2857659eda.10.1710869066334; Tue, 19 Mar 2024 10:24:26 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710869066; cv=pass; d=google.com; s=arc-20160816; b=igmdY+BrKntvJWH2TTf98AV66ZL6lsqZszGlguAodZjH7vQXKs6tfm3wvnRrZeyCvU b50kilYo7QNY8njcC+E8fSxi3oWnIBnLjlbttvsuNuHYo+z/3MtEUlr/42EbRGbv0d1g hpeQAn09rMBhQMr8FHPhzSkZdxkL9xjM0lp9mV33OVaszFx9m19ZfRaBTvGBVP55Bh6u 6L9o1uLR2oUUkwFtYDLcNfF7M7oTWPPW2HrsqD8CyAFvkebYOboRdRdlFrQSXGjgthUa Ln3RLoqqzKQNz+RF/Arn7J6IbgewbCkF1ozYgsdktS+uGH0BwB5oiO3IBYu/Um7b4ncJ ZKLA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=nGf7OdIZL/0mVWg7rMGIh3EEFJoK6ZbRGH0lmn+lIjc=; fh=j69+dXPUdLdOhzfLEV7DhpvwmsmcGuPqFuAgN/EMNAI=; b=Un8dAoH2kJpnQIXhiv79IVt90B+dtxd4IrXNUfgBd8snFFsIuLK1Odi0e3BnQ4Due/ oOoLGqkigtr28xzGy4sHDVIH/s7FKVnL3COThw0083xblt8spPT0I2GnLe94NFPcp87l VoS6mNd+Q2cTJMN15GjufmoHwEEq8YLqvD2s53MaT9VPBXKywJ91vNSEGYcQC+oRZlaP +yU70zL3eTN43BZubhUIETTRFCY8HLe99TCT58h3dVfUn17ffKgLBJY+v+oaNCJDpBPi A08RdKtS3YJzN09P6iFXyvgGWaxSFsIk0RYMqVu7fWVv9KLwnu4yjUKXSbgIcX4qwP/j P4TQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=MpHKHX5A; arc=pass (i=1 spf=pass spfdomain=joelfernandes.org dkim=pass dkdomain=joelfernandes.org); spf=pass (google.com: domain of linux-kernel+bounces-107903-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-107903-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id h20-20020a056402281400b00568ae1a0a0asi4654583ede.662.2024.03.19.10.24.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 10:24:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-107903-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=MpHKHX5A; arc=pass (i=1 spf=pass spfdomain=joelfernandes.org dkim=pass dkdomain=joelfernandes.org); spf=pass (google.com: domain of linux-kernel+bounces-107903-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-107903-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id DDD201F22B50 for ; Tue, 19 Mar 2024 17:24:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E08F41B7FD; Tue, 19 Mar 2024 17:24:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=joelfernandes.org header.i=@joelfernandes.org header.b="MpHKHX5A" Received: from mail-oi1-f179.google.com (mail-oi1-f179.google.com [209.85.167.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D5AD18AE4 for ; Tue, 19 Mar 2024 17:24:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710869059; cv=none; b=o4bc4we2Vzr5GxKBedGQSfuMKEZjMV1awzK7LWJzKBsQkzVSdfqF4X3ziBxzpam9FmrCfMcSO/H27D8+Kp1StsMPONJZc2fy9t07JgNAIxcFXPMoNFuUJYllVrJoFdsDo7AEOmfSfI10KHCEfa2FuB8lk/0jK1X+ZC5gTb0pci8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710869059; c=relaxed/simple; bh=e7yeIqUpzRjjdTvOBKM5mQZ7beBxblyQQJZNb13cJvs=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=P1quWwuU2zo7dR6LxPmV3bhribJ80yfe/2UmZLnvDeecI/HyNYKO9WLUKqFMWzY6vVYB9u0yjKYS5OyOyE3s13qiT+RJHcbWLBfm/fWtRb8eywusZHOnA4ek6k35+k1lIgqDBfknoCrh6nVDrEMLHpqQhbUHDSVyydZtzRs9Uh8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org; spf=pass smtp.mailfrom=joelfernandes.org; dkim=pass (1024-bit key) header.d=joelfernandes.org header.i=@joelfernandes.org header.b=MpHKHX5A; arc=none smtp.client-ip=209.85.167.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=joelfernandes.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=joelfernandes.org Received: by mail-oi1-f179.google.com with SMTP id 5614622812f47-3c39c55ef57so336504b6e.0 for ; Tue, 19 Mar 2024 10:24:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; t=1710869055; x=1711473855; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=nGf7OdIZL/0mVWg7rMGIh3EEFJoK6ZbRGH0lmn+lIjc=; b=MpHKHX5A8reaZRm9sw+d1bMQpEoIavfB1xkO1dNgqIZzSAVrBV8BBPvKhEY7qc7Z+k eJ/HMyHdZbqmrhDSNQDuL42MF1/4bR97UFEclaFOC4y6+s5hGf77zfrb3ZEZ9tFaTre/ h5gOe2xVYbH0l4IMpBZRpxvx2TDRBUQxENwsc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710869055; x=1711473855; 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=nGf7OdIZL/0mVWg7rMGIh3EEFJoK6ZbRGH0lmn+lIjc=; b=sZTKJ6FpM/kZXDfbx1iI8bd8lFnBeWSAI1AEj2/wWYz3vpyirs+MEbanYiGhLl9vzD a+dB5i3ngmln3niyC9cDjh84NucjBm0US5HGPhQnbbb0Gw1zL8F6Hqh/QSeHolkqQTR7 bZDevXticSclaH959HUepZxJ+jls5GXPEjyxyiVEoVSNxVVXhV1J2I7rRw8nzS7oF3Nc VaJtQzI8SwSe+lGhipy+grdIbNGOxiGr3nBle6/lzGvdw1sQnXaovMs/fCmcaJZZ8FQX vBOkelsfmSHZvE1Tg+nCF9mpIwDfJvloXJBne5TGce9CXiP4q6xHzVFYtfToCkPe9IjX jBiQ== X-Gm-Message-State: AOJu0Yxozc/2xZssOUC5U4tjAB9SuxikbuDS/80p0VuZofspQIK4l/ZY DZwpy5/vUNEJUfLw7qNrguN0CPsoxRpd3qr4shkTPWcgSmC6lGLSi6JGZTD8TuRdn4RU6sYIHcG u X-Received: by 2002:a05:6808:2219:b0:3c2:bec:69d7 with SMTP id bd25-20020a056808221900b003c20bec69d7mr21116497oib.48.1710869055467; Tue, 19 Mar 2024 10:24:15 -0700 (PDT) Received: from joelbox2.. (c-98-249-43-138.hsd1.va.comcast.net. [98.249.43.138]) by smtp.gmail.com with ESMTPSA id ch14-20020a05622a40ce00b00430dcca3fb5sm1624717qtb.16.2024.03.19.10.24.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 10:24:14 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org, "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Boqun Feng , Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , Zqiang Cc: urezki@gmail.com, neeraj.iitr10@gmail.com, rcu@vger.kernel.org Subject: [PATCH v3] rcu/tree: Reduce wake up for synchronize_rcu() common case Date: Tue, 19 Mar 2024 13:24:11 -0400 Message-Id: <20240319172412.2083384-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit In the synchronize_rcu() common case, we will have less than SR_MAX_USERS_WAKE_FROM_GP number of users per GP. Waking up the kworker is pointless just to free the last injected wait head since at that point, all the users have already been awakened. Introduce a new counter to track this and prevent the wakeup in the common case. Signed-off-by: Joel Fernandes (Google) --- v1->v2: Rebase on paul/dev v2->v3: Additional optimization for wait_tail->next == NULL case. kernel/rcu/tree.c | 37 ++++++++++++++++++++++++++++++++----- kernel/rcu/tree.h | 1 + 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 9fbb5ab57c84..f06d13993478 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -96,6 +96,7 @@ static struct rcu_state rcu_state = { .ofl_lock = __ARCH_SPIN_LOCK_UNLOCKED, .srs_cleanup_work = __WORK_INITIALIZER(rcu_state.srs_cleanup_work, rcu_sr_normal_gp_cleanup_work), + .srs_cleanups_pending = ATOMIC_INIT(0), }; /* Dump rcu_node combining tree at boot to verify correct setup. */ @@ -1642,8 +1643,11 @@ static void rcu_sr_normal_gp_cleanup_work(struct work_struct *work) * the done tail list manipulations are protected here. */ done = smp_load_acquire(&rcu_state.srs_done_tail); - if (!done) + if (!done) { + /* See comments below. */ + atomic_dec_return_release(&rcu_state.srs_cleanups_pending); return; + } WARN_ON_ONCE(!rcu_sr_is_wait_head(done)); head = done->next; @@ -1666,6 +1670,9 @@ static void rcu_sr_normal_gp_cleanup_work(struct work_struct *work) rcu_sr_put_wait_head(rcu); } + + /* Order list manipulations with atomic access. */ + atomic_dec_return_release(&rcu_state.srs_cleanups_pending); } /* @@ -1673,7 +1680,7 @@ static void rcu_sr_normal_gp_cleanup_work(struct work_struct *work) */ static void rcu_sr_normal_gp_cleanup(void) { - struct llist_node *wait_tail, *next, *rcu; + struct llist_node *wait_tail, *next = NULL, *rcu = NULL; int done = 0; wait_tail = rcu_state.srs_wait_tail; @@ -1699,16 +1706,36 @@ static void rcu_sr_normal_gp_cleanup(void) break; } - // concurrent sr_normal_gp_cleanup work might observe this update. - smp_store_release(&rcu_state.srs_done_tail, wait_tail); + /* Fast path, no more users to process. */ + if (!wait_tail->next) + return; + + /* + * Fast path, no more users to process except putting the second last + * wait head if no inflight-workers. If there are in-flight workers, + * they will remove the last wait head. + */ + if (rcu_sr_is_wait_head(rcu) && rcu->next == NULL && + /* Order atomic access with list manipulation. */ + !atomic_read_acquire(&rcu_state.srs_cleanups_pending)) { + wait_tail->next = NULL; + rcu_sr_put_wait_head(rcu); + smp_store_release(&rcu_state.srs_done_tail, wait_tail); + return; + } + + /* Concurrent sr_normal_gp_cleanup work might observe this update. */ ASSERT_EXCLUSIVE_WRITER(rcu_state.srs_done_tail); + smp_store_release(&rcu_state.srs_done_tail, wait_tail); /* * We schedule a work in order to perform a final processing * of outstanding users(if still left) and releasing wait-heads * added by rcu_sr_normal_gp_init() call. */ - queue_work(sync_wq, &rcu_state.srs_cleanup_work); + atomic_inc(&rcu_state.srs_cleanups_pending); + if (!queue_work(sync_wq, &rcu_state.srs_cleanup_work)) + atomic_dec(&rcu_state.srs_cleanups_pending); } /* diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h index bae7925c497f..affcb92a358c 100644 --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -420,6 +420,7 @@ struct rcu_state { struct llist_node *srs_done_tail; /* ready for GP users. */ struct sr_wait_node srs_wait_nodes[SR_NORMAL_GP_WAIT_HEAD_MAX]; struct work_struct srs_cleanup_work; + atomic_t srs_cleanups_pending; /* srs inflight worker cleanups. */ }; /* Values for rcu_state structure's gp_flags field. */ -- 2.34.1