Skip to content

Commit 2e45b92

Browse files
dhowellsbrauner
authored andcommitted
afs: Make read subreqs async
Perform AFS read subrequests in a work item rather than in the calling thread. For normal buffered reads, this will allow the calling thread to copy data from the pagecache to the application at the same time as the demarshalling thread is shovelling data from skbuffs into the pagecache. This will also allow the RA mark to trigger a new read before we've finished shovelling the data from the current one. Note: This would be a bit safer if the FS.FetchData RPC ops returned the metadata (including the data version number) before returning the data. This would allow me to flush the pagecache before installing the new data. In future, it may be possible to asynchronously flush the pagecache either side of the region being read. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: Jeff Layton <jlayton@kernel.org> cc: linux-afs@lists.infradead.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Link: https://lore.kernel.org/r/20240814203850.2240469-19-dhowells@redhat.com/ # v2 Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 983cdcf commit 2e45b92

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

fs/afs/file.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,9 @@ int afs_fetch_data(struct afs_vnode *vnode, struct afs_read *req)
305305
return afs_do_sync_operation(op);
306306
}
307307

308-
static void afs_issue_read(struct netfs_io_subrequest *subreq)
308+
static void afs_read_worker(struct work_struct *work)
309309
{
310+
struct netfs_io_subrequest *subreq = container_of(work, struct netfs_io_subrequest, work);
310311
struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode);
311312
struct afs_read *fsreq;
312313

@@ -325,6 +326,12 @@ static void afs_issue_read(struct netfs_io_subrequest *subreq)
325326
afs_put_read(fsreq);
326327
}
327328

329+
static void afs_issue_read(struct netfs_io_subrequest *subreq)
330+
{
331+
INIT_WORK(&subreq->work, afs_read_worker);
332+
queue_work(system_long_wq, &subreq->work);
333+
}
334+
328335
static int afs_symlink_read_folio(struct file *file, struct folio *folio)
329336
{
330337
struct afs_vnode *vnode = AFS_FS_I(folio->mapping->host);

0 commit comments

Comments
 (0)