From: Yong Zhang on 19 May 2010 09:20 On Wed, May 19, 2010 at 02:57:11PM +0200, Oleg Nesterov wrote: > - Contrary to what 6d558c3a says, there is no need to reload > prev = rq->curr after the context switch. You always schedule > back to where you came from, prev must be equal to current > even if cpu/rq was changed. > > - This also means reacquire_kernel_lock() can use prev instead > of current. > > - No need to reassign switch_count if reacquire_kernel_lock() > reports need_resched(), we can just move the initial assignment > down, under the "need_resched_nonpreemptible:" label. > > - Try to update the comment after context_switch(). > > Signed-off-by: Oleg Nesterov <oleg(a)redhat.com> This make it more clear now. Thank you Oleg. Acked-by: Yong Zhang <yong.zhang0(a)gmail.com> > --- > > kernel/sched.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > --- 34-rc1/kernel/sched.c~SCHEDULE_PREV_EQ_TO_CURRENT 2010-05-18 23:32:50.000000000 +0200 > +++ 34-rc1/kernel/sched.c 2010-05-19 14:32:57.000000000 +0200 > @@ -3679,7 +3679,6 @@ need_resched: > rq = cpu_rq(cpu); > rcu_sched_qs(cpu); > prev = rq->curr; > - switch_count = &prev->nivcsw; > > release_kernel_lock(prev); > need_resched_nonpreemptible: > @@ -3693,6 +3692,7 @@ need_resched_nonpreemptible: > update_rq_clock(rq); > clear_tsk_need_resched(prev); > > + switch_count = &prev->nivcsw; > if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { > if (unlikely(signal_pending_state(prev->state, prev))) > prev->state = TASK_RUNNING; > @@ -3719,8 +3719,10 @@ need_resched_nonpreemptible: > > context_switch(rq, prev, next); /* unlocks the rq */ > /* > - * the context switch might have flipped the stack from under > - * us, hence refresh the local variables. > + * The context switch have flipped the stack from under us > + * and restored the local variables which were saved when > + * this task called schedule() in the past. prev == current > + * is still correct, but it can be moved to another cpu/rq. > */ > cpu = smp_processor_id(); > rq = cpu_rq(cpu); > @@ -3729,11 +3731,8 @@ need_resched_nonpreemptible: > > post_schedule(rq); > > - if (unlikely(reacquire_kernel_lock(current) < 0)) { > - prev = rq->curr; > - switch_count = &prev->nivcsw; > + if (unlikely(reacquire_kernel_lock(prev))) > goto need_resched_nonpreemptible; > - } > > preempt_enable_no_resched(); > if (need_resched()) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|
Pages: 1 Prev: logfs: kill BKL Next: generic rwsem: implement down_read_critical() / up_read_critical() |