From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932314Ab0DBLRB (ORCPT ); Fri, 2 Apr 2010 07:17:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19368 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758805Ab0DBLQy (ORCPT ); Fri, 2 Apr 2010 07:16:54 -0400 Date: Fri, 2 Apr 2010 13:14:06 +0200 From: Oleg Nesterov To: David Rientjes Cc: Andrew Morton , anfei , KOSAKI Motohiro , nishimura@mxp.nes.nec.co.jp, KAMEZAWA Hiroyuki , Mel Gorman , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [patch] oom: give current access to memory reserves if it has been killed Message-ID: <20100402111406.GA4432@redhat.com> References: <20100329112111.GA16971@redhat.com> <20100330154659.GA12416@redhat.com> <20100331175836.GA11635@redhat.com> <20100331204718.GD11635@redhat.com> <20100401135927.GA12460@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/01, David Rientjes wrote: > > On Thu, 1 Apr 2010, Oleg Nesterov wrote: > > > > You can't do this for the reason I cited in another email, oom_badness() > > > returning 0 does not exclude a task from being chosen by > > > selcet_bad_process(), it will use that task if nothing else has been found > > > yet. We must explicitly filter it from consideration by checking for > > > !p->mm. > > > > Yes, you are right. OK, oom_badness() can never return points < 0, > > we can make it int and oom_badness() can return -1 if !mm. IOW, > > > > - unsigned int points; > > + int points; > > ... > > > > points = oom_badness(...); > > if (points >= 0 && (points > *ppoints || !chosen)) > > chosen = p; > > > > oom_badness() and its predecessor badness() in mainline never return > negative scores, so I don't see the value in doing this; just filter the > task in select_bad_process() with !p->mm as it has always been done. David, you continue to ignore my arguments ;) select_bad_process() must not filter out the tasks with ->mm == NULL. Once again: void *memory_hog_thread(void *arg) { for (;;) malloc(A_LOT); } int main(void) { pthread_create(memory_hog_thread, ...); syscall(__NR_exit, 0); } Now, even if we fix PF_EXITING check, select_bad_process() will always ignore this process. The group leader has ->mm == NULL. See? That is why I think we need something like find_lock_task_mm() in the pseudo-patch I sent. Or I missed something? Oleg.