Path: csiph.com!news.freedyn.net!aioe.org!bofh.it!news.nic.it!robomod From: "Kirill A. Shutemov" Newsgroups: linux.kernel Subject: Re: [PATCH 1/4] mm: mlock: check against vma for actual mlock() size Date: Tue, 30 Aug 2016 13:40:01 +0200 Message-ID: References: X-Original-To: wei.guo.simon@gmail.com Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov-name.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=PjSv24qTIorzhxC9JmU4Tz0HfOKTHGNMQnZPwnYevqA=; b=tfl62MURJqXfWmlaXiot0WAMO/P0jsnbDydCuKOYrwViIflGjVHcGVbkaRkDUfHzw4 klQafP0robWX4nXrSR2Pp8FlDt4kpQfimBtObNA6w+qepjGOVjdjoJ/9iGwqLVJpzW1a zEVQsXRD5tZReGnH4zgAkt2n62P5PmZEe8d8D3kF3mBa0G0yOWC/zJWu5iXWQKVbZRhO z70bRMnkmzzCmAHd9D3TT+SEaP1T/vb2Tdv2F41gzsI3wJYj7qALEOtBbgvc7jdnzQb1 U1u2uBocjN8oO/aqfMbDiSG9LI9RQhX9Ra4ewF3D91fY5ZHx3Vaq6ZUvtsECrwLl7JlY REUQ== X-Google-Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=PjSv24qTIorzhxC9JmU4Tz0HfOKTHGNMQnZPwnYevqA=; b=MaOJ+OHR3Ux5JoesiQMLg2tjXhuQFhbsEdM5rJE9suX9v6zUUs5730snobPCvt1Bi9 r/k2cDHVFs//CEqnHNDVHbIEloOoY7aYrTm7SHXYK6IijH50E9wRlxgVWKHKdKN7CWAM 5lnla8cp84LWJ1Op9gAiqfkmT68FkGKKkF0AcyALC4uH2WxlY0h8kvr7UENTmruqbevq i7TW1QfKWgVR5L241lE/8TnZhOaFeD1lusrbXfDvkJR5zvu5thVThcfrSj146KGaQDW7 sWY8av8Cy0ezHJc4SiIOzBS1HdkD0saIE0ZoYSuB69V4FALkcL9IOcqNpsu7ptjuHH7g ftOg== X-Gm-Message-State: AE9vXwNufguoAedIM7AgLwDDaldEacUx96qG2L2ng4bKybUGJeJBbTaI1DoZ7DFwRWFKcw== X-Received: by 10.25.16.162 with SMTP id 34mr1001820lfq.127.1472556916101; Tue, 30 Aug 2016 04:35:16 -0700 (PDT) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23.1 (2014-03-12) Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 112 Organization: linux.* mail to news gateway X-Original-Cc: linux-mm@kvack.org, Alexey Klimov , Andrew Morton , Eric B Munson , Geert Uytterhoeven , "Kirill A. Shutemov" , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Mel Gorman , Michal Hocko , Shuah Khan , Thierry Reding , Vlastimil Babka X-Original-Date: Tue, 30 Aug 2016 14:35:13 +0300 X-Original-Message-ID: <20160830113513.GA32187@node.shutemov.name> X-Original-References: <1472554781-9835-1-git-send-email-wei.guo.simon@gmail.com> <1472554781-9835-2-git-send-email-wei.guo.simon@gmail.com> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1472426 On Tue, Aug 30, 2016 at 06:59:38PM +0800, wei.guo.simon@gmail.com wrote: > From: Simon Guo > > In do_mlock(), the check against locked memory limitation > has a hole which will fail following cases at step 3): > 1) User has a memory chunk from addressA with 50k, and user > mem lock rlimit is 64k. > 2) mlock(addressA, 30k) > 3) mlock(addressA, 40k) > > The 3rd step should have been allowed since the 40k request > is intersected with the previous 30k at step 2), and the > 3rd step is actually for mlock on the extra 10k memory. > > This patch checks vma to caculate the actual "new" mlock > size, if necessary, and ajust the logic to fix this issue. > > Signed-off-by: Simon Guo Looks reasonable to me. Few nitpicks below. > --- > mm/mlock.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/mm/mlock.c b/mm/mlock.c > index 14645be..9283187 100644 > --- a/mm/mlock.c > +++ b/mm/mlock.c > @@ -617,6 +617,43 @@ static int apply_vma_lock_flags(unsigned long start, size_t len, > return error; > } > > +/* > + * Go through vma areas and sum size of mlocked > + * vma pages, as return value. > + * Note deferred memory locking case(mlock2(,,MLOCK_ONFAULT) > + * is also counted. > + * Return value: previously mlocked page counts > + */ > +static int count_mm_mlocked_page_nr(struct mm_struct *mm, > + unsigned long start, size_t len) > +{ > + struct vm_area_struct *vma; > + int count = 0; > + > + if (mm == NULL) > + mm = current->mm; > + > + vma = find_vma(mm, start); > + if (vma == NULL) > + vma = mm->mmap; > + > + for (; vma ; vma = vma->vm_next) { > + if (start + len <= vma->vm_start) > + break; for (; vma && start + len <= vma->vm_start; vma = vma->vm_next) { > + if (vma->vm_flags && VM_LOCKED) { > + if (start > vma->vm_start) > + count -= (start - vma->vm_start); > + if (start + len < vma->vm_end) { > + count += start + len - vma->vm_start; > + break; > + } > + count += vma->vm_end - vma->vm_start; > + } > + } > + > + return (PAGE_ALIGN(count) >> PAGE_SHIFT); Redundant parenthesis. And do we need PAGE_ALIGN() here? Caller already aligned 'len', and vma boundaries are alinged. > +} > + > static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t flags) > { > unsigned long locked; > @@ -639,6 +676,18 @@ static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t fla > return -EINTR; > > locked += current->mm->locked_vm; > + if ((locked > lock_limit) && (!capable(CAP_IPC_LOCK))) { > + /* > + * It is possible that the regions requested > + * intersect with previously mlocked areas, > + * that part area in "mm->locked_vm" should > + * not be counted to new mlock increment > + * count. So check and adjust locked count > + * if necessary. > + */ > + locked -= count_mm_mlocked_page_nr(current->mm, > + start, len); > + } > > /* check against resource limits */ > if ((locked <= lock_limit) || capable(CAP_IPC_LOCK)) > -- > 1.8.3.1 > > -- > 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 -- Kirill A. Shutemov