diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2011-08-11 15:03:35 +0200 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-03-24 10:26:51 -0500 |
commit | b44296b0ae0972273a4cdba249d80f9bfdaeadb6 (patch) | |
tree | 74e3963661b62401fbdc5b06779185bbe55533d9 /kernel | |
parent | dab8b2f123e4544f43789c697441594738090e42 (diff) |
sched: Optimize migrate_disable
Change from task_rq_lock() to raw_spin_lock(&rq->lock) to avoid a few
atomic ops. See comment on why it should be safe.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/n/tip-cbz6hkl5r5mvwtx5s3tor2y6@git.kernel.org
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 8ceb0af4d11e..ebdf95d49ab2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -6319,7 +6319,19 @@ void migrate_disable(void) preempt_enable(); return; } - rq = task_rq_lock(p, &flags); + + /* + * Since this is always current we can get away with only locking + * rq->lock, the ->cpus_allowed value can normally only be changed + * while holding both p->pi_lock and rq->lock, but seeing that this + * it current, we cannot actually be waking up, so all code that + * relies on serialization against p->pi_lock is out of scope. + * + * Taking rq->lock serializes us against things like + * set_cpus_allowed_ptr() that can still happen concurrently. + */ + rq = this_rq(); + raw_spin_lock_irqsave(&rq->lock, flags); p->migrate_disable = 1; mask = tsk_cpus_allowed(p); @@ -6330,7 +6342,7 @@ void migrate_disable(void) p->sched_class->set_cpus_allowed(p, mask); p->rt.nr_cpus_allowed = cpumask_weight(mask); } - task_rq_unlock(rq, p, &flags); + raw_spin_unlock_irqrestore(&rq->lock, flags); preempt_enable(); } EXPORT_SYMBOL_GPL(migrate_disable); @@ -6358,7 +6370,11 @@ void migrate_enable(void) return; } - rq = task_rq_lock(p, &flags); + /* + * See comment in migrate_disable(). + */ + rq = this_rq(); + raw_spin_lock_irqsave(&rq->lock, flags); p->migrate_disable = 0; mask = tsk_cpus_allowed(p); @@ -6370,7 +6386,7 @@ void migrate_enable(void) p->rt.nr_cpus_allowed = cpumask_weight(mask); } - task_rq_unlock(rq, p, &flags); + raw_spin_unlock_irqrestore(&rq->lock, flags); unpin_current_cpu(); preempt_enable(); } |