mbox series

[v2,00/25] netfs: Read/write improvements

Message ID 20240814203850.2240469-1-dhowells@redhat.com
Headers show
Series netfs: Read/write improvements | expand

Message

David Howells Aug. 14, 2024, 8:38 p.m. UTC
Hi Christian, Steve, Willy,

This set of patches includes a couple of fixes:

 (1) Revert the removal of waits on PG_private_2 from netfs_release_page()
     and netfs_invalidate_page().

 (2) Make cachefiles take the sb_writers lock around set/removexattr.

A couple of adjustments to the /proc/fs/netfs/stats file:

 (3) All the netfs stats lines begin 'Netfs:'.  Change this to something a
     bit more useful.

 (4) Add a couple of stats counters to track the numbers of skips and waits
     on the per-inode writeback serialisation lock to make it easier to
     check for this as a source of performance loss.

Some miscellaneous bits:

 (5) Reduce the number of conditional branches in netfs_perform_write().

 (6) Move the CIFS_INO_MODIFIED_ATTR flag to the netfs_inode struct and
     remove cifs_post_modify().

 (7) Move the max_len/max_nr_segs members from netfs_io_subrequest to
     netfs_io_request as they're only needed for one subreq at a time.

 (8) Add an 'unknown' source value for tracing purposes.

 (9) Remove NETFS_COPY_TO_CACHE as it's no longer used.

(10) Set the request work function up front at allocation time.

(11) Use bh-disabling spinlocks for rreq->lock as cachefiles completion may
     be run from block-filesystem DIO completion in softirq context.

Then there's the main performance enhancing changes:

(12) Define a structure, struct folio_queue, and a new iterator type,
     ITER_FOLIOQ, to hold a buffer as a replacement for ITER_XARRAY.  See
     that patch for questions about naming and form.

(13) Provide a copy_folio_from_iter() wrapper.

(14) Make cifs RDMA support ITER_FOLIOQ.

(15) Use folio queues in the write-side helpers instead of xarrays.

(16) Add a function to reset the iterator in a subrequest.

(17) Simplify the write-side helpers to use sheaves to skip gaps rather than
     trying to work out where gaps are.

(18) In afs, make the read subrequests asynchronous, putting them into work
     items to allow the next patch to do progressive unlocking/reading.

(19) Overhaul the read-side helpers to improve performance.

(20) Remove fs/netfs/io.c.

(21) Fix the caching of a partial block at the end of a file.

(22) Allow a store to be cancelled.

Then some changes for cifs to make it use folio queues instead of xarrays
for crypto bufferage:

(23) Use raw iteration functions rather than manually coding iteration when
     hashing data.

(24) Switch to using folio_queue for crypto buffers.

(25) Remove the xarray bits.

Changes
=======
ver #2)
 - Rebase to the merge of vfs.fixes after v6.11-rc3.
 - Add fixes for missing waits on PG_private_2.
 - Make the read-side helper overhaul support PG_private_2-based
   filesystems also.
 - When reading, only limit server downloads to the max download size, not
   cache reads or simple zeroing.
 - Add some missing cases of skipping forward when iterating over a folio
   queue list when the place we're at has the current slot number parked
   just past the last slot (typically, because we're extending the list
   incrementally).
 - Don't use folio_batch_release() to release the refs on pages in the
   folio_queue struct mid-read as we rely on the count in the batch later.
 - Fix the determination of whether an operation can access the cache.

David

David Howells (25):
  netfs, ceph: Partially revert "netfs: Replace PG_fscache by setting
    folio->private and marking dirty"
  cachefiles: Fix non-taking of sb_writers around set/removexattr
  netfs: Adjust labels in /proc/fs/netfs/stats
  netfs: Record contention stats for writeback lock
  netfs: Reduce number of conditional branches in netfs_perform_write()
  netfs, cifs: Move CIFS_INO_MODIFIED_ATTR to netfs_inode
  netfs: Move max_len/max_nr_segs from netfs_io_subrequest to
    netfs_io_stream
  netfs: Reserve netfs_sreq_source 0 as unset/unknown
  netfs: Remove NETFS_COPY_TO_CACHE
  netfs: Set the request work function upon allocation
  netfs: Use bh-disabling spinlocks for rreq->lock
  mm: Define struct folio_queue and ITER_FOLIOQ to handle a sequence of
    folios
  iov_iter: Provide copy_folio_from_iter()
  cifs: Provide the capability to extract from ITER_FOLIOQ to RDMA SGEs
  netfs: Use new folio_queue data type and iterator instead of xarray
    iter
  netfs: Provide an iterator-reset function
  netfs: Simplify the writeback code
  afs: Make read subreqs async
  netfs: Speed up buffered reading
  netfs: Remove fs/netfs/io.c
  cachefiles, netfs: Fix write to partial block at EOF
  netfs: Cancel dirty folios that have no storage destination
  cifs: Use iterate_and_advance*() routines directly for hashing
  cifs: Switch crypto buffer to use a folio_queue rather than an xarray
  cifs: Don't support ITER_XARRAY

 fs/9p/vfs_addr.c             |   5 +-
 fs/afs/file.c                |  30 +-
 fs/afs/fsclient.c            |   9 +-
 fs/afs/write.c               |   4 +-
 fs/afs/yfsclient.c           |   9 +-
 fs/cachefiles/io.c           |  19 +-
 fs/cachefiles/xattr.c        |  34 +-
 fs/ceph/addr.c               |  76 ++--
 fs/ceph/inode.c              |   1 +
 fs/netfs/Makefile            |   4 +-
 fs/netfs/buffered_read.c     | 766 ++++++++++++++++++++-------------
 fs/netfs/buffered_write.c    | 309 +++++++-------
 fs/netfs/direct_read.c       | 147 ++++++-
 fs/netfs/internal.h          |  43 +-
 fs/netfs/io.c                | 796 -----------------------------------
 fs/netfs/iterator.c          |  50 +++
 fs/netfs/main.c              |   7 +-
 fs/netfs/misc.c              | 101 +++++
 fs/netfs/objects.c           |  16 +-
 fs/netfs/read_collect.c      | 544 ++++++++++++++++++++++++
 fs/netfs/read_pgpriv2.c      | 264 ++++++++++++
 fs/netfs/read_retry.c        | 256 +++++++++++
 fs/netfs/stats.c             |  27 +-
 fs/netfs/write_collect.c     | 246 ++++-------
 fs/netfs/write_issue.c       |  93 ++--
 fs/nfs/fscache.c             |  19 +-
 fs/nfs/fscache.h             |   7 +-
 fs/smb/client/cifsencrypt.c  | 144 +------
 fs/smb/client/cifsglob.h     |   3 +-
 fs/smb/client/cifssmb.c      |   6 +-
 fs/smb/client/file.c         |  71 ++--
 fs/smb/client/smb2ops.c      | 218 +++++-----
 fs/smb/client/smb2pdu.c      |  10 +-
 fs/smb/client/smbdirect.c    |  82 ++--
 include/linux/folio_queue.h  | 156 +++++++
 include/linux/iov_iter.h     | 104 +++++
 include/linux/netfs.h        |  45 +-
 include/linux/uio.h          |  18 +
 include/trace/events/netfs.h | 144 +++++--
 lib/iov_iter.c               | 240 ++++++++++-
 lib/kunit_iov_iter.c         | 259 ++++++++++++
 lib/scatterlist.c            |  69 ++-
 42 files changed, 3515 insertions(+), 1936 deletions(-)
 delete mode 100644 fs/netfs/io.c
 create mode 100644 fs/netfs/read_collect.c
 create mode 100644 fs/netfs/read_pgpriv2.c
 create mode 100644 fs/netfs/read_retry.c
 create mode 100644 include/linux/folio_queue.h

Comments

Christian Brauner Aug. 15, 2024, 1:07 p.m. UTC | #1
On Wed, 14 Aug 2024 21:38:20 +0100, David Howells wrote:
> This set of patches includes a couple of fixes:
> 
>  (1) Revert the removal of waits on PG_private_2 from netfs_release_page()
>      and netfs_invalidate_page().
> 
>  (2) Make cachefiles take the sb_writers lock around set/removexattr.
> 
> [...]

Applied to the vfs.netfs branch of the vfs/vfs.git tree.
Patches in the vfs.netfs branch should appear in linux-next soon.

Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.

It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.

Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs.netfs

[01/25] cachefiles: Fix non-taking of sb_writers around set/removexattr
        https://git.kernel.org/vfs/vfs/c/4ca422fc1c25
[02/25] netfs: Adjust labels in /proc/fs/netfs/stats
        https://git.kernel.org/vfs/vfs/c/2d8e8e0dcfa8
[03/25] netfs: Record contention stats for writeback lock
        https://git.kernel.org/vfs/vfs/c/b946f63b34fa
[04/25] netfs: Reduce number of conditional branches in netfs_perform_write()
        https://git.kernel.org/vfs/vfs/c/922d33ef048c
[05/25] netfs, cifs: Move CIFS_INO_MODIFIED_ATTR to netfs_inode
        https://git.kernel.org/vfs/vfs/c/4c1daf044aed
[06/25] netfs: Move max_len/max_nr_segs from netfs_io_subrequest to netfs_io_stream
        https://git.kernel.org/vfs/vfs/c/a479f52b4401
[07/25] netfs: Reserve netfs_sreq_source 0 as unset/unknown
        https://git.kernel.org/vfs/vfs/c/e1de76429131
[08/25] netfs: Remove NETFS_COPY_TO_CACHE
        https://git.kernel.org/vfs/vfs/c/2a4e83a305ef
[09/25] netfs: Set the request work function upon allocation
        https://git.kernel.org/vfs/vfs/c/52c62b5f6dc0
[10/25] netfs: Use bh-disabling spinlocks for rreq->lock
        https://git.kernel.org/vfs/vfs/c/45268b70a77d
[11/25] mm: Define struct folio_queue and ITER_FOLIOQ to handle a sequence of folios
        https://git.kernel.org/vfs/vfs/c/3e73d92929db
[12/25] iov_iter: Provide copy_folio_from_iter()
        https://git.kernel.org/vfs/vfs/c/7a51f5cf0851
[13/25] cifs: Provide the capability to extract from ITER_FOLIOQ to RDMA SGEs
        https://git.kernel.org/vfs/vfs/c/97b15fbddd0c
[14/25] netfs: Use new folio_queue data type and iterator instead of xarray iter
        https://git.kernel.org/vfs/vfs/c/b33aa21f3b7f
[15/25] netfs: Provide an iterator-reset function
        https://git.kernel.org/vfs/vfs/c/7306dffdd871
[16/25] netfs: Simplify the writeback code
        https://git.kernel.org/vfs/vfs/c/5fb0299ed8df
[17/25] afs: Make read subreqs async
        https://git.kernel.org/vfs/vfs/c/05fd361eb083
[18/25] netfs: Speed up buffered reading
        https://git.kernel.org/vfs/vfs/c/6437a28f5de1
[19/25] netfs: Remove fs/netfs/io.c
        https://git.kernel.org/vfs/vfs/c/85112b95630c
[20/25] cachefiles, netfs: Fix write to partial block at EOF
        https://git.kernel.org/vfs/vfs/c/3b5a6483e8d2
[21/25] netfs: Cancel dirty folios that have no storage destination
        https://git.kernel.org/vfs/vfs/c/3cca08a1c4c5
[22/25] cifs: Use iterate_and_advance*() routines directly for hashing
        https://git.kernel.org/vfs/vfs/c/c86e6c334311
[23/25] cifs: Switch crypto buffer to use a folio_queue rather than an xarray
        https://git.kernel.org/vfs/vfs/c/04c9967360ea
[24/25] cifs: Don't support ITER_XARRAY
        https://git.kernel.org/vfs/vfs/c/7d0f7f2d1e8b