From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleg Nesterov Subject: Re: [PATCH 4/4] oom: don't ignore rss in nascent mm Date: Thu, 16 Sep 2010 19:44:33 +0200 Message-ID: <20100916174433.GA4842@redhat.com> References: <20100916144930.3BAE.A69D9226@jp.fujitsu.com> <20100916145710.3BBA.A69D9226@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Linus Torvalds , Andrew Morton , linux-kernel@vger.kernel.org, oss-security@lists.openwall.com, Solar Designer , Kees Cook , Al Viro , Neil Horman , linux-fsdevel@vger.kernel.org, pageexec@freemail.hu, Brad Spengler , Eugene Teo , KAMEZAWA Hiroyuki , linux-mm , David Rientjes To: KOSAKI Motohiro Return-path: Content-Disposition: inline In-Reply-To: <20100916145710.3BBA.A69D9226@jp.fujitsu.com> Sender: owner-linux-mm@kvack.org List-Id: linux-fsdevel.vger.kernel.org On 09/16, KOSAKI Motohiro wrote: > > ChangeLog > o since v1 > - Always use thread group leader's ->in_exec_mm. Confused ;) > +static unsigned long oom_rss_swap_usage(struct task_struct *p) > +{ > + struct task_struct *t = p; > + struct task_struct *leader = p->group_leader; > + unsigned long points = 0; > + > + do { > + task_lock(t); > + if (t->mm) { > + points += get_mm_rss(t->mm); > + points += get_mm_counter(t->mm, MM_SWAPENTS); > + task_unlock(t); > + break; > + } > + task_unlock(t); > + } while_each_thread(p, t); > + > + /* > + * If the process is in execve() processing, we have to concern > + * about both old and new mm. > + */ > + task_lock(leader); > + if (leader->in_exec_mm) { > + points += get_mm_rss(leader->in_exec_mm); > + points += get_mm_counter(leader->in_exec_mm, MM_SWAPENTS); > + } > + task_unlock(leader); > + > + return points; > +} This patch relies on fact that we can't race with de_thread() (and btw the change in de_thread() looks bogus). Then why ->in_exec_mm lives in task_struct ? To me, this looks a bit strange. I think we should either do not use ->group_leader to hold ->in_exec_mm like your previous patch did, or move ->in_exec_mm into signal_struct. The previous 3/4 ensures that only one thread can set ->in_exec_mm. And I don't think oom_rss_swap_usage() should replace find_lock_task_mm() in oom_badness(), I mean something like this: static unsigned long oom_rss_swap_usage(struct mm_struct *mm) { return get_mm_rss(mm) + get_mm_counter(mm, MM_SWAPENTS); } unsigned int oom_badness(struct task_struct *p, ...) { int points = 0; if (unlikely(p->signal->in_exec_mm)) { task_lock(p->group_leader); if (p->signal->in_exec_mm) points = oom_rss_swap_usage(p->signal->in_exec_mm); task_unlock(p->group_leader); } p = find_lock_task_mm(p); if (!p) return points; ... } but this is the matter of taste. What do you think? Oleg. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org