From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Joel Fernandes <joel@joelfernandes.org>,
Peter Zilstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>, Boqun Feng <boqun.feng@gmail.com>,
byungchul.park@lge.com, kernel-team@android.com,
Josh Triplett <josh@joshtriplett.org>,
Lai Jiangshan <jiangshanlai@gmail.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: Re: [PATCH v4] rcu: Speed up calling of RCU tasks callbacks
Date: Fri, 25 May 2018 13:11:41 -0700 [thread overview]
Message-ID: <20180525201141.GG3803@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180524184946.5fa82d19@gandalf.local.home>
On Thu, May 24, 2018 at 06:49:46PM -0400, Steven Rostedt wrote:
>
> From: Steven Rostedt (VMware) <rostedt@goodmis.org>
>
> Joel Fernandes found that the synchronize_rcu_tasks() was taking a
> significant amount of time. He demonstrated it with the following test:
>
> # cd /sys/kernel/tracing
> # while [ 1 ]; do x=1; done &
> # echo '__schedule_bug:traceon' > set_ftrace_filter
> # time echo '!__schedule_bug:traceon' > set_ftrace_filter;
>
> real 0m1.064s
> user 0m0.000s
> sys 0m0.004s
>
> Where it takes a little over a second to perform the synchronize,
> because there's a loop that waits 1 second at a time for tasks to get
> through their quiescent points when there's a task that must be waited
> for.
>
> After discussion we came up with a simple way to wait for holdouts but
> increase the time for each iteration of the loop but no more than a
> full second.
>
> With the new patch we have:
>
> # time echo '!__schedule_bug:traceon' > set_ftrace_filter;
>
> real 0m0.131s
> user 0m0.000s
> sys 0m0.004s
>
> Which drops it down to 13% of what the original wait time was.
>
> Link: http://lkml.kernel.org/r/20180523063815.198302-2-joel@joelfernandes.org
> Reported-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> Suggested-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
I queued both commits, thank you all!
Thanx, Paul
> ---
> diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
> index 68fa19a5e7bd..452e47841a86 100644
> --- a/kernel/rcu/update.c
> +++ b/kernel/rcu/update.c
> @@ -715,6 +715,7 @@ static int __noreturn rcu_tasks_kthread(void *arg)
> struct rcu_head *list;
> struct rcu_head *next;
> LIST_HEAD(rcu_tasks_holdouts);
> + int fract;
>
> /* Run on housekeeping CPUs by default. Sysadm can move if desired. */
> housekeeping_affine(current, HK_FLAG_RCU);
> @@ -796,13 +797,25 @@ static int __noreturn rcu_tasks_kthread(void *arg)
> * holdouts. When the list is empty, we are done.
> */
> lastreport = jiffies;
> - while (!list_empty(&rcu_tasks_holdouts)) {
> +
> + /* Start off with HZ/10 wait and slowly back off to 1 HZ wait*/
> + fract = 10;
> +
> + for (;;) {
> bool firstreport;
> bool needreport;
> int rtst;
> struct task_struct *t1;
>
> - schedule_timeout_interruptible(HZ);
> + if (list_empty(&rcu_tasks_holdouts))
> + break;
> +
> + /* Slowly back off waiting for holdouts */
> + schedule_timeout_interruptible(HZ/fract);
> +
> + if (fract > 1)
> + fract--;
> +
> rtst = READ_ONCE(rcu_task_stall_timeout);
> needreport = rtst > 0 &&
> time_after(jiffies, lastreport + rtst);
>
prev parent reply other threads:[~2018-05-25 20:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-24 22:49 [PATCH v4] rcu: Speed up calling of RCU tasks callbacks Steven Rostedt
2018-05-24 23:19 ` Joel Fernandes
2018-05-24 23:22 ` Steven Rostedt
2018-05-24 23:26 ` Randy Dunlap
2018-05-25 0:14 ` Randy Dunlap
2018-05-25 20:11 ` Paul E. McKenney [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180525201141.GG3803@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=boqun.feng@gmail.com \
--cc=byungchul.park@lge.com \
--cc=jiangshanlai@gmail.com \
--cc=joel@joelfernandes.org \
--cc=josh@joshtriplett.org \
--cc=kernel-team@android.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.