Messages in this thread | | | Date | Wed, 18 Jul 2007 20:35:59 +0400 | From | Oleg Nesterov <> | Subject | Re: Q: a bogus task_running() check in try_to_wake_up() ? |
| |
On 07/17, Ingo Molnar wrote: > > * Oleg Nesterov <oleg@tv-sign.ru> wrote: > > > try_to_wake_up: > > > > if (p->se.on_rq) > > goto out_running; > > > > ... > > > > if (unlikely(task_running(rq, p))) > > goto out_activate; > > > > How it possible that rq->curr has on_rq == 0 ? > > > > AFAICS, this can only happen if this task is rq->idle. But idle > > threads should not sleep, we have a special "scheduling from the idle > > thread!" check in schedule(). > > it's also possible if an arch uses __ARCH_WANT_INTERRUPTS_ON_CTXSW, > right?
Ah, got it. I guess you meant __ARCH_WANT_UNLOCKED_CTXSW though.
In that case schedule() drops rq->lock before the context switch, but doesn't clear ->oncpu. So, task_running(p) means we must not activate "p" on another CPU, otherwise it could be scheduled before the switch-in-progress completes.
Thanks a lot!
Oleg.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |