public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: linux-kernel@vger.kernel.org
Cc: Stefani Seibold <stefani@seibold.net>,
	Dario Faggioli <raistlin@linux.it>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	Max Krasnyansky <maxk@qualcomm.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 4/6] sched: extract walk_tg_tree()
Date: Tue, 19 Aug 2008 12:33:05 +0200	[thread overview]
Message-ID: <20080819103844.304088393@chello.nl> (raw)
In-Reply-To: 20080819103301.787700742@chello.nl

[-- Attachment #1: sched-rt-bw-walk-tree.patch --]
[-- Type: text/plain, Size: 4632 bytes --]

Extract walk_tg_tree() and make it a little more generic so we can use it
in the schedulablity test.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
 kernel/sched.c    |  219 +++++++++++++++++++++++++++++++-----------------------
 kernel/sched_rt.c |   16 ++-
 2 files changed, 135 insertions(+), 100 deletions(-)

Index: linux-2.6/kernel/sched.c
===================================================================
--- linux-2.6.orig/kernel/sched.c
+++ linux-2.6/kernel/sched.c
@@ -1380,38 +1387,24 @@ static inline void dec_cpu_load(struct r
 	update_load_sub(&rq->load, load);
 }
 
-#ifdef CONFIG_SMP
-static unsigned long source_load(int cpu, int type);
-static unsigned long target_load(int cpu, int type);
-static int task_hot(struct task_struct *p, u64 now, struct sched_domain *sd);
-
-static unsigned long cpu_avg_load_per_task(int cpu)
-{
-	struct rq *rq = cpu_rq(cpu);
-
-	if (rq->nr_running)
-		rq->avg_load_per_task = rq->load.weight / rq->nr_running;
-
-	return rq->avg_load_per_task;
-}
-
-#ifdef CONFIG_FAIR_GROUP_SCHED
-
-typedef void (*tg_visitor)(struct task_group *, int, struct sched_domain *);
+#if (defined(CONFIG_SMP) && defined(CONFIG_FAIR_GROUP_SCHED))
+typedef int (*tg_visitor)(struct task_group *, void *);
 
 /*
  * Iterate the full tree, calling @down when first entering a node and @up when
  * leaving it for the final time.
  */
-static void
-walk_tg_tree(tg_visitor down, tg_visitor up, int cpu, struct sched_domain *sd)
+static int walk_tg_tree(tg_visitor down, tg_visitor up, void *data)
 {
 	struct task_group *parent, *child;
+	int ret;
 
 	rcu_read_lock();
 	parent = &root_task_group;
 down:
-	(*down)(parent, cpu, sd);
+	ret = (*down)(parent, data);
+	if (ret)
+		goto out_unlock;
 	list_for_each_entry_rcu(child, &parent->children, siblings) {
 		parent = child;
 		goto down;
@@ -1419,14 +1412,42 @@ down:
 up:
 		continue;
 	}
-	(*up)(parent, cpu, sd);
+	ret = (*up)(parent, data);
+	if (ret)
+		goto out_unlock;
 
 	child = parent;
 	parent = parent->parent;
 	if (parent)
 		goto up;
+out_unlock:
 	rcu_read_unlock();
+
+	return ret;
+}
+
+static int tg_nop(struct task_group *tg, void *data)
+{
+	return 0;
 }
+#endif
+
+#ifdef CONFIG_SMP
+static unsigned long source_load(int cpu, int type);
+static unsigned long target_load(int cpu, int type);
+static int task_hot(struct task_struct *p, u64 now, struct sched_domain *sd);
+
+static unsigned long cpu_avg_load_per_task(int cpu)
+{
+	struct rq *rq = cpu_rq(cpu);
+
+	if (rq->nr_running)
+		rq->avg_load_per_task = rq->load.weight / rq->nr_running;
+
+	return rq->avg_load_per_task;
+}
+
+#ifdef CONFIG_FAIR_GROUP_SCHED
 
 static void __set_se_shares(struct sched_entity *se, unsigned long shares);
 
@@ -1486,11 +1507,11 @@ __update_group_shares_cpu(struct task_gr
  * This needs to be done in a bottom-up fashion because the rq weight of a
  * parent group depends on the shares of its child groups.
  */
-static void
-tg_shares_up(struct task_group *tg, int cpu, struct sched_domain *sd)
+static int tg_shares_up(struct task_group *tg, void *data)
 {
 	unsigned long rq_weight = 0;
 	unsigned long shares = 0;
+	struct sched_domain *sd = data;
 	int i;
 
 	for_each_cpu_mask(i, sd->span) {
@@ -1515,6 +1536,8 @@ tg_shares_up(struct task_group *tg, int 
 		__update_group_shares_cpu(tg, i, shares, rq_weight);
 		spin_unlock_irqrestore(&rq->lock, flags);
 	}
+
+	return 0;
 }
 
 /*
@@ -1522,10 +1545,10 @@ tg_shares_up(struct task_group *tg, int 
  * This needs to be done in a top-down fashion because the load of a child
  * group is a fraction of its parents load.
  */
-static void
-tg_load_down(struct task_group *tg, int cpu, struct sched_domain *sd)
+static int tg_load_down(struct task_group *tg, void *data)
 {
 	unsigned long load;
+	long cpu = (long)data;
 
 	if (!tg->parent) {
 		load = cpu_rq(cpu)->load.weight;
@@ -1536,11 +1559,8 @@ tg_load_down(struct task_group *tg, int 
 	}
 
 	tg->cfs_rq[cpu]->h_load = load;
-}
 
-static void
-tg_nop(struct task_group *tg, int cpu, struct sched_domain *sd)
-{
+	return 0;
 }
 
 static void update_shares(struct sched_domain *sd)
@@ -1550,7 +1570,7 @@ static void update_shares(struct sched_d
 
 	if (elapsed >= (s64)(u64)sysctl_sched_shares_ratelimit) {
 		sd->last_update = now;
-		walk_tg_tree(tg_nop, tg_shares_up, 0, sd);
+		walk_tg_tree(tg_nop, tg_shares_up, sd);
 	}
 }
 
@@ -1561,9 +1581,9 @@ static void update_shares_locked(struct 
 	spin_lock(&rq->lock);
 }
 
-static void update_h_load(int cpu)
+static void update_h_load(long cpu)
 {
-	walk_tg_tree(tg_load_down, tg_nop, cpu, NULL);
+	walk_tg_tree(tg_load_down, tg_nop, (void *)cpu);
 }
 
 #else

-- 


  parent reply	other threads:[~2008-08-19 10:45 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-19 10:33 [PATCH 0/6] sched: rt-bandwidth fixes Peter Zijlstra
2008-08-19 10:33 ` [PATCH 1/6] sched: rt-bandwidth for user grouping interface Peter Zijlstra
2008-08-19 10:33 ` [PATCH 2/6] sched: rt-bandwidth accounting fix Peter Zijlstra
2008-08-19 18:33   ` Max Krasnyansky
2008-08-19 18:38     ` Peter Zijlstra
2008-08-19 10:33 ` [PATCH 3/6] sched: rt-bandwidth group disable fixes Peter Zijlstra
2008-08-19 10:33 ` Peter Zijlstra [this message]
2008-08-19 10:33 ` [PATCH 5/6] sched: rt-bandwidth fixes Peter Zijlstra
2008-08-19 10:33 ` [PATCH 6/6] sched: disabled rt-bandwidth by default Peter Zijlstra
2008-08-19 11:05   ` Ingo Molnar
2008-08-19 11:11     ` Ingo Molnar
2008-08-19 11:42       ` [PATCH] sched: extract walk_tg_tree(), fix Ingo Molnar
2008-08-19 11:17     ` [PATCH 6/6] sched: disabled rt-bandwidth by default Nick Piggin
2008-08-19 12:59       ` Ingo Molnar
2008-08-19 18:15         ` Max Krasnyansky
2008-08-20 11:56         ` Nick Piggin
2008-08-26  9:00           ` Nick Piggin
2008-08-26  9:30             ` Ingo Molnar
2008-08-26  9:44               ` Nick Piggin
2008-08-26 10:29                 ` Ingo Molnar
2008-08-26 11:03                   ` Nick Piggin
2008-08-26  9:54               ` Nick Piggin
2008-08-26 11:09                 ` Thomas Gleixner
2008-08-26 11:27                   ` Nick Piggin
2008-08-26 12:50                     ` Theodore Tso
2008-08-26 13:31                       ` Stefani Seibold
2008-08-26 17:55                         ` Theodore Tso
2008-08-26 21:37                     ` Thomas Gleixner
2008-08-26 22:49                       ` Andi Kleen
2008-08-27 10:08                         ` Nick Piggin
2008-08-28 10:54                           ` Ingo Molnar
2008-08-28 11:09                             ` Andi Kleen
2008-08-28 11:19                               ` Peter Zijlstra
2008-08-28 11:28                                 ` Ingo Molnar
2008-08-28 11:50                                 ` Andi Kleen
2008-08-28 12:00                                   ` Peter Zijlstra
2008-08-28 12:14                                     ` Andi Kleen
2008-08-28 12:18                                       ` Nick Piggin
2008-08-28 16:19                                   ` Max Krasnyansky
2008-08-28 16:25                                     ` Ingo Molnar
2008-08-28 16:33                                       ` Andi Kleen
2008-08-28 12:03                             ` Nick Piggin
2008-08-28 13:07                               ` Ingo Molnar
2008-08-28 13:45                                 ` Nick Piggin
2008-08-28 12:29                             ` Nick Piggin
2008-08-27 10:04                       ` Nick Piggin
2008-08-26 13:47                   ` Mark Hounschell
2008-08-26 23:00                     ` Steven Rostedt
2008-08-27 18:55                       ` Chris Friesen
2008-08-28 14:15     ` Steven Rostedt
2008-08-28 14:30       ` Ingo Molnar
2008-08-28 14:36         ` Nick Piggin
2008-08-28 15:12           ` Steven Rostedt
2008-08-28 15:34             ` Nick Piggin
2008-08-28 15:50               ` Steven Rostedt
2008-08-28 17:26                 ` Linus Torvalds
2008-08-28 18:04                   ` Steven Rostedt
2008-08-28 18:10                     ` Darren Hart
2008-08-28 18:16                   ` Mark Hounschell
2008-08-28 18:42                     ` Linus Torvalds
2008-08-28 18:53                       ` Steven Rostedt
2008-08-29  7:56                         ` Mike Galbraith
2008-08-29  8:06                           ` Peter Zijlstra
2008-08-29  8:47                             ` Mike Galbraith
2008-08-28 19:39                       ` Stefani Seibold
2008-08-28 20:53                       ` Alan Cox
2008-08-30  6:33                   ` Nick Piggin
2008-08-28 16:33           ` Max Krasnyansky
2008-08-28 17:22             ` John Kacur
2008-08-28 16:05       ` Peter Zijlstra
2008-08-28 16:15         ` Steven Rostedt
2008-08-28 16:29           ` Peter Zijlstra

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=20080819103844.304088393@chello.nl \
    --to=a.p.zijlstra@chello.nl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxk@qualcomm.com \
    --cc=mingo@elte.hu \
    --cc=nickpiggin@yahoo.com.au \
    --cc=raistlin@linux.it \
    --cc=stefani@seibold.net \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox