On 10/25, Roman Pen wrote: > > void wq_worker_waking_up(struct task_struct *task, int cpu) > { > - struct worker *worker = kthread_data(task); > + struct worker *worker; > + > + if (task->flags & PF_EXITING) { > + /* > + * Careful here, t->vfork_done is zeroed out for > + * almost dead tasks, do not touch kthread_data(). > + */ > + return; > + } > + > + worker = kthread_data(task); > > if (!(worker->flags & WORKER_NOT_RUNNING)) { > WARN_ON_ONCE(worker->pool->cpu != cpu); > @@ -875,9 +885,19 @@ void wq_worker_waking_up(struct task_struct *task, int > cpu) > */ > struct task_struct *wq_worker_sleeping(struct task_struct *task) > { > - struct worker *worker = kthread_data(task), *to_wakeup = NULL; > + struct worker *worker, *to_wakeup = NULL; > struct worker_pool *pool; > > + if (task->flags & PF_EXITING) { > + /* > + * Careful here, t->vfork_done is zeroed out for > + * almost dead tasks, do not touch kthread_data(). > + */ > + return NULL; > + } > + > + worker = kthread_data(task); > +
Please see the patch I send a minute ago. With that patch we do not need this fix, kthread_data() no longer uses ->vfork_done. Oleg.