From: Christoph Lameter <clameter@sgi.com>
To: akpm@osdl.org
Cc: Peter Williams <pwil3058@bigpond.net.au>,
linux-kernel@vger.kernel.org,
Nick Piggin <nickpiggin@yahoo.com.au>,
Christoph Lameter <clameter@sgi.com>,
"Siddha, Suresh B" <suresh.b.siddha@intel.com>,
Ingo Molnar <mingo@elte.hu>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: [PATCH 6/7] Use tasklet to call balancing
Date: Fri, 27 Oct 2006 19:41:43 -0700 (PDT) [thread overview]
Message-ID: <20061028024143.10809.72940.sendpatchset@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <20061028024112.10809.15841.sendpatchset@schroedinger.engr.sgi.com>
Use tasklet to balance sched domains.
Call rebalance_tick (renamed to rebalance_domains) from a tasklet.
We calculate the earliest time for each layer of sched domains to be
rescanned (this is the rescan time for idle) and use the earliest
of those to schedule the tasklet again via a new field "next_balance"
added to struct rq.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Index: linux-2.6.19-rc3/kernel/sched.c
===================================================================
--- linux-2.6.19-rc3.orig/kernel/sched.c 2006-10-27 15:45:30.000000000 -0500
+++ linux-2.6.19-rc3/kernel/sched.c 2006-10-27 20:12:42.225666940 -0500
@@ -227,6 +227,7 @@ struct rq {
unsigned long expired_timestamp;
unsigned long long timestamp_last_tick;
struct task_struct *curr, *idle;
+ unsigned long next_balance;
struct mm_struct *prev_mm;
struct prio_array *active, *expired, arrays[2];
int best_expired_prio;
@@ -2841,16 +2842,18 @@ static void update_load(struct rq *this_
}
/*
- * rebalance_tick will get called every timer tick, on every CPU.
+ * rebalance_domains is triggered when needed via a tasklet from the
+ * scheduler tick.
*
* It checks each scheduling domain to see if it is due to be balanced,
* and initiates a balancing operation if so.
*
* Balancing parameters are set up in arch_init_sched_domains.
*/
-static void
-rebalance_tick(int this_cpu, struct rq *this_rq)
+static void rebalance_domains(unsigned long dummy)
{
+ int this_cpu = smp_processor_id();
+ struct rq *this_rq = cpu_rq(this_cpu);
unsigned long interval;
struct sched_domain *sd;
/*
@@ -2859,6 +2862,8 @@ rebalance_tick(int this_cpu, struct rq *
*/
enum idle_type idle = (this_rq->idle && !this_rq->nr_running) ?
SCHED_IDLE : NOT_IDLE;
+ /* Earliest time when we have to call rebalance_domains again */
+ unsigned long next_balance = jiffies + 60*HZ;
for_each_domain(this_cpu, sd) {
if (!(sd->flags & SD_LOAD_BALANCE))
@@ -2884,8 +2889,13 @@ rebalance_tick(int this_cpu, struct rq *
}
sd->last_balance += interval;
}
+ next_balance = min(next_balance,
+ sd->last_balance + sd->balance_interval);
}
+ this_rq->next_balance = next_balance;
}
+
+DECLARE_TASKLET(rebalance, &rebalance_domains, 0L);
#else
/*
* on UP we do not need to balance between CPUs:
@@ -3137,7 +3147,8 @@ void scheduler_tick(void)
task_running_tick(rq, p);
#ifdef CONFIG_SMP
update_load(rq);
- rebalance_tick(cpu, rq);
+ if (jiffies >= rq->next_balance)
+ tasklet_schedule(&rebalance);
#endif
}
next prev parent reply other threads:[~2006-10-28 2:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-28 2:41 [PATCH 0/7] sched_domain balancing via tasklet V2 Christoph Lameter
2006-10-28 2:41 ` [PATCH 1/7] Avoid taking rq lock in wake_priority_sleeper Christoph Lameter
2006-10-28 2:41 ` [PATCH 2/7] Disable interrupts for locking in load_balance() Christoph Lameter
2006-10-28 2:41 ` [PATCH 3/7] Extract load calculation from rebalance_tick Christoph Lameter
2006-10-28 2:41 ` [PATCH 4/7] Stagger load balancing in build_sched_domains Christoph Lameter
2006-10-28 2:41 ` [PATCH 5/7] Move idle stat calculation into rebalance_tick() Christoph Lameter
2006-10-28 17:57 ` Siddha, Suresh B
2006-10-29 1:05 ` Christoph Lameter
2006-10-28 2:41 ` Christoph Lameter [this message]
2006-10-28 2:41 ` [PATCH 7/7] Call tasklet less frequently Christoph Lameter
-- strict thread matches above, loose matches on Subject: below --
2006-11-03 20:46 [PATCH 0/7] sched_domain balancing via tasklet V3 Christoph Lameter
2006-11-03 20:47 ` [PATCH 6/7] Use tasklet to call balancing Christoph Lameter
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=20061028024143.10809.72940.sendpatchset@schroedinger.engr.sgi.com \
--to=clameter@sgi.com \
--cc=akpm@osdl.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=nickpiggin@yahoo.com.au \
--cc=pwil3058@bigpond.net.au \
--cc=suresh.b.siddha@intel.com \
/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