Subject: [PATCH 00/17] netfs, cifs: Miscellaneous fixes and read/write improvements

From: David Howells <[email-masked]>
Date: Thu, 20 Jun 2024 18:31:18 +0100

Hi Christian, Steve, Willy,

[!] NOTE: THE LAST PATCH IS INCOMPLETE AND ONLY PARTIALLY WORKS.

[!] Willy: Could you look at the sheaf-adding patch?

This set of patches includes some netfs and cifs fixes:

 (1) Make sure we set the request length when doing an unbuffered/direct
     write.  This was in v2 of the io_uring fix writethrough patch, but v1
     got merged instead.

 (2) Move CIFS_INO_MODIFIED_ATTR to netfs_inode::flags to avoid jumping
     through a function pointer just for that.

 (3) Fix a premature issuing of write ops on a partially dirty page where
     the dirty part is at the end of the page and thus may be contiguous
     with the next page.

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

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

 (5) 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:

 (6) Enable multipage folios in 9P.

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

 (8) Delete some unused netfslib functions for dealing with xarrays.

 (9) In cifs, defer read completion.

(10) In cifs, only pick a channel once per read request (as per v6.9) rather
     than per-subrequest.

(11) In cifs, move the 'pid' from the subrequest to the request as it's the
     same for all.

(12) 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.

Then there's the main performance enhancing changes:

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

(14) Use sheaves in the write-side helpers instead of xarrays.

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

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

(17) Overhaul the read-side helpers to improve performance.  [!] NOTE: THIS IS
     INCOMPLETE!  It works for buffered read to a large extent, but not DIO
     and may not cache correctly.

David

David Howells (17):
  netfs: Fix io_uring based write-through
  netfs, cifs: Move CIFS_INO_MODIFIED_ATTR to netfs_inode
  netfs: Fix early issue of write op on partial write to folio tail
  netfs: Adjust labels in /proc/fs/netfs/stats
  netfs: Record contention stats for writeback lock
  9p: Enable multipage folios
  netfs: Reduce number of conditional branches in netfs_perform_write()
  netfs: Delete some xarray-wangling functions that aren't used
  cifs: Defer read completion
  cifs: Only pick a channel once per read request
  cifs: Move the 'pid' from the subreq to the req
  netfs: Move max_len/max_nr_segs from netfs_io_subrequest to
    netfs_io_stream
  mm: Define struct sheaf and ITER_SHEAF to handle a sequence of folios
  netfs: Use new sheaf data type and iterator instead of xarray iter
  netfs: Simplify the writeback code
  afs: Make read subreqs async
  netfs: Speed up buffered reading

 fs/9p/vfs_addr.c             |  13 +-
 fs/9p/vfs_inode.c            |   1 +
 fs/afs/file.c                |  21 +-
 fs/afs/fsclient.c            |   9 +-
 fs/afs/write.c               |   4 +-
 fs/afs/yfsclient.c           |   9 +-
 fs/cachefiles/io.c           |   5 +-
 fs/ceph/addr.c               |  72 ++---
 fs/netfs/Makefile            |   2 +-
 fs/netfs/buffered_read.c     | 510 +++++++++++++++++++++------------
 fs/netfs/buffered_write.c    | 308 ++++++++++----------
 fs/netfs/direct_read.c       |  99 ++++++-
 fs/netfs/direct_write.c      |   3 +-
 fs/netfs/internal.h          |  26 +-
 fs/netfs/io.c                | 528 +----------------------------------
 fs/netfs/iterator.c          |  50 ++++
 fs/netfs/main.c              |   7 +-
 fs/netfs/misc.c              | 115 ++++----
 fs/netfs/objects.c           |   2 +-
 fs/netfs/read_collect.c      | 450 +++++++++++++++++++++++++++++
 fs/netfs/stats.c             |  23 +-
 fs/netfs/write_collect.c     | 242 +++++-----------
 fs/netfs/write_issue.c       |  68 ++---
 fs/nfs/fscache.c             |  31 +-
 fs/nfs/fscache.h             |   7 +-
 fs/smb/client/cifsglob.h     |   4 +-
 fs/smb/client/cifssmb.c      |  14 +-
 fs/smb/client/file.c         | 109 +++-----
 fs/smb/client/smb2pdu.c      |  21 +-
 include/linux/iov_iter.h     |  57 ++++
 include/linux/netfs.h        |  29 +-
 include/linux/sheaf.h        |  83 ++++++
 include/linux/uio.h          |  11 +
 include/trace/events/netfs.h | 124 +++++---
 lib/iov_iter.c               | 222 ++++++++++++++-
 lib/kunit_iov_iter.c         | 259 +++++++++++++++++
 lib/scatterlist.c            |  69 ++++-
 37 files changed, 2251 insertions(+), 1356 deletions(-)
 create mode 100644 fs/netfs/read_collect.c
 create mode 100644 include/linux/sheaf.h