All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
	linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Carsten Emde <C.Emde@osadl.org>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	John Kacur <jkacur@redhat.com>,
	Paul Gortmaker <paul.gortmaker@windriver.com>,
	<stable-rt@vger.kernel.org>
Subject: [PATCH RT 07/10] fs/dcache: resched/chill only if we make no progress
Date: Thu, 22 Sep 2016 17:47:59 -0400	[thread overview]
Message-ID: <20160922214817.864535469@goodmis.org> (raw)
In-Reply-To: 20160922214752.178698951@goodmis.org

[-- Attachment #1: 0007-fs-dcache-resched-chill-only-if-we-make-no-progress.patch --]
[-- Type: text/plain, Size: 2436 bytes --]

4.4.21-rt31-rc1 stable review patch.
If anyone has any objections, please let me know.

------------------

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

Upstream commit 47be61845c77 ("fs/dcache.c: avoid soft-lockup in
dput()") changed the condition _when_ cpu_relax() / cond_resched() was
invoked. This change was adapted in -RT into mostly the same thing
except that if cond_resched() did nothing we had to do cpu_chill() to
force the task off CPU for a tiny little bit in case the task had RT
priority and did not want to leave the CPU.
This change resulted in a performance regression (in my testcase the
build time on /dev/shm increased from 19min to 24min). The reason is
that with this change cpu_chill() was invoked even dput() made progress
(dentry_kill() returned a different dentry) instead only if we were
trying this operation on the same dentry over and over again.

This patch brings back to the old behavior back to cond_resched() &
chill if we make no progress. A little improvement is to invoke
cpu_chill() only if we are a RT task (and avoid the sleep otherwise).
Otherwise the scheduler should remove us from the CPU if we make no
progress.

Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 fs/dcache.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/fs/dcache.c b/fs/dcache.c
index 76f007eb28f8..3730c7f757ff 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -40,6 +40,8 @@
 #include <linux/ratelimit.h>
 #include <linux/list_lru.h>
 #include <linux/kasan.h>
+#include <linux/sched/rt.h>
+#include <linux/sched/deadline.h>
 
 #include "internal.h"
 #include "mount.h"
@@ -748,6 +750,8 @@ static inline bool fast_dput(struct dentry *dentry)
  */
 void dput(struct dentry *dentry)
 {
+	struct dentry *parent;
+
 	if (unlikely(!dentry))
 		return;
 
@@ -784,14 +788,17 @@ repeat:
 	return;
 
 kill_it:
-	dentry = dentry_kill(dentry);
-	if (dentry) {
+	parent = dentry_kill(dentry);
+	if (parent) {
 		int r;
 
-		/* the task with the highest priority won't schedule */
-		r = cond_resched();
-		if (!r)
-			cpu_chill();
+		if (parent == dentry) {
+			/* the task with the highest priority won't schedule */
+			r = cond_resched();
+			if (!r && (rt_task(current) || dl_task(current)))
+				cpu_chill();
+		} else
+			dentry = parent;
 		goto repeat;
 	}
 }
-- 
2.8.1

  parent reply	other threads:[~2016-09-22 21:47 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-22 21:47 [PATCH RT 00/10] Linux 4.4.21-rt31-rc1 Steven Rostedt
2016-09-22 21:47 ` [PATCH RT 01/10] timers: wakeup all timer waiters Steven Rostedt
2016-09-22 21:47 ` [PATCH RT 02/10] timers: wakeup all timer waiters without holding the base lock Steven Rostedt
2016-09-22 21:47 ` [PATCH RT 03/10] sched: lazy_preempt: avoid a warning in the !RT case Steven Rostedt
2016-09-22 21:47 ` [PATCH RT 04/10] scsi/fcoe: Fix get_cpu()/put_cpu_light() imbalance in fcoe_recv_frame() Steven Rostedt
2016-09-22 21:47 ` [PATCH RT 06/10] net: add a lock around icmp_sk() Steven Rostedt
2016-09-22 21:47 ` Steven Rostedt [this message]
2016-09-22 21:48 ` [PATCH RT 08/10] x86/preempt-lazy: fixup should_resched() Steven Rostedt
2016-09-22 21:48 ` [PATCH RT 09/10] fs/dcache: incremental fixup of the retry routine Steven Rostedt
2016-09-22 21:48 ` [PATCH RT 10/10] Linux 4.4.21-rt31-rc1 Steven Rostedt
     [not found] ` <20160922214817.564751063@goodmis.org>
2016-09-22 21:52   ` [PATCH RT 05/10] net: add back the missing serialization in ip_send_unicast_reply() Steven Rostedt
  -- strict thread matches above, loose matches on Subject: below --
2016-09-22 21:57 [PATCH RT 00/10] Linux 4.1.33-rt38-rc1 Steven Rostedt
2016-09-22 21:57 ` [PATCH RT 07/10] fs/dcache: resched/chill only if we make no progress Steven Rostedt
2016-09-22 23:17 [PATCH RT 00/10] Linux 3.18.42-rt45-rc1 Steven Rostedt
2016-09-22 23:17 ` [PATCH RT 07/10] fs/dcache: resched/chill only if we make no progress Steven Rostedt
2016-09-23  2:49 [PATCH RT 00/10] Linux 3.14.79-rt85-rc1 Steven Rostedt
2016-09-23  2:49 ` [PATCH RT 07/10] fs/dcache: resched/chill only if we make no progress Steven Rostedt

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=20160922214817.864535469@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=C.Emde@osadl.org \
    --cc=bigeasy@linutronix.de \
    --cc=jkacur@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=paul.gortmaker@windriver.com \
    --cc=stable-rt@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /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.