From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752547AbeETI3U (ORCPT ); Sun, 20 May 2018 04:29:20 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:38001 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751683AbeETI3Q (ORCPT ); Sun, 20 May 2018 04:29:16 -0400 X-Google-Smtp-Source: AB8JxZoJ6NsnKHCYCW1f3L+ty/mGVuF5RxH5DOFNVUxuSXRjeOyNBchDIRgcn+9ahttg+GtueUJf5Q== From: Joel Fernandes X-Google-Original-From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Steven Rostedt , Peter Zilstra , Ingo Molnar , Boqun Feng , Paul McKenney , byungchul.park@lge.com, kernel-team@android.com, Josh Triplett , Mathieu Desnoyers , Lai Jiangshan Subject: [PATCH] rcu: Speed up calling of RCU tasks callbacks Date: Sun, 20 May 2018 01:28:55 -0700 Message-Id: <20180520082856.70676-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Joel Fernandes (Google)" RCU tasks callbacks can take atleast 1 second before the callbacks are executed. This happens even if the hold-out tasks enter their quiescent states quickly. I noticed this when I was testing trampoline callback execution. To test the trampoline freeing, I wrote a simple script: cd /sys/kernel/debug/tracing/ echo '*:traceon' > set_ftrace_filter; echo '!*:traceon' > set_ftrace_filter; With this patch: real 0m0.256s user 0m0.000s sys 0m0.226s Without this patch: real 0m1.313s user 0m0.000s sys 0m0.222s That's a great than 5X speed up in performance. In order to accomplish this, I am waiting very briefly for around 2 scheduler ticks worth of time before entering the hold-out checking loop. The loop still preserves its checking of held tasks every 1 second as before, incase this first test doesn't succeed. Cc: Steven Rostedt Cc: Peter Zilstra Cc: Ingo Molnar Cc: Boqun Feng Cc: Paul McKenney Cc: byungchul.park@lge.com Cc: kernel-team@android.com Signed-off-by: Joel Fernandes (Google) --- kernel/rcu/update.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c index 5783bdf86e5a..d221db4ab3f4 100644 --- a/kernel/rcu/update.c +++ b/kernel/rcu/update.c @@ -743,6 +743,12 @@ static int __noreturn rcu_tasks_kthread(void *arg) */ synchronize_srcu(&tasks_rcu_exit_srcu); + /* + * Wait a little bit incase held tasks are released + * during their next timer ticks. + */ + schedule_timeout_interruptible(2); + /* * Each pass through the following loop scans the list * of holdout tasks, removing any that are no longer @@ -755,7 +761,6 @@ static int __noreturn rcu_tasks_kthread(void *arg) int rtst; struct task_struct *t1; - schedule_timeout_interruptible(HZ); rtst = READ_ONCE(rcu_task_stall_timeout); needreport = rtst > 0 && time_after(jiffies, lastreport + rtst); @@ -768,6 +773,11 @@ static int __noreturn rcu_tasks_kthread(void *arg) check_holdout_task(t, needreport, &firstreport); cond_resched(); } + + if (list_empty(&rcu_tasks_holdouts)) + break; + + schedule_timeout_interruptible(HZ); } /* -- 2.17.0.441.gb46fe60e1d-goog