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.

Reply via email to