From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751484AbbE0Jd6 (ORCPT ); Wed, 27 May 2015 05:33:58 -0400 Received: from forward3o.mail.yandex.net ([37.140.190.32]:55313 "EHLO forward3o.mail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750755AbbE0Jdz (ORCPT ); Wed, 27 May 2015 05:33:55 -0400 From: Kirill Tkhai To: Oleg Nesterov , Kirill Tkhai Cc: "linux-kernel@vger.kernel.org" , Andrew Morton , Ingo Molnar , Peter Zijlstra , Michal Hocko , Rik van Riel , Ionut Alexa , Peter Hurley In-Reply-To: <20150526194613.GC6978@redhat.com> References: <20150525162722.5171.15901.stgit@pro> <1432575941.6866.42.camel@odin.com> <20150526194613.GC6978@redhat.com> Subject: Re: [PATCH RFC 09/13] exit: Use for_each_thread() in do_wait() MIME-Version: 1.0 Message-Id: <734911432719229@web2o.yandex.ru> X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Wed, 27 May 2015 12:33:49 +0300 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=koi8-r Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 26.05.2015, 22:47, "Oleg Nesterov" : > On 05/25, Kirill Tkhai wrote: >> šRefactoring, no functionality change. > > Hmm. unless I missed something this change is wrong. > >> š--- a/kernel/exit.c >> š+++ b/kernel/exit.c >> š@@ -1538,8 +1538,7 @@ static long do_wait(struct wait_opts *wo) >> >> ššššššššššset_current_state(TASK_INTERRUPTIBLE); >> ššššššššššread_lock(&tasklist_lock); >> š- tsk = current; >> š- do { >> š+ for_each_thread(current, tsk) { >> ššššššššššššššššššretval = do_wait_thread(wo, tsk); >> ššššššššššššššššššif (retval) >> ššššššššššššššššššššššššššgoto end; >> š@@ -1550,7 +1549,7 @@ static long do_wait(struct wait_opts *wo) >> >> ššššššššššššššššššif (wo->wo_flags & __WNOTHREAD) >> ššššššššššššššššššššššššššbreak; >> š- } while_each_thread(current, tsk); >> š+ } > > Please note the __WNOTHREAD check. This is the rare case when we > actually want while_each_thread() (although it should die anyway). > > for_each_thread() always starts from ->group_leader, but we need > to start from "current" first. Sure, this must be like below. Thanks! I won't resend the whole series with only this one patch changed to do not bomb mail boxes. Waiting for the review. diff --git a/kernel/exit.c b/kernel/exit.c index a268093..e4963d3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -1538,8 +1538,10 @@ static long do_wait(struct wait_opts *wo) set_current_state(TASK_INTERRUPTIBLE); read_lock(&tasklist_lock); - tsk = current; - do { + for_each_thread(current, tsk) { + if (wo->wo_flags & __WNOTHREAD) + tsk = current; + retval = do_wait_thread(wo, tsk); if (retval) goto end; @@ -1550,7 +1552,7 @@ static long do_wait(struct wait_opts *wo) if (wo->wo_flags & __WNOTHREAD) break; - } while_each_thread(current, tsk); + } read_unlock(&tasklist_lock); notask: