netfs: Abstract out a rolling folio buffer implementation
authorDavid Howells <dhowells@redhat.com>
Mon, 16 Dec 2024 20:40:55 +0000 (20:40 +0000)
committerChristian Brauner <brauner@kernel.org>
Fri, 20 Dec 2024 21:34:02 +0000 (22:34 +0100)
commit06fa229ceb36898e68022b5654c017d2c6582d7d
treedb540d16164012b660f6096819f5288356749f39
parentaabcabf2746062253565b33aa3f8d25999a5ac01
netfs: Abstract out a rolling folio buffer implementation

A rolling buffer is a series of folios held in a list of folio_queues.  New
folios and folio_queue structs may be inserted at the head simultaneously
with spent ones being removed from the tail without the need for locking.

The rolling buffer includes an iov_iter and it has to be careful managing
this as the list of folio_queues is extended such that an oops doesn't
incurred because the iterator was pointing to the end of a folio_queue
segment that got appended to and then removed.

We need to use the mechanism twice, once for read and once for write, and,
in future patches, we will use a second rolling buffer to handle bounce
buffering for content encryption.

Signed-off-by: David Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/r/20241216204124.3752367-6-dhowells@redhat.com
cc: Jeff Layton <jlayton@kernel.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
15 files changed:
fs/netfs/Makefile
fs/netfs/buffered_read.c
fs/netfs/direct_read.c
fs/netfs/direct_write.c
fs/netfs/internal.h
fs/netfs/misc.c
fs/netfs/objects.c
fs/netfs/read_pgpriv2.c
fs/netfs/read_retry.c
fs/netfs/rolling_buffer.c [new file with mode: 0644]
fs/netfs/write_collect.c
fs/netfs/write_issue.c
include/linux/netfs.h
include/linux/rolling_buffer.h [new file with mode: 0644]
include/trace/events/netfs.h