Oleg Nesterov <[EMAIL PROTECTED]> writes: > On 04/24, Oleg Nesterov wrote: >> >> Hm, mm_release() clears ->vfork_done before complete().
Duh. Yes somehow I had a blind spot there. I clearly need to handle that case. >> mm_release: >> >> struct completion *vfork_done = tsk->vfork_done; >> >> if (vfork_done) { >> tsk->vfork_done = NULL; >> complete(vfork_done); >> } >> >> >> kthread_stop: >> >> set_tsk_thread_flag(tsk, TIF_KTHREAD_STOP); >> signal_wake_up(tsk, 1); >> >> // tsk exits, sets ->vfork_done == NULL >> >> wait_for_completion(tsk->vfork_done); > > Since the task_struct should be pinned anyway, I think kthread_stop() > should do: > > vfork_done = tsk->vfork_done; > barrier(); > if (vfork_done) > wait_for_completion(vfork_done); That should work, and this may explain what is going on. I was trying to figure out how this could happen but if the thread is running on another cpu there is a race and it may exit quickly enough to cause us problems before we get to kthread_stop. I don't know if this is the problem but it certainly needs to be fixed. Eric - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/