On 01/30/2017 03:51 PM, Oleg Nesterov wrote:
On 01/27, Pavel Tikhomirov wrote:--- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1725,6 +1725,8 @@ struct task_struct { struct signal_struct *signal; struct sighand_struct *sighand; + struct list_head csr_descendant; +You forgot to remove this part ;)
Oh, sure.
--- a/kernel/fork.c +++ b/kernel/fork.c @@ -1367,9 +1367,6 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) sig->oom_score_adj = current->signal->oom_score_adj; sig->oom_score_adj_min = current->signal->oom_score_adj_min; - sig->has_child_subreaper = current->signal->has_child_subreaper || - current->signal->is_child_subreaper; - mutex_init(&sig->cred_guard_mutex); return 0; @@ -1800,6 +1797,13 @@ static __latent_entropy struct task_struct *copy_process( p->signal->leader_pid = pid; p->signal->tty = tty_kref_get(current->signal->tty); + /* + * Inherit has_child_subreaper flag under the same + * tasklist_lock with adding child to the process tree + * for propagate_has_child_subreaper optimization. + */ + p->signal->has_child_subreaper = current->signal->has_child_subreaper || + current->signal->is_child_subreaper;Ah yes, we need this change too... And perhaps it would be more correct to do p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper || p->real_parent->signal->is_child_subreaper; the current code is not exactly right if CLONE_PARENT...
I'm fine with inheriting 'has' flag from real_parent, because if real_parent does not have 'has' flag set but parent has 'has' set, we inherited the flag in vain.
But I don't actually think that inheritance from parent not real_parent breaks my optimization: if real_parent has the flag, so does the parent.
Oleg.
-- Best regards, Tikhomirov Pavel Software Developer, Virtuozzo.

