From: Chuck Lever <cel@kernel.org>
To: Trond Myklebust <trondmy@kernel.org>,
Anna Schumaker <anna@kernel.org>, Tejun Heo <tj@kernel.org>
Cc: Lai Jiangshan <jiangshanlai@gmail.com>,
linux-nfs@vger.kernel.org,
open list <linux-kernel@vger.kernel.org>,
Chuck Lever <cel@kernel.org>
Subject: [PATCH RFC 2/8] SUNRPC: Execute initial async RPC states in caller's context
Date: Mon, 31 Aug 2026 14:21:58 -0400 [thread overview]
Message-ID: <20260831-performance-v1-2-8d9fd9b67f96@kernel.org> (raw)
In-Reply-To: <20260831-performance-v1-0-8d9fd9b67f96@kernel.org>
Each async RPC task is dispatched to the rpciod workqueue before its
first FSM state runs, though the initial states (call_start through
call_allocate) typically complete without blocking. Under high
concurrency this adds a workqueue enqueue, dequeue, and context
switch per RPC and contributes to rpciod pool lock contention.
Have rpc_execute() call __rpc_execute() directly for async tasks as
well. The initial states then run in the caller's context, and
__rpc_execute() returns to the caller when the task first sleeps on
a wait queue. Later wake-ups still dispatch to rpciod via
rpc_make_runnable().
Commit d6a1ed08c6ac ("SUNRPC: Reduce asynchronous RPC task stack
usage") moved async dispatch onto rpciod to bound caller stack
depth. Inline execution preserves that bound because __rpc_execute()
still runs each state from the same stack frame.
Signed-off-by: Chuck Lever <cel@kernel.org>
---
net/sunrpc/sched.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index 016f16ca5779..9b2800f6bfc7 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -1003,8 +1003,9 @@ static void __rpc_execute(struct rpc_task *task)
current_restore_flags(pflags, PF_MEMALLOC);
}
-/*
- * User-visible entry point to the scheduler.
+/**
+ * rpc_execute - Consumer entry point to the RPC scheduler
+ * @task: RPC task to be scheduled
*
* This may be called recursively if e.g. an async NFS task updates
* the attributes and finds that dirty pages must be flushed.
@@ -1014,15 +1015,12 @@ static void __rpc_execute(struct rpc_task *task)
*/
void rpc_execute(struct rpc_task *task)
{
- bool is_async = RPC_IS_ASYNC(task);
+ unsigned int pflags = memalloc_nofs_save();
rpc_set_active(task);
- rpc_make_runnable(rpciod_workqueue, task);
- if (!is_async) {
- unsigned int pflags = memalloc_nofs_save();
- __rpc_execute(task);
- memalloc_nofs_restore(pflags);
- }
+ rpc_test_and_set_running(task);
+ __rpc_execute(task);
+ memalloc_nofs_restore(pflags);
}
static void rpc_async_schedule(struct work_struct *work)
--
2.55.0
next prev parent reply other threads:[~2026-08-31 18:22 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 18:21 [PATCH RFC 0/8] Reduce lock contention in the NFS client Chuck Lever
2026-08-31 18:21 ` [PATCH RFC 1/8] SUNRPC: Use atomic_t for XID allocation Chuck Lever
2026-08-31 18:21 ` Chuck Lever [this message]
2026-08-31 18:21 ` [PATCH RFC 3/8] SUNRPC: Split recv_lock out of xprt->queue_lock Chuck Lever
2026-08-31 18:22 ` [PATCH RFC 4/8] Set WQ_SYSFS on key NFS-related workqueues Chuck Lever
2026-08-31 18:22 ` [PATCH RFC 5/8] workqueue: Export the functions needed for WQ attribute modification Chuck Lever
2026-08-31 18:22 ` [PATCH RFC 6/8] SUNRPC: Reduce rpciod workqueue contention Chuck Lever
2026-09-02 20:40 ` Tim Menninger
2026-09-03 13:33 ` Chuck Lever
2026-09-03 23:50 ` Tim Menninger
2026-09-04 14:13 ` Chuck Lever
2026-09-04 23:23 ` Tim Menninger
2026-09-06 16:21 ` Chuck Lever
2026-09-08 18:19 ` tmenninger
2026-09-08 21:11 ` Chuck Lever
2026-09-08 23:39 ` tmenninger
2026-09-09 16:14 ` Chuck Lever
2026-09-12 14:59 ` tmenninger
2026-09-12 15:49 ` Chuck Lever
2026-09-13 13:13 ` tmenninger
2026-09-13 16:40 ` Chuck Lever
2026-09-14 17:39 ` tmenninger
2026-09-15 14:42 ` Chuck Lever
2026-09-16 23:25 ` Tim Menninger
2026-08-31 18:22 ` [PATCH RFC 7/8] NFS: Reduce nfsiod " Chuck Lever
2026-08-31 18:22 ` [PATCH RFC 8/8] SUNRPC: Reduce xprtiod " Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260831-performance-v1-2-8d9fd9b67f96@kernel.org \
--to=cel@kernel.org \
--cc=anna@kernel.org \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=tj@kernel.org \
--cc=trondmy@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.