Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp735855ybz; Wed, 15 Apr 2020 17:50:33 -0700 (PDT) X-Google-Smtp-Source: APiQypLxD0Ik6chYV2qLVypt0m0Ybenqm00bnNvux6X36YlE9oazEEiB8RVUoigCunyjsp2ryEvS X-Received: by 2002:a17:906:4c46:: with SMTP id d6mr7233307ejw.257.1586998233705; Wed, 15 Apr 2020 17:50:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586998233; cv=none; d=google.com; s=arc-20160816; b=ysIEYilcy0DRASWIFAVBJzwZl78iLjjB9tdXar5i9sOcQn3rcGjD4lpi5RApUvxvhd AHekpW8P24xKpwTdzxWQqlWdIJaR9D1hiBBVWVtWrrN8sY/HtbUdYaL078cSHtfQ1Pfz Yj4dPaE8Nv66utZLwQsYu6vPsjumfyjnzglkDF5boSSNd5fPjioop2NjsDvMuct8lMz7 v9EC2TpqB8Edli4Z8gbExYKzv7cFheLuyrAyZWa4L/wF9Ru5kpvMOKooOLBZZB9bJtaN 96uC6g3i20x0M4M9tfMM/TPZfnxl430exnk9dz5wB02EF10YFSdIRfzj+T48Bah3IEos PK+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=eTA0B/TuX1aGqDSAMQHKOjNZMI/NLCEcWYUn0BP1x70=; b=W/DjuHhzmAykKLXP61+VCykVs89+lDxh+N5cO6brYvrlerSnkN7n1o2fimA1gcaG+x FYznlbecX0vFTtN3T18w/mf6gs6cuj8T9Fgq+PFqKU1ywHt1L0e9ZjaESVToy5TqGiJ7 lgvxgIQGUNLesiAfgGpl644WH9Yx8stOQ3xlxy0m5HsgACvz8EYwqHDw8ovBPSpsnchB TKHRrpGaiOfOz6hIwSID0yEqnR1mv90us9TJ4XRlLFis01dlQPAATR4HSArhW1tGTTx/ IyUv0VLQ+Y1I8UFtht2oQ02tjRfzBZcWBN3CMmMHQMW/+MOayAHKi1+7GBV20XUyrauT AdRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="kN/rPDif"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s20si6135718edr.444.2020.04.15.17.50.10; Wed, 15 Apr 2020 17:50:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="kN/rPDif"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1416619AbgDOSWg (ORCPT + 99 others); Wed, 15 Apr 2020 14:22:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:37314 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2441385AbgDOSTx (ORCPT ); Wed, 15 Apr 2020 14:19:53 -0400 Received: from paulmck-ThinkPad-P72.home (50-39-105-78.bvtn.or.frontiernet.net [50.39.105.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6CB2D21927; Wed, 15 Apr 2020 18:19:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1586974791; bh=xQQ5D9d5N12lUAswqMibvXSEwoQfdAIYn85iLDZ9dzw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kN/rPDifhOCIivsjkWD+S2MdMPt1wa7bJhtQ0xnRnHXaFiWFpEh/FctlXosl1EvWa YQtV2wkDF5509kdx8cKOkd/iFvH/fFNEvzNveLqe0UW2MvgCgI8TDK5d73hG/RDdfS 5HWqFIZxJRhBQJZpGn7qZyCL9RHsTotTygwYPvTg= From: paulmck@kernel.org To: rcu@vger.kernel.org Cc: linux-kernel@vger.kernel.org, kernel-team@fb.com, mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@efficios.com, josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com, fweisbec@gmail.com, oleg@redhat.com, joel@joelfernandes.org, "Paul E. McKenney" Subject: [PATCH v4 tip/core/rcu 23/38] rcu-tasks: Provide boot parameter to delay IPIs until late in grace period Date: Wed, 15 Apr 2020 11:19:26 -0700 Message-Id: <20200415181941.11653-23-paulmck@kernel.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20200415181856.GA11037@paulmck-ThinkPad-P72> References: <20200415181856.GA11037@paulmck-ThinkPad-P72> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Paul E. McKenney" This commit provides a rcupdate.rcu_task_ipi_delay kernel boot parameter that specifies how old the RCU tasks trace grace period must be before the grace-period kthread starts sending IPIs. This delay allows more tasks to pass through rcu_tasks_qs() quiescent states, thus reducing (or even eliminating) the number of IPIs that must be sent. On a short rcutorture test setting this kernel boot parameter to HZ/2 resulted in zero IPIs for all 877 RCU-tasks trace grace periods that elapsed during that test. Signed-off-by: Paul E. McKenney --- Documentation/admin-guide/kernel-parameters.txt | 7 +++++++ kernel/rcu/tasks.h | 15 ++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index f2a93c8..aaa8678 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -4286,6 +4286,13 @@ only normal grace-period primitives. No effect on CONFIG_TINY_RCU kernels. + rcupdate.rcu_task_ipi_delay= [KNL] + Set time in jiffies during which RCU tasks will + avoid sending IPIs, starting with the beginning + of a given grace period. Setting a large + number avoids disturbing real-time workloads, + but lengthens grace periods. + rcupdate.rcu_task_stall_timeout= [KNL] Set timeout in jiffies for RCU task stall warning messages. Disable with a value less than or equal diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index 199f87a..6f4e8b1 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -74,6 +74,11 @@ static struct rcu_tasks rt_name = \ /* Track exiting tasks in order to allow them to be waited for. */ DEFINE_STATIC_SRCU(tasks_rcu_exit_srcu); +/* Avoid IPIing CPUs early in the grace period. */ +#define RCU_TASK_IPI_DELAY (HZ / 2) +static int rcu_task_ipi_delay __read_mostly = RCU_TASK_IPI_DELAY; +module_param(rcu_task_ipi_delay, int, 0644); + /* Control stall timeouts. Disable with <= 0, otherwise jiffies till stall. */ #define RCU_TASK_STALL_TIMEOUT (HZ * 60 * 10) static int rcu_task_stall_timeout __read_mostly = RCU_TASK_STALL_TIMEOUT; @@ -713,6 +718,10 @@ DECLARE_WAIT_QUEUE_HEAD(trc_wait); // List of holdout tasks. // Record outstanding IPIs to each CPU. No point in sending two... static DEFINE_PER_CPU(bool, trc_ipi_to_cpu); +void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); +DEFINE_RCU_TASKS(rcu_tasks_trace, rcu_tasks_wait_gp, call_rcu_tasks_trace, + "RCU Tasks Trace"); + /* If we are the last reader, wake up the grace-period kthread. */ void rcu_read_unlock_trace_special(struct task_struct *t) { @@ -825,7 +834,7 @@ static void trc_wait_for_one_reader(struct task_struct *t, // If currently running, send an IPI, either way, add to list. trc_add_holdout(t, bhp); - if (task_curr(t)) { + if (task_curr(t) && time_after(jiffies, rcu_tasks_trace.gp_start + rcu_task_ipi_delay)) { // The task is currently running, so try IPIing it. cpu = task_cpu(t); @@ -994,10 +1003,6 @@ void exit_tasks_rcu_finish_trace(struct task_struct *t) rcu_read_unlock_trace_special(t); } -void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); -DEFINE_RCU_TASKS(rcu_tasks_trace, rcu_tasks_wait_gp, call_rcu_tasks_trace, - "RCU Tasks Trace"); - /** * call_rcu_tasks_trace() - Queue a callback trace task-based grace period * @rhp: structure to be used for queueing the RCU updates. -- 2.9.5