From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751080AbdAXPCC (ORCPT ); Tue, 24 Jan 2017 10:02:02 -0500 Received: from mail-eopbgr00108.outbound.protection.outlook.com ([40.107.0.108]:61186 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750827AbdAXPCA (ORCPT ); Tue, 24 Jan 2017 10:02:00 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ptikhomirov@virtuozzo.com; Subject: Re: [PATCH] introduce the walk_process_tree() helper To: Oleg Nesterov References: <20170119164346.4214-1-ptikhomirov@virtuozzo.com> <20170123115715.GB11827@redhat.com> CC: Ingo Molnar , Peter Zijlstra , Andrew Morton , Cyrill Gorcunov , John Stultz , Thomas Gleixner , Nicolas Pitre , Michal Hocko , Stanislav Kinsburskiy , Mateusz Guzik , , Pavel Emelyanov , Konstantin Khorenko From: Pavel Tikhomirov Message-ID: Date: Tue, 24 Jan 2017 18:01:53 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <20170123115715.GB11827@redhat.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0802CA0023.eurprd08.prod.outlook.com (10.172.123.161) To DB6PR0801MB1848.eurprd08.prod.outlook.com (10.169.227.146) X-MS-Office365-Filtering-Correlation-Id: 4657f1d0-117a-4b64-6e47-08d44469f161 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1848; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1848;3:OeYWUo3wdEwP5yUp5YkJ1hhgN7aJ0UaOvWzEu5wtEGZPUzPzSc2VkJZyg6Ap7P0CWMRWZYdcmJUXwtPwiJzIjXFiEeCNXd9mygHw4ccECttz4+GDlcUFpukwKuqJ2nPHVkXtjVxj8rp9A9styt2eTrjj5PadKh8RCJfK9/OCmeFplf+0+xtDP5Kc2nsFmbiKLahZe3lpE4yzVSnLKHXClFyfBgGBT2lznGr33DVKueW6HxRDTK1NNUibE+Da6/wwm9wxSI2CrHRvr7GCOOI81w==;25:9lw7rtVunSFVUPQvax5Q2uDszNz5bbeR+j74uXa01+6mxoLAvXnPh0INYBdCa0rDUHLx7tsPZCsDRGMMMWPSZ0V9WfIg/8djjuUjtkAkSNbv8Lyb0/RZBiMvgI7eFr+T+88NqFHN3Ib/9kSTjfpw9LYQgEs630pSHSYJQvpCK/odNCbztmRL049MU05ELKL2kkPMjYE8b2RiSOat5XCaXAof2NXbWifGey6PtKnKV7/4+q+DUgyiW9I8KCiP7Nx/q3ujDhiFSWdPcLngkB+8HZSZCJ0QHJYsfgeix2+nj+nWri7jIB4W98gdNSFHRWbBE1OzqoCLDmgRDeXkh88wS9HMQCJ3rWVrNoizdQpw5nQvYj4XiTKsGqSfStPWPJTlA9NFRSs41Z8D6E2W2cg/oN/5NTYnHmXfSLXJg6lwHsGLdc7MQ7zhNuCml8NPQRn4IliTjcYycrcONArwHymQDQ== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1848;31:/gLFqNUc0HulawYKa11hUg81ksep7OW6pq5lfZD66KIzCRi/31xhQ7NWlQT6J18ciTx75CaHjougjixsJWbgIhxvv/YS/qcfNwQdimolVnNT2GD/Q8wG27fclnghes152n8OGUcSIfQ/b/92fR1n83jOaH5at5DlXqSw08l4h0OGPYTH2TEN8PINpapss4FoQ51I0G5FcTQCpw1RJ/+A/f9b21JrHarsdmcnz9ufYYDdC+XAFmck/FY8qp2+xMIA;20:Pfx+ALhH9WAwLgoOag8AqIFtjLLtVOSgvyxlkwckb14rrN1kmKf+a3lcKWtKGUF4jxHI5NS/1OdzX+qNtUHFTuCZ12Sq2P/N+7O7+/+Ip9BpH4ysD1gDNfqiSL3Ds366QCTT2XUrDOQCQ6pp//HO4TAyky4qIkJ+QcrzD/8WcfpxOL8g+3hD6DylxXCu0xErKP8AnkTki/32/a2XXx/hNNlDZpr1cLAMhIWc5tAPJ1wOvqlFGXJiVOsRIGA17Sa4 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123564025)(20161123560025)(20161123562025)(20161123555025)(6072148);SRVR:DB6PR0801MB1848;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1848; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1848;4:TJ0WKw3/0tcgrjgl/9cWMsZcegXCKEMGN/gD6ppGroOgxc1aezhnSKtxjaAxIKDoRX8f592wkW9k/DQcUZSS3n9TTF8Q1WyIWXMnJht9TmFcf/DU+Y0gJ7gwb2P2TMUWyI3NdbuHC62Ak3JmDfIWsQqMqKqxrG0xe8AEbj+D+TpoMKfHMOv5kdTyMLKSM8EZzYdU5xmTgQBoHALwqlYlY0z6LM+WEJYeU3EgQaDarBstOtI2vzWQ/3cOst2mjoE355JlFvDuOW21LlWREZjRztMcgcOsAcd0UxQe0hNQoiBP4W8kv/L5z/5MRav0TOZ5k61HPzF7A/QZPX9hJn4C+oaJHqNJGFfzulkOo5vwGq7g90JIkW17nUuBg1XJT/a6kZaErXRGqELxbcp2HzqmahqJtxTqU5ONzYtjB4O+q8jemp3P7FJgkhVxDoV0K0vyD3VR5gqO9fM7n0XrSiSHgmN5TVXQJmm5CnPuffQl4oT8EqpNgOS78g0nbclMiO9v7lJV6GXCJkQZF7muDfaQt6i/MQMlGeJMfdkV77g5ny8zTFpq3h0EhZknbNOaRLNi X-Forefront-PRVS: 0197AFBD92 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(7916002)(39830400002)(39410400002)(39450400003)(377454003)(199003)(189002)(24454002)(38730400001)(2906002)(97736004)(101416001)(76176999)(83506001)(65956001)(4326007)(92566002)(6486002)(229853002)(5660300001)(23746002)(50466002)(107886002)(77096006)(7416002)(65806001)(66066001)(81156014)(110136003)(6116002)(3846002)(47776003)(90366009)(65826007)(64126003)(8676002)(81166006)(54356999)(305945005)(31686004)(36756003)(189998001)(2950100002)(6666003)(4001430100002)(7736002)(42186005)(6916009)(31696002)(25786008)(68736007)(105586002)(86362001)(230700001)(53936002)(50986999)(54906002)(4001350100001)(106356001)(33646002);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1848;H:[172.16.24.246];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;DB6PR0801MB1848;23:iX46/QzCbUGgNWX+E13Y6VqL2zjj8C6FRsd?= =?Windows-1252?Q?LHtPOcn86Jy4jEZrZxiVwu0dXzQXfKJdjpsHpfxXQkWg3y2Pi4yXC1CV?= =?Windows-1252?Q?gt22AIySQ9xLX6RcQmUOJA4qQ52D2hlk5pfhf05631QR5tur8QJRemdA?= =?Windows-1252?Q?M3jagZU03k6d+9La7XPDiOORQ1RdtMU9h59fQ+E7Tss/db15St23eyeW?= =?Windows-1252?Q?CQ0EV+RnJNhqn/pK/J6CkAL83gaSUbQZml1Q0bxLNEO4CmXOrKwNWqF3?= =?Windows-1252?Q?pUrST+SBEnlrcsX1vVl7Ys1qyOlIIw+VCq/aFFQu0Kuf7x3SJpsVgqhW?= =?Windows-1252?Q?mqXeRpwG+Y/Z5N0N4b0F1Ux7EmscBsz0kK4ZSiRTuBx2otGVnyX0f4Hw?= =?Windows-1252?Q?PE6ZdoqSesIN5nfCD6ve5d4k6xq0RM6wU8xAhEb9zQAQ/8EhhbfdyfU3?= =?Windows-1252?Q?noHcnB3Jbb1eOqAPvX7QZLGvkAP0D4Yy/FfCOKNZ6OKSeyvw8DU1DWcy?= =?Windows-1252?Q?p3rjk7t37v975h1/Mdg1vfeChijZRYYDU4aG9gV5eMQ3LuQzhq4wbllq?= =?Windows-1252?Q?bKHkvhp034v4itq3Hc3l8nW35rZScFNyLAMQtCQIUTxpuQwjN4EqFAJ5?= =?Windows-1252?Q?dRXRZ5o6An6bVuc9bGepmZTkIz6w3N7DNSg8noB3U6xVVZc3aYR9gLoy?= =?Windows-1252?Q?CUUVNY1K0erta2abU10lyj/WxzWAQd1bOTzb7xCiq7dRJkBBRpaDI6vg?= =?Windows-1252?Q?0bm7RmDfV41cJhgU6BspOXi+np7EQTdalNOuvtinCof5ogbkM66KQ1r/?= =?Windows-1252?Q?YJwJHL0l4UW0Y+uo2sip2Qxem77V0ZUjzvIFsD/y869Jk7mCXKfpzLm4?= =?Windows-1252?Q?Geprm4+CjrNZ1AWCrL0EjKnt84oIDimQA0HhaBuM9K8tEwB7+YnfdfFR?= =?Windows-1252?Q?Bh1PQop0Zz/eEDlS5j5Dxky8HVs3/n4q9YHRynHwFx7nCLTtlHnT9Wmo?= =?Windows-1252?Q?/UrTQNbG9ok9eQXC+gvLphZCmP0hExTXEgrQz4Dy33XkqES2dnlE3dDf?= =?Windows-1252?Q?tIhzld/o6PduLK/8QOsFSDtcUFiGmkBEeXSeE6xb74E2M3Wp59E2s1F3?= =?Windows-1252?Q?TFykI1T/ZuCPb3xWUwNP67NWcXmBXj6R/h12JFJwzfJfJigdbUQre07X?= =?Windows-1252?Q?DzyIWu6RMKuA4W83AvqemGsvs9JoHDlje+ol42MzqsczCZc//0UUs1kG?= =?Windows-1252?Q?wcELpPpJLySs46hDQyIT0inLt9u9t2zlaXdMWaaPDRjgTVfLmvpSekj0?= =?Windows-1252?Q?n2UScqvCNj0l/YpKZ3WNIa4XVBPkqr7BTgndwUW6Y+5G0Zh7h+M12CMM?= =?Windows-1252?Q?r4+3hLVlXE+FTOjw/i/ilE8MOQ7mXfQ1QXt/vzoux9Ovr1ZLuBOPYYui?= =?Windows-1252?Q?BQAG3CL+1Pn1dFTZg7XLl0uTYbyffrjIEknd8Xa0hueOih5BNVY0ZhSg?= =?Windows-1252?Q?F8ulR7cjvr0nR+gCnkCP73eBHP9s5jgQrwr10cgui/2/Q4nNLSK4eQMc?= =?Windows-1252?Q?/7G3FxNrMr6Zm8XPhukQQ7h/0Uq3jsrSwWRrykqBEtrf9H9vqdtFCJHM?= =?Windows-1252?Q?d4BTAOBybgMi29XPxk2XkJtc=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1848;6:wwE75fIDy/VMdhPHD36ntDkTuP4VWVNtDBzMv+P23NvaE+Bjl+OASUDBqZTIkjXCh9xmbTLu845F3VaWSvFjNpBsS7gvy0CAD5ShUppkrqbdLwYuqjw8wnn+o0ZUPprNitiWXJHKxf0C+VKSndnDVXj8s+l2H7OVwFz0DVdpIwuDMPcfvnVOpvrfd8mCbJLBsyvWf9k00GGGU62o+dYtpDJAGYfnls7to+tpjtX0XMysSflAfvn9yTdkq0U8S2xq4PcMMBs+cyl/pBBRxAyIqyqLydABnYBN6qe+IjPHkv/J2Jej99KKgF00uOGmM6oL3TZPn5fzxlpyJC7Fp6UoqYCYHbXxcqhT9SRnDwDDRmbkOp/2aqeOvZ/Fk0QiroQI3zsQTy9P3RZX7jS93P2sGvcvYDRS6uy6ig7pRnktlbI=;5:MBixTekjadB8hglbw+XEnLe2SuW+0AAMPAUjxxWJjjfwTQxFvM95QoE9cscUp2qpVe2GfINUN11EzQz5tgDZMH7cw5FkCKTZOeG/ZV5nDhM3PWuERgWy5buN981lovOkWmcJlGxfyiRjDNGx8QJiFw==;24:5tLgvd2zlThbRsdkNSxBD43+2T20SDLsVJFXhZrE30i+OLENEyFqO4VxhjtBuQ6OtiryAQtz9X3JNtCcQtri8tEV0r5uzib6EznLhlyW6QU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1848;7:/sgX7QoQCvgyZvRCtujDA1irHec5d6x8UroHNlTnprZ7t5istL6Cmc93o2HJUX9ilDAhZEV/2CBq06BP1Pnm1l+MkLI53f7oVUccsPnJDN0xBYWC4ewdg3R0+/p9PE1hgyaH0lp3wrvd3JFkZ2FTsL08G5IqHtLmKLMFHhUJMQugoC7GhFdcAP5hKUtM0A7PCio5H6mNrOWCfaz1VgLokP1+Y/DZB5X2X6ZfiB9347CFI73AmuhhfKOpDtZRx6oYiqbQIMd7btLEsh7ZeqHNOdgb4a+gpK4UsfdbbodidUWMqfbYCPikVMVL9XVkZjNgMBZcthJhA0LhaVvOzcI1Oi1LmSIwVX1+4UJAPX81yzKWQcv4VmzZNLsCHJ9TvhE0X1Bo1AH0g2HEvO6wbEjNi4iKblalYZ5pgt6dTaowFVOHb6xdpktqaqYfr2IL6Q+3NrpACZ7bY2s3n/gCxTZ9Yg==;20:PMkmCy/1RGLUnWa3qLiErupawT2GYH81vpOUiG4ZymmgX/bFf7gt3nNlxnpji936Kr1r01p3CJoKJJBMpeWlnVCMCnHcMv4dMh/4dNdDBBGHuKcazgj7F7yHAjwrZGHeaTgMhXpgBvi0ujiSJxO03U8XP66Ri1YjhxP7C7CeRf4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jan 2017 15:01:56.5150 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1848 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Will include it in patch-set with documentation fix. Thanks Oleg! Reviewed-by: Pavel Tikhomirov On 01/23/2017 02:57 PM, Oleg Nesterov wrote: > Add the new helper to walk the process tree, the next patch adds a user. > Note that it visits the group leaders only, proc_visitor can do > for_each_thread itself or we can trivially extend walk_process_tree() to > do this. > > Signed-off-by: Oleg Nesterov > --- > include/linux/sched.h | 3 +++ > kernel/fork.c | 32 ++++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/include/linux/sched.h b/include/linux/sched.h > index e9c009d..681f748 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -3015,6 +3015,9 @@ extern bool current_is_single_threaded(void); > #define for_each_process_thread(p, t) \ > for_each_process(p) for_each_thread(p, t) > > +typedef int (*proc_visitor)(struct task_struct *p, void *data); > +void walk_process_tree(struct task_struct *top, proc_visitor, void *); > + > static inline int get_nr_threads(struct task_struct *tsk) > { > return tsk->signal->nr_threads; > diff --git a/kernel/fork.c b/kernel/fork.c > index 663c6a7..2522bae 100644 > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -2042,6 +2042,38 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, > } > #endif > > +void walk_process_tree(struct task_struct *top, proc_visitor visitor, void *data) > +{ > + struct task_struct *leader, *parent, *child; > + int res; > + > + read_lock(&tasklist_lock); > + leader = top = top->group_leader; > +down: > + for_each_thread(leader, parent) { > + list_for_each_entry(child, &parent->children, sibling) { > + res = visitor(child, data); > + if (res) { > + if (res < 0) > + goto out; > + leader = child; > + goto down; > + } > +up: > + ; > + } > + } > + > + if (leader != top) { > + child = leader; > + parent = child->real_parent; > + leader = parent->group_leader; > + goto up; > + } > +out: > + read_unlock(&tasklist_lock); > +} > + > #ifndef ARCH_MIN_MMSTRUCT_ALIGN > #define ARCH_MIN_MMSTRUCT_ALIGN 0 > #endif > -- Best regards, Tikhomirov Pavel Software Developer, Virtuozzo.