On Sat, 06 Sep 2025, Trond Myklebust wrote: > On Thu, 2025-08-28 at 18:12 +0530, Harshvardhan Jha wrote: > > Is it possible to get this merged in 6.17? I have tested this and the > > LTP tests pass. > > After much thought, I think I'd rather just revert the commit that > caused the issue. I'll work on an alternative for the 6.18 timeframe > instead. That seems reasonable - thanks. I'd be curious to know what the original issue was. I'm guess it was CLOSE blocking ?? If you do revert, would you consider the following? I wrote it a while ago but it became irrelevant with the patch that you might now revert. I wonder if it would make sense for some part of bit_wait() (or rpc_wait_bit_killable()) to warn if waiting in TASK_KILLABLE when PF_EXITING is set. Thanks, NeilBrown From: NeilBrown <neil@xxxxxxxxxx> Date: Fri, 27 Sep 2024 12:53:52 +1000 Subject: [PATCH] sunrpc: discard rpc_wait_bit_killable() rpc_wait_bit_killable() currently differs from bit_wait() in the it returns -ERESTARTSYS rather then -EINTR. The sunrpc and nfs code never really care about the difference. The error could get up to user-space but it is only generated when a process is being killed, in which case there is no user-space to see the difference. Signed-off-by: NeilBrown <neil@xxxxxxxxxx> --- net/sunrpc/sched.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 9b45fbdc90ca..247e48641d91 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -274,14 +274,6 @@ void rpc_destroy_wait_queue(struct rpc_wait_queue *queue) } EXPORT_SYMBOL_GPL(rpc_destroy_wait_queue); -static int rpc_wait_bit_killable(struct wait_bit_key *key, int mode) -{ - schedule(); - if (signal_pending_state(mode, current)) - return -ERESTARTSYS; - return 0; -} - #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) || IS_ENABLED(CONFIG_TRACEPOINTS) static void rpc_task_set_debuginfo(struct rpc_task *task) { @@ -343,7 +335,7 @@ static int rpc_complete_task(struct rpc_task *task) int rpc_wait_for_completion_task(struct rpc_task *task) { return out_of_line_wait_on_bit(&task->tk_runstate, RPC_TASK_ACTIVE, - rpc_wait_bit_killable, TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); + bit_wait, TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); } EXPORT_SYMBOL_GPL(rpc_wait_for_completion_task); @@ -983,12 +975,12 @@ static void __rpc_execute(struct rpc_task *task) /* sync task: sleep here */ trace_rpc_task_sync_sleep(task, task->tk_action); status = out_of_line_wait_on_bit(&task->tk_runstate, - RPC_TASK_QUEUED, rpc_wait_bit_killable, + RPC_TASK_QUEUED, bit_wait, TASK_KILLABLE|TASK_FREEZABLE); if (status < 0) { /* * When a sync task receives a signal, it exits with - * -ERESTARTSYS. In order to catch any callbacks that + * -EINTR. In order to catch any callbacks that * clean up after sleeping on some queue, we don't * break the loop here, but go around once more. */ -- 2.50.0.107.gf914562f5916.dirty