From: tip-bot for Mike Galbraith <efault@gmx.de>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@redhat.com,
a.p.zijlstra@chello.nl, efault@gmx.de, tglx@linutronix.de,
mingo@elte.hu
Subject: [tip:sched/core] sched: Cleanup/optimize clock updates
Date: Thu, 11 Mar 2010 18:31:28 GMT [thread overview]
Message-ID: <tip-a64692a3afd85fe048551ab89142fd5ca99a0dbd@git.kernel.org> (raw)
In-Reply-To: <1268301199.6785.32.camel@marge.simson.net>
Commit-ID: a64692a3afd85fe048551ab89142fd5ca99a0dbd
Gitweb: http://git.kernel.org/tip/a64692a3afd85fe048551ab89142fd5ca99a0dbd
Author: Mike Galbraith <efault@gmx.de>
AuthorDate: Thu, 11 Mar 2010 17:16:20 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 11 Mar 2010 18:32:50 +0100
sched: Cleanup/optimize clock updates
Now that we no longer depend on the clock being updated prior to enqueueing
on migratory wakeup, we can clean up a bit, placing calls to update_rq_clock()
exactly where they are needed, ie on enqueue, dequeue and schedule events.
In the case of a freshly enqueued task immediately preempting, we can skip the
update during preemption, as the clock was just updated by the enqueue event.
We also save an unneeded call during a migratory wakeup by not updating the
previous runqueue, where update_curr() won't be invoked.
Signed-off-by: Mike Galbraith <efault@gmx.de>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <1268301199.6785.32.camel@marge.simson.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/sched.c | 32 ++++++++++++++++----------------
kernel/sched_fair.c | 2 --
2 files changed, 16 insertions(+), 18 deletions(-)
diff --git a/kernel/sched.c b/kernel/sched.c
index 68ed6f4..16559de 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -495,6 +495,8 @@ struct rq {
u64 nohz_stamp;
unsigned char in_nohz_recently;
#endif
+ unsigned int skip_clock_update;
+
/* capture load from *all* tasks on this cpu: */
struct load_weight load;
unsigned long nr_load_updates;
@@ -592,6 +594,13 @@ static inline
void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags)
{
rq->curr->sched_class->check_preempt_curr(rq, p, flags);
+
+ /*
+ * A queue event has occurred, and we're going to schedule. In
+ * this case, we can save a useless back to back clock update.
+ */
+ if (test_tsk_need_resched(p))
+ rq->skip_clock_update = 1;
}
static inline int cpu_of(struct rq *rq)
@@ -626,7 +635,8 @@ static inline int cpu_of(struct rq *rq)
inline void update_rq_clock(struct rq *rq)
{
- rq->clock = sched_clock_cpu(cpu_of(rq));
+ if (!rq->skip_clock_update)
+ rq->clock = sched_clock_cpu(cpu_of(rq));
}
/*
@@ -1782,8 +1792,6 @@ static void double_rq_lock(struct rq *rq1, struct rq *rq2)
raw_spin_lock_nested(&rq1->lock, SINGLE_DEPTH_NESTING);
}
}
- update_rq_clock(rq1);
- update_rq_clock(rq2);
}
/*
@@ -1880,6 +1888,7 @@ static void update_avg(u64 *avg, u64 sample)
static void
enqueue_task(struct rq *rq, struct task_struct *p, int wakeup, bool head)
{
+ update_rq_clock(rq);
sched_info_queued(p);
p->sched_class->enqueue_task(rq, p, wakeup, head);
p->se.on_rq = 1;
@@ -1887,6 +1896,7 @@ enqueue_task(struct rq *rq, struct task_struct *p, int wakeup, bool head)
static void dequeue_task(struct rq *rq, struct task_struct *p, int sleep)
{
+ update_rq_clock(rq);
sched_info_dequeued(p);
p->sched_class->dequeue_task(rq, p, sleep);
p->se.on_rq = 0;
@@ -2366,7 +2376,6 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
smp_wmb();
rq = task_rq_lock(p, &flags);
- update_rq_clock(rq);
if (!(p->state & state))
goto out;
@@ -2407,7 +2416,6 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
rq = cpu_rq(cpu);
raw_spin_lock(&rq->lock);
- update_rq_clock(rq);
/*
* We migrated the task without holding either rq->lock, however
@@ -2624,7 +2632,6 @@ void wake_up_new_task(struct task_struct *p, unsigned long clone_flags)
BUG_ON(p->state != TASK_WAKING);
p->state = TASK_RUNNING;
- update_rq_clock(rq);
activate_task(rq, p, 0);
trace_sched_wakeup_new(rq, p, 1);
check_preempt_curr(rq, p, WF_FORK);
@@ -3578,6 +3585,9 @@ static inline void schedule_debug(struct task_struct *prev)
static void put_prev_task(struct rq *rq, struct task_struct *prev)
{
+ if (prev->se.on_rq)
+ update_rq_clock(rq);
+ rq->skip_clock_update = 0;
prev->sched_class->put_prev_task(rq, prev);
}
@@ -3640,7 +3650,6 @@ need_resched_nonpreemptible:
hrtick_clear(rq);
raw_spin_lock_irq(&rq->lock);
- update_rq_clock(rq);
clear_tsk_need_resched(prev);
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
@@ -4197,7 +4206,6 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
BUG_ON(prio < 0 || prio > MAX_PRIO);
rq = task_rq_lock(p, &flags);
- update_rq_clock(rq);
oldprio = p->prio;
prev_class = p->sched_class;
@@ -4240,7 +4248,6 @@ void set_user_nice(struct task_struct *p, long nice)
* the task might be in the middle of scheduling on another CPU.
*/
rq = task_rq_lock(p, &flags);
- update_rq_clock(rq);
/*
* The RT priorities are set via sched_setscheduler(), but we still
* allow the 'normal' nice value to be set - but as expected
@@ -4523,7 +4530,6 @@ recheck:
raw_spin_unlock_irqrestore(&p->pi_lock, flags);
goto recheck;
}
- update_rq_clock(rq);
on_rq = p->se.on_rq;
running = task_current(rq, p);
if (on_rq)
@@ -5530,7 +5536,6 @@ void sched_idle_next(void)
__setscheduler(rq, p, SCHED_FIFO, MAX_RT_PRIO-1);
- update_rq_clock(rq);
activate_task(rq, p, 0);
raw_spin_unlock_irqrestore(&rq->lock, flags);
@@ -5585,7 +5590,6 @@ static void migrate_dead_tasks(unsigned int dead_cpu)
for ( ; ; ) {
if (!rq->nr_running)
break;
- update_rq_clock(rq);
next = pick_next_task(rq);
if (!next)
break;
@@ -5869,7 +5873,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
rq->migration_thread = NULL;
/* Idle task back to normal (off runqueue, low prio) */
raw_spin_lock_irq(&rq->lock);
- update_rq_clock(rq);
deactivate_task(rq, rq->idle, 0);
__setscheduler(rq, rq->idle, SCHED_NORMAL, 0);
rq->idle->sched_class = &idle_sched_class;
@@ -7815,7 +7818,6 @@ static void normalize_task(struct rq *rq, struct task_struct *p)
{
int on_rq;
- update_rq_clock(rq);
on_rq = p->se.on_rq;
if (on_rq)
deactivate_task(rq, p, 0);
@@ -8177,8 +8179,6 @@ void sched_move_task(struct task_struct *tsk)
rq = task_rq_lock(tsk, &flags);
- update_rq_clock(rq);
-
running = task_current(rq, tsk);
on_rq = tsk->se.on_rq;
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index c3b69d4..69e5820 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -3064,8 +3064,6 @@ static void active_load_balance(struct rq *busiest_rq, int busiest_cpu)
/* move a task from busiest_rq to target_rq */
double_lock_balance(busiest_rq, target_rq);
- update_rq_clock(busiest_rq);
- update_rq_clock(target_rq);
/* Search for an sd spanning us and the target CPU. */
for_each_domain(target_cpu, sd) {
next prev parent reply other threads:[~2010-03-11 18:32 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-11 9:49 [patch 0/12] sched: fastpath cycle recovery Mike Galbraith
2010-03-11 9:50 ` [patch 1/12] sched: ratelimit nohz Mike Galbraith
2010-03-11 18:30 ` [tip:sched/core] sched: Rate-limit nohz tip-bot for Mike Galbraith
2010-03-11 9:51 ` [patch 2/12] sched: remove avg_wakeup Mike Galbraith
2010-03-11 18:30 ` [tip:sched/core] sched: Remove avg_wakeup tip-bot for Mike Galbraith
2010-03-11 9:52 ` [patch 3/12] sched: remove avg_overlap Mike Galbraith
2010-03-11 18:31 ` [tip:sched/core] sched: Remove avg_overlap tip-bot for Mike Galbraith
2010-03-11 9:53 ` [patch 4/12] sched: cleanup/optimize clock updates Mike Galbraith
2010-03-11 18:31 ` tip-bot for Mike Galbraith [this message]
2010-03-11 9:54 ` [patch 5/12] sched: tweak sched_latency and min_granularity Mike Galbraith
2010-03-11 18:31 ` [tip:sched/core] sched: Tweak " tip-bot for Mike Galbraith
2010-03-11 9:56 ` [patch 6/12] sched: fix select_idle_sibling() Mike Galbraith
2010-03-11 18:32 ` [tip:sched/core] sched: Fix select_idle_sibling() tip-bot for Mike Galbraith
2010-03-11 9:57 ` [patch 7/12] sched: remove NORMALIZED_SLEEPER Mike Galbraith
2010-03-11 18:32 ` [tip:sched/core] sched: Remove NORMALIZED_SLEEPER tip-bot for Mike Galbraith
2010-03-11 9:58 ` [patch 8/12] sched: remove FAIR_SLEEPERS feature Mike Galbraith
2010-03-11 18:32 ` [tip:sched/core] sched: Remove " tip-bot for Mike Galbraith
2010-03-11 9:59 ` [patch 9/12] sched: remove WAKEUP_SYNC feature Mike Galbraith
2010-03-11 18:32 ` [tip:sched/core] sched: Remove " tip-bot for Mike Galbraith
2010-03-11 10:01 ` [patch 11/12] sched: remove ASYM_GRAN feature Mike Galbraith
2010-03-11 18:33 ` [tip:sched/core] sched: Remove " tip-bot for Mike Galbraith
2010-03-11 10:03 ` [patch 10/12] sched: remove SYNC_WAKEUPS feature Mike Galbraith
2010-03-11 18:33 ` [tip:sched/core] sched: Remove " tip-bot for Mike Galbraith
2010-03-11 10:04 ` [patch 12/12] sched: remove AFFINE_WAKEUPS feature Mike Galbraith
2010-03-11 18:33 ` [tip:sched/core] sched: Remove " tip-bot for Mike Galbraith
2010-03-12 3:23 ` Yong Zhang
2010-03-12 4:37 ` Mike Galbraith
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=tip-a64692a3afd85fe048551ab89142fd5ca99a0dbd@git.kernel.org \
--to=efault@gmx.de \
--cc=a.p.zijlstra@chello.nl \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--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.