From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753643AbdA3N6z (ORCPT ); Mon, 30 Jan 2017 08:58:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42974 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753609AbdA3N6q (ORCPT ); Mon, 30 Jan 2017 08:58:46 -0500 Date: Mon, 30 Jan 2017 14:49:48 +0100 From: Oleg Nesterov To: Kees Cook Cc: Pavel Tikhomirov , Ingo Molnar , Peter Zijlstra , Andrew Morton , Cyrill Gorcunov , John Stultz , Thomas Gleixner , Nicolas Pitre , Michal Hocko , Stanislav Kinsburskiy , Mateusz Guzik , LKML , Pavel Emelyanov , Konstantin Khorenko Subject: Re: task_is_descendant() cleanup Message-ID: <20170130134947.GA24718@redhat.com> References: <20170119164346.4214-1-ptikhomirov@virtuozzo.com> <20170120181359.GA17205@redhat.com> <4908be49-d3c3-366d-0fd1-05249ef4ecef@virtuozzo.com> <20170123115534.GA11827@redhat.com> <20170123125222.GA28626@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 30 Jan 2017 13:49:51 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/25, Kees Cook wrote: > > On Mon, Jan 23, 2017 at 4:52 AM, Oleg Nesterov wrote: > > On 01/23, Oleg Nesterov wrote: > >> > >> Btw task_is_descendant() looks wrong at first glance. > > > > No, I missed the 2nd ->group_leader dereference. Still this function looks > > overcomplicated and the usage of thread_group_leader/group_leader just add > > the unnecessary confusion. It can be simplified a little bit: > > > > static int task_is_descendant(struct task_struct *parent, > > struct task_struct *child) > > { > > int rc = 0; > > struct task_struct *walker; > > > > if (!parent || !child) > > return 0; > > > > rcu_read_lock(); > > for (walker = child; walker->pid; walker = rcu_dereference(walker->real_parent)) > > if (same_thread_group(parent, walker)) { > > rc = 1; > > break; > > } > > rcu_read_unlock(); > > > > return rc; > > } > > > > Kees, I can send a patch if you think this very minor cleanup makes any sense. > > Err, isn't checking same_thread_group() at every level more expensive > than what I currently have? Well, same_thread_group(p1,p2) is just p1->signal == p2->signal yes this is a bit more expensive than walker == parent we currently have, yes. But this eliminates if (!thread_group_leader(walker)) walker = rcu_dereference(walker->group_leader); we currently do at every level. And note that "parent" can exec and change its ->group_leader at any time, we probably do not care but this looks confusing. But please forget, this is really minor. Oleg.