On Mon, Aug 04, 2014 at 02:25:15PM +0200, Peter Zijlstra wrote: > On Mon, Aug 04, 2014 at 04:50:44AM -0700, Paul E. McKenney wrote: > > OK, I will bite... > > > > What kinds of tasks are on a runqueue, but neither ->on_cpu nor > > PREEMPT_ACTIVE? > > Userspace tasks, they don't necessarily get PREEMPT_ACTIVE when > preempted. Now obviously you're not _that_ interested in userspace tasks > for this, so that might be ok. > > But the main point was, you cannot use ->on_cpu or PREEMPT_ACTIVE > without holding rq->lock. Hmm, maybe you can, we have the context switch in between setting ->on_cpu and clearing PREEMPT_ACTIVE and vice-versa. The context switch (obviously) provides a full barrier, so we might be able to -- with careful consideration -- read these two separate values and construct something usable from them. Something like: task_preempt_count(tsk) & PREEMPT_ACTIVE smp_rmb(); tsk->on_cpu And because we set PREEMPT_ACTIVE before clearing on_cpu, this should race the right way (err towards the inclusive side). Obviously that wants a big fat comment...