137 lines
4.6 KiB
Diff
137 lines
4.6 KiB
Diff
From b885aa903c313644f7ba8d46d4c09ead1b52f1f1 Mon Sep 17 00:00:00 2001
|
|
From: David Howells <dhowells@redhat.com>
|
|
Date: Tue, 1 Jul 2025 17:38:38 +0100
|
|
Subject: netfs: Provide helpers to perform NETFS_RREQ_IN_PROGRESS flag
|
|
wangling
|
|
|
|
Provide helpers to clear and test the NETFS_RREQ_IN_PROGRESS and to insert
|
|
the appropriate barrierage.
|
|
|
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
|
Link: https://lore.kernel.org/20250701163852.2171681-4-dhowells@redhat.com
|
|
Tested-by: Steve French <sfrench@samba.org>
|
|
Reviewed-by: Paulo Alcantara <pc@manguebit.org>
|
|
cc: netfs@lists.linux.dev
|
|
cc: linux-fsdevel@vger.kernel.org
|
|
Signed-off-by: Christian Brauner <brauner@kernel.org>
|
|
---
|
|
fs/netfs/internal.h | 18 ++++++++++++++++++
|
|
fs/netfs/misc.c | 10 +++++-----
|
|
fs/netfs/read_collect.c | 4 ++--
|
|
fs/netfs/write_collect.c | 4 ++--
|
|
4 files changed, 27 insertions(+), 9 deletions(-)
|
|
|
|
--- a/fs/netfs/internal.h
|
|
+++ b/fs/netfs/internal.h
|
|
@@ -275,6 +275,24 @@ static inline void netfs_wake_rreq_flag(
|
|
}
|
|
|
|
/*
|
|
+ * Test the NETFS_RREQ_IN_PROGRESS flag, inserting an appropriate barrier.
|
|
+ */
|
|
+static inline bool netfs_check_rreq_in_progress(const struct netfs_io_request *rreq)
|
|
+{
|
|
+ /* Order read of flags before read of anything else, such as error. */
|
|
+ return test_bit_acquire(NETFS_RREQ_IN_PROGRESS, &rreq->flags);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Test the NETFS_SREQ_IN_PROGRESS flag, inserting an appropriate barrier.
|
|
+ */
|
|
+static inline bool netfs_check_subreq_in_progress(const struct netfs_io_subrequest *subreq)
|
|
+{
|
|
+ /* Order read of flags before read of anything else, such as error. */
|
|
+ return test_bit_acquire(NETFS_SREQ_IN_PROGRESS, &subreq->flags);
|
|
+}
|
|
+
|
|
+/*
|
|
* fscache-cache.c
|
|
*/
|
|
#ifdef CONFIG_PROC_FS
|
|
--- a/fs/netfs/misc.c
|
|
+++ b/fs/netfs/misc.c
|
|
@@ -356,14 +356,14 @@ void netfs_wait_for_in_progress_stream(s
|
|
DEFINE_WAIT(myself);
|
|
|
|
list_for_each_entry(subreq, &stream->subrequests, rreq_link) {
|
|
- if (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags))
|
|
+ if (!netfs_check_subreq_in_progress(subreq))
|
|
continue;
|
|
|
|
trace_netfs_rreq(rreq, netfs_rreq_trace_wait_queue);
|
|
for (;;) {
|
|
prepare_to_wait(&rreq->waitq, &myself, TASK_UNINTERRUPTIBLE);
|
|
|
|
- if (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags))
|
|
+ if (!netfs_check_subreq_in_progress(subreq))
|
|
break;
|
|
|
|
trace_netfs_sreq(subreq, netfs_sreq_trace_wait_for);
|
|
@@ -400,7 +400,7 @@ static int netfs_collect_in_app(struct n
|
|
struct netfs_io_subrequest,
|
|
rreq_link);
|
|
if (subreq &&
|
|
- (!test_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags) ||
|
|
+ (!netfs_check_subreq_in_progress(subreq) ||
|
|
test_bit(NETFS_SREQ_MADE_PROGRESS, &subreq->flags))) {
|
|
need_collect = true;
|
|
break;
|
|
@@ -454,7 +454,7 @@ static ssize_t netfs_wait_for_in_progres
|
|
}
|
|
}
|
|
|
|
- if (!test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags))
|
|
+ if (!netfs_check_rreq_in_progress(rreq))
|
|
break;
|
|
|
|
schedule();
|
|
@@ -525,7 +525,7 @@ static void netfs_wait_for_pause(struct
|
|
}
|
|
}
|
|
|
|
- if (!test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags) ||
|
|
+ if (!netfs_check_rreq_in_progress(rreq) ||
|
|
!test_bit(NETFS_RREQ_PAUSE, &rreq->flags))
|
|
break;
|
|
|
|
--- a/fs/netfs/read_collect.c
|
|
+++ b/fs/netfs/read_collect.c
|
|
@@ -220,7 +220,7 @@ reassess:
|
|
stream->collected_to = front->start;
|
|
}
|
|
|
|
- if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags))
|
|
+ if (netfs_check_subreq_in_progress(front))
|
|
notes |= HIT_PENDING;
|
|
smp_rmb(); /* Read counters after IN_PROGRESS flag. */
|
|
transferred = READ_ONCE(front->transferred);
|
|
@@ -447,7 +447,7 @@ void netfs_read_collection_worker(struct
|
|
struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work);
|
|
|
|
netfs_see_request(rreq, netfs_rreq_trace_see_work);
|
|
- if (test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags)) {
|
|
+ if (netfs_check_rreq_in_progress(rreq)) {
|
|
if (netfs_read_collection(rreq))
|
|
/* Drop the ref from the IN_PROGRESS flag. */
|
|
netfs_put_request(rreq, netfs_rreq_trace_put_work_ip);
|
|
--- a/fs/netfs/write_collect.c
|
|
+++ b/fs/netfs/write_collect.c
|
|
@@ -240,7 +240,7 @@ reassess_streams:
|
|
}
|
|
|
|
/* Stall if the front is still undergoing I/O. */
|
|
- if (test_bit(NETFS_SREQ_IN_PROGRESS, &front->flags)) {
|
|
+ if (netfs_check_subreq_in_progress(front)) {
|
|
notes |= HIT_PENDING;
|
|
break;
|
|
}
|
|
@@ -434,7 +434,7 @@ void netfs_write_collection_worker(struc
|
|
struct netfs_io_request *rreq = container_of(work, struct netfs_io_request, work);
|
|
|
|
netfs_see_request(rreq, netfs_rreq_trace_see_work);
|
|
- if (test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags)) {
|
|
+ if (netfs_check_rreq_in_progress(rreq)) {
|
|
if (netfs_write_collection(rreq))
|
|
/* Drop the ref from the IN_PROGRESS flag. */
|
|
netfs_put_request(rreq, netfs_rreq_trace_put_work_ip);
|