All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yong Zhang <yong.zhang0@gmail.com>
To: linux-kernel <linux-kernel@vger.kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@elte.hu>, Mike Galbraith <efault@gmx.de>,
	Cheng Xu <chengxu@linux.vnet.ibm.com>
Subject: [PATCH] sched: skip autogroup when looking for all rt sched groups
Date: Wed, 22 Jun 2011 13:22:24 +0800	[thread overview]
Message-ID: <BANLkTikKRnQb_T5x1BA=WopbBA_weLNFoQ@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 2632 bytes --]

From: Yong Zhang <yong.zhang0@gmail.com>
Subject: [PATCH] sched: skip autogroup when looking for all rt sched groups

Since [commit ec514c48: sched: Fix rt_rq runtime leakage bug],
'cat /proc/sched_debug' will print data of root_task_group.rt_rq
multi times, this is due to autogroup has no its own rt group,
instead rt group of autogroup is linked to root_task_group.

So skip it when we are looking for all rt sched groups, and it
will also save some noop operation against root_task_group when
__disable_runtime()/__enable_runtime().

Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
---

Since webmail may mangle the patch, attach it too.

 kernel/sched_autogroup.h |    1 +
 kernel/sched_rt.c        |   29 ++++++++++++++++++++++++-----
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/kernel/sched_autogroup.h b/kernel/sched_autogroup.h
index 0557705..c2f0e72 100644
--- a/kernel/sched_autogroup.h
+++ b/kernel/sched_autogroup.h
@@ -13,6 +13,7 @@ struct autogroup {
 	int			nice;
 };

+static inline bool task_group_is_autogroup(struct task_group *tg);
 static inline struct task_group *
 autogroup_task_group(struct task_struct *p, struct task_group *tg);

diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 10d0182..8edf487 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -185,11 +185,30 @@ static inline u64 sched_rt_period(struct rt_rq *rt_rq)

 typedef struct task_group *rt_rq_iter_t;

-#define for_each_rt_rq(rt_rq, iter, rq) \
-	for (iter = list_entry_rcu(task_groups.next, typeof(*iter), list); \
-	     (&iter->list != &task_groups) && \
-	     (rt_rq = iter->rt_rq[cpu_of(rq)]); \
-	     iter = list_entry_rcu(iter->list.next, typeof(*iter), list))
+/* autogroup is not related to rt group, skip it */
+#define find_first_valid_task_group(iter)				\
+	({								\
+		list_for_each_entry_rcu(iter, &task_groups, list)	\
+			if (!task_group_is_autogroup(iter))		\
+				break;					\
+		iter;							\
+	})
+
+#define find_next_valid_task_group(iter)				\
+	({								\
+		do {							\
+			iter = list_entry_rcu(iter->list.next,		\
+					typeof(*iter),	list);		\
+		} while (&iter->list != &task_groups &&			\
+			task_group_is_autogroup(iter));			\
+		iter;							\
+	})
+
+#define for_each_rt_rq(rt_rq, iter, rq)					\
+	for (find_first_valid_task_group(iter);				\
+	     (&iter->list != &task_groups) &&				\
+	     (rt_rq = iter->rt_rq[cpu_of(rq)]);				\
+	     find_next_valid_task_group(iter))

 static inline void list_add_leaf_rt_rq(struct rt_rq *rt_rq)
 {
-- 
1.7.4.1

[-- Attachment #2: 0001-sched-skip-autogroup-when-looking-for-all-rt-sched-g.patch --]
[-- Type: text/x-patch, Size: 2747 bytes --]

From 40117635a8f22a05a4eed98c40fcaf67ad90f738 Mon Sep 17 00:00:00 2001
From: Yong Zhang <yong.zhang0@gmail.com>
Date: Wed, 22 Jun 2011 12:52:40 +0800
Subject: [PATCH] sched: skip autogroup when looking for all rt sched groups

Since [commit ec514c48: sched: Fix rt_rq runtime leakage bug],
'cat /proc/sched_debug' will print data of root_task_group.rt_rq
multi times, this is due to autogroup has no its own rt group,
instead rt group of autogroup is linked to root_task_group.

So skip it when we are looking for all rt sched groups, and it
will also save some noop operation against root_task_group when
__disable_runtime()/__enable_runtime().

Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
---

Since webmail may mangle the patch, attach it too.

 kernel/sched_autogroup.h |    1 +
 kernel/sched_rt.c        |   29 ++++++++++++++++++++++++-----
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/kernel/sched_autogroup.h b/kernel/sched_autogroup.h
index 0557705..c2f0e72 100644
--- a/kernel/sched_autogroup.h
+++ b/kernel/sched_autogroup.h
@@ -13,6 +13,7 @@ struct autogroup {
 	int			nice;
 };
 
+static inline bool task_group_is_autogroup(struct task_group *tg);
 static inline struct task_group *
 autogroup_task_group(struct task_struct *p, struct task_group *tg);
 
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 10d0182..8edf487 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -185,11 +185,30 @@ static inline u64 sched_rt_period(struct rt_rq *rt_rq)
 
 typedef struct task_group *rt_rq_iter_t;
 
-#define for_each_rt_rq(rt_rq, iter, rq) \
-	for (iter = list_entry_rcu(task_groups.next, typeof(*iter), list); \
-	     (&iter->list != &task_groups) && \
-	     (rt_rq = iter->rt_rq[cpu_of(rq)]); \
-	     iter = list_entry_rcu(iter->list.next, typeof(*iter), list))
+/* autogroup is not related to rt group, skip it */
+#define find_first_valid_task_group(iter)				\
+	({								\
+		list_for_each_entry_rcu(iter, &task_groups, list)	\
+			if (!task_group_is_autogroup(iter))		\
+				break;					\
+		iter;							\
+	})
+
+#define find_next_valid_task_group(iter)				\
+	({								\
+		do {							\
+			iter = list_entry_rcu(iter->list.next,		\
+					typeof(*iter),	list);		\
+		} while (&iter->list != &task_groups &&			\
+			task_group_is_autogroup(iter));			\
+		iter;							\
+	})
+
+#define for_each_rt_rq(rt_rq, iter, rq)					\
+	for (find_first_valid_task_group(iter);				\
+	     (&iter->list != &task_groups) &&				\
+	     (rt_rq = iter->rt_rq[cpu_of(rq)]);				\
+	     find_next_valid_task_group(iter))
 
 static inline void list_add_leaf_rt_rq(struct rt_rq *rt_rq)
 {
-- 
1.7.4.1


             reply	other threads:[~2011-06-22  5:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-22  5:22 Yong Zhang [this message]
2011-06-23 11:21 ` [PATCH] sched: skip autogroup when looking for all rt sched groups Cheng Xu
2011-06-28  2:40   ` Yong Zhang
2011-06-28  2:51     ` [PATCH V2] " Yong Zhang
2011-06-30  3:33       ` Cheng Xu
2011-07-01 15:17       ` [tip:sched/core] sched: Skip " tip-bot for Yong Zhang

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='BANLkTikKRnQb_T5x1BA=WopbBA_weLNFoQ@mail.gmail.com' \
    --to=yong.zhang0@gmail.com \
    --cc=chengxu@linux.vnet.ibm.com \
    --cc=efault@gmx.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.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.