Linux-Next Archive on lore.kernel.org
 help / color / Atom feed
From: Stephen Rothwell <sfr@canb.auug.org.au>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Linux Next Mailing List <linux-next@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	John Hubbard <jhubbard@nvidia.com>
Subject: linux-next: manual merge of the akpm-current tree with Linus' tree
Date: Wed, 3 Jun 2020 18:07:31 +1000
Message-ID: <20200603180731.7df1082f@canb.auug.org.au> (raw)


[-- Attachment #1: Type: text/plain, Size: 4239 bytes --]

Hi all,

Today's linux-next merge of the akpm-current tree got a conflict in:

  mm/gup.c

between commit:

  17839856fd58 ("gup: document and work around "COW can break either way" issue")

from Linus' tree and (at least) commits:

  d7f76db8e4ad ("mm/gup: move __get_user_pages_fast() down a few lines in gup.c")
  6a5f74c81019 ("mm/gup: refactor and de-duplicate gup_fast() code")

from the akpm-current tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc mm/gup.c
index 3edf740a3897,fb28e7aecd35..000000000000
--- a/mm/gup.c
+++ b/mm/gup.c
@@@ -2814,17 -2743,21 +2758,33 @@@ static int internal_get_user_pages_fast
  		return -EFAULT;
  
  	/*
+ 	 * Disable interrupts. The nested form is used, in order to allow full,
+ 	 * general purpose use of this routine.
+ 	 *
+ 	 * With interrupts disabled, we block page table pages from being
+ 	 * freed from under us. See struct mmu_table_batch comments in
+ 	 * include/asm-generic/tlb.h for more details.
+ 	 *
+ 	 * We do not adopt an rcu_read_lock(.) here as we also want to
+ 	 * block IPIs that come from THPs splitting.
++	 *
++	 * NOTE! We allow read-only gup_fast() here, but you'd better be
++	 * careful about possible COW pages. You'll get _a_ COW page, but
++	 * not necessarily the one you intended to get depending on what
++	 * COW event happens after this. COW may break the page copy in a
++	 * random direction.
++	 *
 +	 * The FAST_GUP case requires FOLL_WRITE even for pure reads,
 +	 * because get_user_pages() may need to cause an early COW in
 +	 * order to avoid confusing the normal COW routines. So only
 +	 * targets that are already writable are safe to do by just
 +	 * looking at the page tables.
  	 */
  	if (IS_ENABLED(CONFIG_HAVE_FAST_GUP) &&
  	    gup_fast_permitted(start, end)) {
- 		local_irq_disable();
+ 		local_irq_save(flags);
 -		gup_pgd_range(addr, end, gup_flags, pages, &nr_pinned);
 +		gup_pgd_range(addr, end, gup_flags | FOLL_WRITE, pages, &nr_pinned);
- 		local_irq_enable();
+ 		local_irq_restore(flags);
  		ret = nr_pinned;
  	}
  
@@@ -2848,6 -2781,46 +2808,50 @@@
  	return ret;
  }
  
+ /*
+  * Like get_user_pages_fast() except it's IRQ-safe in that it won't fall back to
+  * the regular GUP.
+  * Note a difference with get_user_pages_fast: this always returns the
+  * number of pages pinned, 0 if no pages were pinned.
+  *
+  * If the architecture does not support this function, simply return with no
+  * pages pinned.
++ *
++ * Careful, careful! COW breaking can go either way, so a non-write
++ * access can get ambiguous page results. If you call this function without
++ * 'write' set, you'd better be sure that you're ok with that ambiguity.
+  */
+ int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
+ 			  struct page **pages)
+ {
+ 	int nr_pinned;
+ 	/*
+ 	 * Internally (within mm/gup.c), gup fast variants must set FOLL_GET,
+ 	 * because gup fast is always a "pin with a +1 page refcount" request.
+ 	 *
+ 	 * FOLL_FAST_ONLY is required in order to match the API description of
+ 	 * this routine: no fall back to regular ("slow") GUP.
+ 	 */
+ 	unsigned int gup_flags = FOLL_GET | FOLL_FAST_ONLY;
+ 
+ 	if (write)
+ 		gup_flags |= FOLL_WRITE;
+ 
+ 	nr_pinned = internal_get_user_pages_fast(start, nr_pages, gup_flags,
+ 						 pages);
+ 	/*
+ 	 * As specified in the API description above, this routine is not
+ 	 * allowed to return negative values. However, the common core
+ 	 * routine internal_get_user_pages_fast() *can* return -errno.
+ 	 * Therefore, correct for that here:
+ 	 */
+ 	if (nr_pinned < 0)
+ 		nr_pinned = 0;
+ 
+ 	return nr_pinned;
+ }
+ EXPORT_SYMBOL_GPL(__get_user_pages_fast);
+ 
  /**
   * get_user_pages_fast() - pin user pages in memory
   * @start:      starting user address

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

             reply index

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-03  8:07 Stephen Rothwell [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-04-06 11:29 Stephen Rothwell
2021-02-08 12:10 Stephen Rothwell
2020-09-08  9:24 Stephen Rothwell
2020-09-08  9:17 Stephen Rothwell
2020-06-03  7:53 Stephen Rothwell
2019-02-18  6:51 Stephen Rothwell
2019-02-20  1:00 ` Stephen Rothwell
2019-01-11  2:51 Stephen Rothwell
2019-01-11 15:08 ` Jerome Glisse
2019-01-07  2:16 Stephen Rothwell
2018-08-15  8:05 Stephen Rothwell
2018-07-23  8:00 Stephen Rothwell
2018-06-14  1:43 Stephen Rothwell
2018-06-14  1:36 Stephen Rothwell
2018-03-16  5:56 Stephen Rothwell
2017-11-02  8:10 Stephen Rothwell
2017-11-02  7:37 Stephen Rothwell
2017-05-08  3:48 Stephen Rothwell
2017-04-24  7:25 Stephen Rothwell
2017-04-24  9:11 ` Mel Gorman
2016-12-05  5:38 Stephen Rothwell
2016-12-05  5:56 ` Michal Hocko
2016-12-05  6:08   ` Stephen Rothwell
2016-01-18  3:22 Stephen Rothwell
2015-12-18  5:09 Stephen Rothwell
2015-10-06  5:46 Stephen Rothwell
2015-07-20  3:54 Stephen Rothwell
2015-05-19  6:40 Stephen Rothwell
2014-08-08  5:46 Stephen Rothwell
2014-08-07  6:51 Stephen Rothwell
2014-05-29  9:08 Stephen Rothwell
2014-04-29  4:47 Stephen Rothwell
2014-04-24  5:38 Stephen Rothwell
2014-04-07  4:18 Stephen Rothwell
2014-01-29  3:46 Stephen Rothwell
2013-12-23  3:58 Stephen Rothwell
2013-12-03  1:52 Stephen Rothwell
2013-12-03  7:16 ` Richard Weinberger
2013-12-03  7:31   ` Andrew Morton
2013-12-03  7:36     ` Richard Weinberger
2013-02-02 12:55 Stephen Rothwell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200603180731.7df1082f@canb.auug.org.au \
    --to=sfr@canb.auug.org.au \
    --cc=akpm@linux-foundation.org \
    --cc=jhubbard@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Linux-Next Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-next/0 linux-next/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-next linux-next/ https://lore.kernel.org/linux-next \
		linux-next@vger.kernel.org
	public-inbox-index linux-next

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-next


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git