All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] convert most filesystems to pin_user_pages_fast()
@ 2022-08-27  8:36 John Hubbard
  2022-08-27  8:36 ` [PATCH 1/6] mm/gup: introduce pin_user_page() John Hubbard
                   ` (5 more replies)
  0 siblings, 6 replies; 32+ messages in thread
From: John Hubbard @ 2022-08-27  8:36 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Jens Axboe, Alexander Viro, Miklos Szeredi, Christoph Hellwig,
	Darrick J . Wong, Trond Myklebust, Anna Schumaker, Jan Kara,
	Logan Gunthorpe, linux-block, linux-fsdevel, linux-xfs,
	linux-nfs, linux-mm, LKML, John Hubbard

Hi,

This converts the iomap core and bio_release_pages() to
pin_user_pages_fast(), also referred to as FOLL_PIN here.

The conversion is temporarily guarded by
CONFIG_BLK_USE_PIN_USER_PAGES_FOR_DIO. In the future (not part of this
series), when we are certain that all filesystems have converted their
Direct IO paths to FOLL_PIN, then we can do the final step, which is to
get rid of CONFIG_BLK_USE_PIN_USER_PAGES_FOR_DIO and search-and-replace
the dio_w_*() functions with their final names (see bvec.h changes).

I'd like to get this part committed at some point, because it seems to
work well already. And this will help get the remaining items, below,
converted.

Status: although many filesystems have been converted, some remain to be
investigated. These include (you can recreate this list by grepping for
iov_iter_get_pages):

	cephfs
	cifs
	9P
	RDS
	net/core: datagram.c, skmsg.c
	net/tls
	fs/splice.c

Testing: this passes some light LTP and xfstest runs and fio and a few
other things like that, on my local x86_64 test machine, both with and
without CONFIG_BLK_USE_PIN_USER_PAGES_FOR_DIO being set.

Conflicts: Logan, the iov_iter parts of this will conflict with your
[PATCH v9 2/8] iov_iter: introduce iov_iter_get_pages_[alloc_]flags(),
but I think it's easy to resolve.

John Hubbard (6):
  mm/gup: introduce pin_user_page()
  block: add dio_w_*() wrappers for pin, unpin user pages
  iov_iter: new iov_iter_pin_pages*() routines
  block, bio, fs: convert most filesystems to pin_user_pages_fast()
  NFS: direct-io: convert to FOLL_PIN pages
  fuse: convert direct IO paths to use FOLL_PIN

 block/Kconfig        | 24 ++++++++++++++
 block/bio.c          | 27 ++++++++--------
 block/blk-map.c      |  7 +++--
 fs/direct-io.c       | 40 ++++++++++++------------
 fs/fuse/dev.c        |  8 +++--
 fs/fuse/file.c       | 31 ++++++++++++-------
 fs/fuse/fuse_i.h     |  1 +
 fs/iomap/direct-io.c |  2 +-
 fs/nfs/direct.c      | 19 ++++--------
 include/linux/bvec.h | 40 ++++++++++++++++++++++++
 include/linux/mm.h   |  1 +
 include/linux/uio.h  |  4 +++
 lib/iov_iter.c       | 74 +++++++++++++++++++++++++++++++++++++++++---
 mm/gup.c             | 33 ++++++++++++++++++++
 14 files changed, 244 insertions(+), 67 deletions(-)


base-commit: e022620b5d056e822e42eb9bc0f24fcb97389d86
--
2.37.2


^ permalink raw reply	[flat|nested] 32+ messages in thread
* [PATCH 0/6] block, fs: convert most Direct IO cases to FOLL_PIN
@ 2022-02-27  9:34 jhubbard.send.patches
  2022-02-27  9:34 ` [PATCH 1/6] mm/gup: introduce pin_user_page() jhubbard.send.patches
  0 siblings, 1 reply; 32+ messages in thread
From: jhubbard.send.patches @ 2022-02-27  9:34 UTC (permalink / raw)
  To: Jens Axboe, Jan Kara, Christoph Hellwig, Dave Chinner,
	Darrick J . Wong, Theodore Ts'o, Alexander Viro,
	Miklos Szeredi, Andrew Morton, Chaitanya Kulkarni
  Cc: linux-block, linux-fsdevel, linux-xfs, linux-mm, LKML, John Hubbard

From: John Hubbard <jhubbard@nvidia.com>

Hi,

The feedback on the RFC [1] prompted me to convert the core Direct IO
subsystem all at once. The key differences here, as compared to the RFC,
are:

    * no dio_w_*() wrapper routines,

    * no CONFIG parameter; and

    * new iov_iter_pin_pages*() routines that pin pages without
      affecting other callers of iov_iter_get_pages*(). Those other
      callers (ceph, rds, net, ...) can be converted separately.

Also, many pre-existing callers of unpin_user_pages_dirty_lock() are
wrong, and this series adds a few more callers. So readers may naturally
wonder about that. I recently had a very productive discussion with Ted
Ts'o, who suggested a way to fix the problem, and I'm going to implement
it, next. However, I think it's best to do that fix separately from
this, probably layered on top, although it could go either before or
after.

As part of fixing the "get_user_pages() + file-backed memory" problem
[2], and to support various COW-related fixes as well [3], we need to
convert the Direct IO code from get_user_pages_fast(), to
pin_user_pages_fast(). Because pin_user_pages*() calls require a
corresponding call to unpin_user_page(), the conversion is more
elaborate than just substitution.

In the main patch (patch 4) I'm a little concerned about the
bio_map_user_iov() changes, because the sole caller,
blk_rq_map_user_iov(), has either a direct mapped case or a copy from
user case, and I'm still not sure that these are properly kept separate,
from an unpin pages point of view. So a close look there by reviewers
would be welcome.

Testing: this needs lots of filesystem testing.

In this patchset:

Patches 1, 2: provide a few new routines that will be used by
conversion: pin_user_page(), iov_iter_pin_pages(),
iov_iter_pin_pages_alloc().

Patch 3: provide a few asserts that only user space pages are being
passed in for Direct IO. (This patch could be folded into another
patch.)

Patch 4: Convert all Direct IO callers that use iomap, or
blockdev_direct_IO(), or bio_iov_iter_get_pages().

Patch 5, 6: convert a few other callers to the new system: NFS-Direct,
and fuse.

This is based on linux-next (next-20220225). I've also stashed it here:

    https://github.com/johnhubbard/linux bio_pup_next_20220225


[1] https://lore.kernel.org/r/20220225085025.3052894-1-jhubbard@nvidia.com

[2] https://lwn.net/Articles/753027/ "The trouble with get_user_pages()"

[3] https://lore.kernel.org/all/20211217113049.23850-1-david@redhat.com/T/#u
    (David Hildenbrand's mm/COW fixes)

John Hubbard (6):
  mm/gup: introduce pin_user_page()
  iov_iter: new iov_iter_pin_pages*(), for FOLL_PIN pages
  block, fs: assert that key paths use iovecs, and nothing else
  block, bio, fs: convert most filesystems to pin_user_pages_fast()
  NFS: direct-io: convert to FOLL_PIN pages
  fuse: convert direct IO paths to use FOLL_PIN

 block/bio.c          | 29 ++++++++--------
 block/blk-map.c      |  6 ++--
 fs/direct-io.c       | 28 ++++++++--------
 fs/fuse/dev.c        |  7 ++--
 fs/fuse/file.c       | 38 +++++----------------
 fs/iomap/direct-io.c |  2 +-
 fs/nfs/direct.c      | 15 +++------
 include/linux/mm.h   |  1 +
 include/linux/uio.h  |  4 +++
 lib/iov_iter.c       | 78 ++++++++++++++++++++++++++++++++++++++++++++
 mm/gup.c             | 34 +++++++++++++++++++
 11 files changed, 170 insertions(+), 72 deletions(-)


base-commit: 06aeb1495c39c86ccfaf1adadc1d2200179f16eb
-- 
2.35.1


^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2022-09-01  9:08 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-27  8:36 [PATCH 0/6] convert most filesystems to pin_user_pages_fast() John Hubbard
2022-08-27  8:36 ` [PATCH 1/6] mm/gup: introduce pin_user_page() John Hubbard
2022-08-29 12:07   ` David Hildenbrand
2022-08-29 19:33     ` John Hubbard
2022-08-30 12:17       ` David Hildenbrand
2022-08-30 21:42         ` John Hubbard
2022-08-31  0:06         ` John Hubbard
2022-08-27  8:36 ` [PATCH 2/6] block: add dio_w_*() wrappers for pin, unpin user pages John Hubbard
2022-08-27 22:27   ` Andrew Morton
2022-08-27 23:59     ` John Hubbard
2022-08-28  0:12       ` Andrew Morton
2022-08-28  0:31         ` John Hubbard
2022-08-28  1:07           ` John Hubbard
2022-08-27  8:36 ` [PATCH 3/6] iov_iter: new iov_iter_pin_pages*() routines John Hubbard
2022-08-27 22:46   ` Al Viro
2022-08-27 22:48     ` John Hubbard
2022-08-27  8:36 ` [PATCH 4/6] block, bio, fs: convert most filesystems to pin_user_pages_fast() John Hubbard
2022-08-27  8:36 ` [PATCH 5/6] NFS: direct-io: convert to FOLL_PIN pages John Hubbard
2022-08-27 22:48   ` Al Viro
2022-08-27 23:55     ` John Hubbard
2022-08-28  0:38       ` Al Viro
2022-08-28  0:39         ` Al Viro
2022-08-28  0:46           ` John Hubbard
2022-08-29  4:59           ` John Hubbard
2022-08-29 16:08             ` Jan Kara
2022-08-29 19:59               ` John Hubbard
2022-08-31  9:43                 ` Jan Kara
2022-08-31 18:02                   ` John Hubbard
2022-09-01  0:38                   ` Al Viro
2022-09-01  9:06                     ` Jan Kara
2022-08-27  8:36 ` [PATCH 6/6] fuse: convert direct IO paths to use FOLL_PIN John Hubbard
  -- strict thread matches above, loose matches on Subject: below --
2022-02-27  9:34 [PATCH 0/6] block, fs: convert most Direct IO cases to FOLL_PIN jhubbard.send.patches
2022-02-27  9:34 ` [PATCH 1/6] mm/gup: introduce pin_user_page() jhubbard.send.patches

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.