On 07/28, NeilBrown wrote: > > +/* Thread group leader can change, so stop loop when we see one > + * even if it isn't 'g' */ > #define while_each_thread(g, t) \ > - while ((t = next_thread(t)) != g) > + while ((t = next_thread(t)) != g && !thread_group_leader(t)) This assumes that while_each_thread(g, t) always uses g == group_leader. > @@ -70,8 +70,13 @@ static void __unhash_process(struct task_struct *p, bool group_dead) > list_del_rcu(&p->tasks); > list_del_init(&p->sibling); > __this_cpu_dec(process_counts); > - } > - list_del_rcu(&p->thread_group); > + } else > + /* only remove members from the thread group. > + * The thread group leader must stay so that > + * while_each_thread() uses can see the end of > + * the list and stop. > + */ > + list_del_rcu(&p->thread_group); Hmm... this looks obvously wrong. This leaves the dead thread on the list. Oleg. _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers