netfs: Speed up buffered reading
authorDavid Howells <dhowells@redhat.com>
Mon, 1 Jul 2024 23:40:22 +0000 (00:40 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 12 Sep 2024 10:20:41 +0000 (12:20 +0200)
commitee4cdf7ba857a894ad1650d6ab77669cbbfa329e
tree8258e3b756adf109085d66a8b63cd08db03abad0
parent2e45b922977c07bb339d76fd45e68f9b907fef7d
netfs: Speed up buffered reading

Improve the efficiency of buffered reads in a number of ways:

 (1) Overhaul the algorithm in general so that it's a lot more compact and
     split the read submission code between buffered and unbuffered
     versions.  The unbuffered version can be vastly simplified.

 (2) Read-result collection is handed off to a work queue rather than being
     done in the I/O thread.  Multiple subrequests can be processes
     simultaneously.

 (3) When a subrequest is collected, any folios it fully spans are
     collected and "spare" data on either side is donated to either the
     previous or the next subrequest in the sequence.

Notes:

 (*) Readahead expansion is massively slows down fio, presumably because it
     causes a load of extra allocations, both folio and xarray, up front
     before RPC requests can be transmitted.

 (*) RDMA with cifs does appear to work, both with SIW and RXE.

 (*) PG_private_2-based reading and copy-to-cache is split out into its own
     file and altered to use folio_queue.  Note that the copy to the cache
     now creates a new write transaction against the cache and adds the
     folios to be copied into it.  This allows it to use part of the
     writeback I/O code.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20240814203850.2240469-20-dhowells@redhat.com/
Signed-off-by: Christian Brauner <brauner@kernel.org>
28 files changed:
fs/9p/vfs_addr.c
fs/afs/file.c
fs/afs/fsclient.c
fs/afs/yfsclient.c
fs/ceph/addr.c
fs/netfs/Makefile
fs/netfs/buffered_read.c
fs/netfs/direct_read.c
fs/netfs/internal.h
fs/netfs/iterator.c
fs/netfs/main.c
fs/netfs/objects.c
fs/netfs/read_collect.c [new file with mode: 0644]
fs/netfs/read_pgpriv2.c [new file with mode: 0644]
fs/netfs/read_retry.c [new file with mode: 0644]
fs/netfs/stats.c
fs/netfs/write_collect.c
fs/netfs/write_issue.c
fs/nfs/fscache.c
fs/nfs/fscache.h
fs/smb/client/cifsglob.h
fs/smb/client/cifssmb.c
fs/smb/client/file.c
fs/smb/client/smb2ops.c
fs/smb/client/smb2pdu.c
include/linux/folio_queue.h
include/linux/netfs.h
include/trace/events/netfs.h