Messages in this thread | | | Date | Tue, 24 Jan 2012 13:01:12 -0500 | From | KOSAKI Motohiro <> | Subject | Re: [BUG] TASK_DEAD task is able to be woken up in special condition |
| |
On 1/24/2012 5:23 AM, Peter Zijlstra wrote: > On Wed, 2011-12-28 at 16:07 -0500, KOSAKI Motohiro wrote: >> I looked at scheduler code today briefly. now I'm afraid following code >> have similar race. >> >> >> if (task_contributes_to_load(p)) >> rq->nr_uninterruptible--; >> >> >> >> Can't following schenario be happen? >> >> >> CPU0 CPU1 >> -------------------------------------------------------- >> deactivate_task() >> task->state = TASK_UNINTERRUPTIBLE; >> activate_task() >> rq->nr_uninterruptible--; >> >> schedule() >> deactivate_task() >> rq->nr_uninterruptible++; >> >> Totally, nr_uninterruptible wasn't incremented. >> >> >> I'm still not sure. I need to read more sched code. > > You shouldn't ever set another tasks ->state.
I'm sorry. I haven't catch your point. I think following step is valid kernel code. Do you disagree?
>> task->state = TASK_UNINTERRUPTIBLE; >> schedule()
| |