Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp1118274ybf; Fri, 28 Feb 2020 14:35:36 -0800 (PST) X-Google-Smtp-Source: APXvYqx/pI4SWUj9Tp2inwHal0Ir5zjCbn0Fp0QIcs0xfFkkGjb/hqxiNnXHUhB89stdT5VOnxZz X-Received: by 2002:aca:ebc5:: with SMTP id j188mr4297023oih.65.1582929336285; Fri, 28 Feb 2020 14:35:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582929336; cv=none; d=google.com; s=arc-20160816; b=L1oYhR/RrDASaUzKZBNuOjxcO/xKRuClgcZX+b/nsBIKwi61gz7gkm6qu7Cp5vDq/D 9d7YYa+ch1/92qrLLmDG0Rz+mIdAASMl2B9pNwoEr6eBoK1OYNSlXoy3ppapfZEPZJtX +2zhX/id6ArmKQ2oo+DWbj+JaPIcV0BmtAYoYNUEJ61UW4EOf1up0/QNA9+LGhnDjGh5 T3eqWPtIQK4CWJLLTOCacrdH+pH1X4iACfgRTrVQbv9Gn+8Bhu6TeCy9Y+S4e/Zqp4fE D2RywyzRjqdlptoInrBhDL6G54pW/lfEJAJ3E2THb0KwYUPslbTgro55Gk2h7568UmFn lAJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=3G3biFetx8gQYQuCZP0ZL86yeaaFIqqdbTSArhUQ/BU=; b=ponoPrLvp5ZVAWOCYfbl6bwBg0KbqAVh+RLsBWLWVq8E3icamaK2w3k7WhGcLyZyn4 irJ8I43WShEeo7XFoZO+AdXROdFV/i22a+u2X4qcz6fRuDrkoZS4WHeBhS/tq/jj3SOd vErBkPp92vlz/fPkUJBvJyr5eW7S8vGFh7ZKBpPyschYJa9VM9d50g2P5DC3UOvVjEdR hOP6PLqrcQIzPLK9hTn7SApn8eQDy8uCjweFte2psOEpNQseJ3yzPAU5AI16opmywW1y ec+N6f7QZLHbRfvR5GzZ2pdYHmp5sd+icewLqtTRshWO71Bo+wq3/e1myUlxanbOPa1y XrAw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t9si2107556otp.57.2020.02.28.14.35.24; Fri, 28 Feb 2020 14:35:36 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726603AbgB1Wet (ORCPT + 99 others); Fri, 28 Feb 2020 17:34:49 -0500 Received: from mga07.intel.com ([134.134.136.100]:45088 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725957AbgB1Wet (ORCPT ); Fri, 28 Feb 2020 17:34:49 -0500 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Feb 2020 14:34:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,497,1574150400"; d="scan'208";a="257263297" Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 28 Feb 2020 14:34:47 -0800 Date: Fri, 28 Feb 2020 14:34:47 -0800 From: Ira Weiny To: Pingfan Liu Cc: linux-mm@kvack.org, Andrew Morton , Mike Rapoport , Dan Williams , Matthew Wilcox , John Hubbard , "Aneesh Kumar K.V" , Keith Busch , Christoph Hellwig , Shuah Khan , linux-kernel@vger.kernel.org Subject: Re: [PATCHv5 2/3] mm/gup: fix omission of check on FOLL_LONGTERM in gup fast path Message-ID: <20200228223446.GA4658@iweiny-DESK2.sc.intel.com> References: <1582889550-9101-1-git-send-email-kernelfans@gmail.com> <1582889550-9101-3-git-send-email-kernelfans@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1582889550-9101-3-git-send-email-kernelfans@gmail.com> User-Agent: Mutt/1.11.1 (2018-12-01) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Feb 28, 2020 at 07:32:29PM +0800, Pingfan Liu wrote: > FOLL_LONGTERM suggests a pin which is going to be given to hardware and > can't move. It would truncate CMA permanently and should be excluded. I don't understand what is 'truncated' here? I generally agree with Jason that this is going to be confusing to the user. Ira > > FOLL_LONGTERM has already been checked in the slow path, but not checked in > the fast path, which means a possible leak of CMA page to longterm pinned > requirement through this crack. > > Place a check in try_get_compound_head() in the fast path. > > Some note about the check: > Huge page's subpages have the same migrate type due to either > allocation from a free_list[] or alloc_contig_range() with param > MIGRATE_MOVABLE. So it is enough to check on a single subpage > by is_migrate_cma_page(subpage) > > Signed-off-by: Pingfan Liu > Cc: Ira Weiny > Cc: Andrew Morton > Cc: Mike Rapoport > Cc: Dan Williams > Cc: Matthew Wilcox > Cc: John Hubbard > Cc: "Aneesh Kumar K.V" > Cc: Keith Busch > Cc: Christoph Hellwig > Cc: Shuah Khan > To: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > --- > mm/gup.c | 26 +++++++++++++++++++------- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/mm/gup.c b/mm/gup.c > index cd8075e..f0d6804 100644 > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -33,9 +33,21 @@ struct follow_page_context { > * Return the compound head page with ref appropriately incremented, > * or NULL if that failed. > */ > -static inline struct page *try_get_compound_head(struct page *page, int refs) > +static inline struct page *try_get_compound_head(struct page *page, int refs, > + unsigned int flags) > { > - struct page *head = compound_head(page); > + struct page *head; > + > + /* > + * Huge page's subpages have the same migrate type due to either > + * allocation from a free_list[] or alloc_contig_range() with param > + * MIGRATE_MOVABLE. So it is enough to check on a single subpage. > + */ > + if (unlikely(flags & FOLL_LONGTERM) && > + is_migrate_cma_page(page)) > + return NULL; > + > + head = compound_head(page); > > if (WARN_ON_ONCE(page_ref_count(head) < 0)) > return NULL; > @@ -1908,7 +1920,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, > VM_BUG_ON(!pfn_valid(pte_pfn(pte))); > page = pte_page(pte); > > - head = try_get_compound_head(page, 1); > + head = try_get_compound_head(page, 1, flags); > if (!head) > goto pte_unmap; > > @@ -2083,7 +2095,7 @@ static int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr, > page = head + ((addr & (sz-1)) >> PAGE_SHIFT); > refs = record_subpages(page, addr, end, pages + *nr); > > - head = try_get_compound_head(head, refs); > + head = try_get_compound_head(head, refs, flags); > if (!head) > return 0; > > @@ -2142,7 +2154,7 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, > page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); > refs = record_subpages(page, addr, end, pages + *nr); > > - head = try_get_compound_head(pmd_page(orig), refs); > + head = try_get_compound_head(pmd_page(orig), refs, flags); > if (!head) > return 0; > > @@ -2174,7 +2186,7 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, > page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); > refs = record_subpages(page, addr, end, pages + *nr); > > - head = try_get_compound_head(pud_page(orig), refs); > + head = try_get_compound_head(pud_page(orig), refs, flags); > if (!head) > return 0; > > @@ -2203,7 +2215,7 @@ static int gup_huge_pgd(pgd_t orig, pgd_t *pgdp, unsigned long addr, > page = pgd_page(orig) + ((addr & ~PGDIR_MASK) >> PAGE_SHIFT); > refs = record_subpages(page, addr, end, pages + *nr); > > - head = try_get_compound_head(pgd_page(orig), refs); > + head = try_get_compound_head(pgd_page(orig), refs, flags); > if (!head) > return 0; > > -- > 2.7.5 > >