From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751631AbdCRNpS (ORCPT ); Sat, 18 Mar 2017 09:45:18 -0400 Received: from terminus.zytor.com ([65.50.211.136]:32830 "EHLO mail.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751007AbdCRNpQ (ORCPT ); Sat, 18 Mar 2017 09:45:16 -0400 Date: Sat, 18 Mar 2017 02:52:21 -0700 From: "tip-bot for Kirill A. Shutemov" Message-ID: Cc: hpa@zytor.com, catalin.marinas@arm.com, bp@alien8.de, dann.frazier@canonical.com, linux-kernel@vger.kernel.org, mingo@kernel.org, aneesh.kumar@linux.vnet.ibm.com, tglx@linutronix.de, steve.capper@linaro.org, torvalds@linux-foundation.org, akpm@linux-foundation.org, kirill.shutemov@linux.intel.com, peterz@infradead.org, riel@redhat.com, dave.hansen@intel.com Reply-To: mingo@kernel.org, linux-kernel@vger.kernel.org, dann.frazier@canonical.com, hpa@zytor.com, bp@alien8.de, catalin.marinas@arm.com, torvalds@linux-foundation.org, peterz@infradead.org, dave.hansen@intel.com, riel@redhat.com, kirill.shutemov@linux.intel.com, akpm@linux-foundation.org, tglx@linutronix.de, aneesh.kumar@linux.vnet.ibm.com, steve.capper@linaro.org In-Reply-To: <20170316152655.37789-7-kirill.shutemov@linux.intel.com> References: <20170316152655.37789-7-kirill.shutemov@linux.intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/mm] mm/gup: Provide callback to check if __GUP_fast() is allowed for the range Git-Commit-ID: 73e10a61817dfc97fe7418bfad1f608e562d7348 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 73e10a61817dfc97fe7418bfad1f608e562d7348 Gitweb: http://git.kernel.org/tip/73e10a61817dfc97fe7418bfad1f608e562d7348 Author: Kirill A. Shutemov AuthorDate: Thu, 16 Mar 2017 18:26:54 +0300 Committer: Ingo Molnar CommitDate: Sat, 18 Mar 2017 09:48:03 +0100 mm/gup: Provide callback to check if __GUP_fast() is allowed for the range This is a preparation patch for the transition of x86 to the generic GUP_fast() implementation. On x86, get_user_pages_fast() does a couple of sanity checks to see if we can call __get_user_pages_fast() for the range. This kind of wrapping protection should be useful for the generic code too. Signed-off-by: Kirill A. Shutemov Cc: Andrew Morton Cc: Aneesh Kumar K . V Cc: Borislav Petkov Cc: Catalin Marinas Cc: Dann Frazier Cc: Dave Hansen Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Rik van Riel Cc: Steve Capper Cc: Thomas Gleixner Cc: linux-arch@vger.kernel.org Cc: linux-mm@kvack.org Link: http://lkml.kernel.org/r/20170316152655.37789-7-kirill.shutemov@linux.intel.com [ Small readability edits. ] Signed-off-by: Ingo Molnar --- mm/gup.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index e3d1e80..527ec2c 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1614,6 +1614,21 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, return nr; } +#ifndef gup_fast_permitted +/* + * Check if it's allowed to use __get_user_pages_fast() for the range, or + * we need to fall back to the slow version: + */ +bool gup_fast_permitted(unsigned long start, int nr_pages, int write) +{ + unsigned long len, end; + + len = (unsigned long) nr_pages << PAGE_SHIFT; + end = start + len; + return end >= start; +} +#endif + /** * get_user_pages_fast() - pin user pages in memory * @start: starting user address @@ -1633,11 +1648,14 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, int get_user_pages_fast(unsigned long start, int nr_pages, int write, struct page **pages) { - int nr, ret; + int nr = 0, ret = 0; start &= PAGE_MASK; - nr = __get_user_pages_fast(start, nr_pages, write, pages); - ret = nr; + + if (gup_fast_permitted(start, nr_pages, write)) { + nr = __get_user_pages_fast(start, nr_pages, write, pages); + ret = nr; + } if (nr < nr_pages) { /* Try to get the remaining pages with get_user_pages */