From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751426AbbCIEbJ (ORCPT ); Mon, 9 Mar 2015 00:31:09 -0400 Received: from mta-out1.inet.fi ([62.71.2.203]:56211 "EHLO jenni2.inet.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750927AbbCIEbF (ORCPT ); Mon, 9 Mar 2015 00:31:05 -0400 Date: Mon, 9 Mar 2015 06:30:51 +0200 From: "Kirill A. Shutemov" To: David Rientjes Cc: Andrew Morton , "Kirill A. Shutemov" , linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [patch] mm, hugetlb: abort __get_user_pages if current has been oom killed Message-ID: <20150309043051.GA13380@node.dhcp.inet.fi> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23.1 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Mar 08, 2015 at 04:12:12PM -0700, David Rientjes wrote: > If __get_user_pages() is faulting a significant number of hugetlb pages, > usually as the result of mmap(MAP_LOCKED), it can potentially allocate a > very large amount of memory. > > If the process has been oom killed, this will cause a lot of memory to > be overcharged to its memcg since it has access to memory reserves or > could potentially deplete all system memory reserves. > > In the same way that commit 4779280d1ea4 ("mm: make get_user_pages() > interruptible") aborted for pending SIGKILLs when faulting non-hugetlb > memory, based on the premise of commit 462e00cc7151 ("oom: stop > allocating user memory if TIF_MEMDIE is set"), hugetlb page faults now > terminate when the process has been oom killed. > > Cc: "Kirill A. Shutemov" > Signed-off-by: David Rientjes > --- > mm/gup.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/mm/gup.c b/mm/gup.c > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -457,6 +457,8 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, > if (!vma || check_vma_flags(vma, gup_flags)) > return i ? : -EFAULT; > if (is_vm_hugetlb_page(vma)) { > + if (unlikely(fatal_signal_pending(current))) > + return i ? : -ERESTARTSYS; > i = follow_hugetlb_page(mm, vma, pages, vmas, > &start, &nr_pages, i, > gup_flags); Shouldn't the check be inside loop in follow_hugetlb_page()? IIUC, it wouldn't help much if nr_pages and hugetlb vma are big enough. -- Kirill A. Shutemov