Skip to content

Commit af6b61d

Browse files
author
Trond Myklebust
committed
Revert "SUNRPC: Micro-optimise when the task is known not to be sleeping"
This reverts commit 009a82f. The ability to optimise here relies on compiler being able to optimise away tail calls to avoid stack overflows. Unfortunately, we are seeing reports of problems, so let's just revert. Reported-by: Daniel Mack <daniel@zonque.org> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 0769663 commit af6b61d

File tree

2 files changed

+8
-45
lines changed

2 files changed

+8
-45
lines changed

include/linux/sunrpc/sched.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -304,12 +304,4 @@ rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
304304
}
305305
#endif /* CONFIG_SUNRPC_SWAP */
306306

307-
static inline bool
308-
rpc_task_need_resched(const struct rpc_task *task)
309-
{
310-
if (RPC_IS_QUEUED(task) || task->tk_callback)
311-
return true;
312-
return false;
313-
}
314-
315307
#endif /* _LINUX_SUNRPC_SCHED_H_ */

net/sunrpc/clnt.c

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,6 @@ call_start(struct rpc_task *task)
15401540
clnt->cl_stats->rpccnt++;
15411541
task->tk_action = call_reserve;
15421542
rpc_task_set_transport(task, clnt);
1543-
call_reserve(task);
15441543
}
15451544

15461545
/*
@@ -1554,9 +1553,6 @@ call_reserve(struct rpc_task *task)
15541553
task->tk_status = 0;
15551554
task->tk_action = call_reserveresult;
15561555
xprt_reserve(task);
1557-
if (rpc_task_need_resched(task))
1558-
return;
1559-
call_reserveresult(task);
15601556
}
15611557

15621558
static void call_retry_reserve(struct rpc_task *task);
@@ -1579,7 +1575,6 @@ call_reserveresult(struct rpc_task *task)
15791575
if (status >= 0) {
15801576
if (task->tk_rqstp) {
15811577
task->tk_action = call_refresh;
1582-
call_refresh(task);
15831578
return;
15841579
}
15851580

@@ -1605,7 +1600,6 @@ call_reserveresult(struct rpc_task *task)
16051600
/* fall through */
16061601
case -EAGAIN: /* woken up; retry */
16071602
task->tk_action = call_retry_reserve;
1608-
call_retry_reserve(task);
16091603
return;
16101604
case -EIO: /* probably a shutdown */
16111605
break;
@@ -1628,9 +1622,6 @@ call_retry_reserve(struct rpc_task *task)
16281622
task->tk_status = 0;
16291623
task->tk_action = call_reserveresult;
16301624
xprt_retry_reserve(task);
1631-
if (rpc_task_need_resched(task))
1632-
return;
1633-
call_reserveresult(task);
16341625
}
16351626

16361627
/*
@@ -1645,9 +1636,6 @@ call_refresh(struct rpc_task *task)
16451636
task->tk_status = 0;
16461637
task->tk_client->cl_stats->rpcauthrefresh++;
16471638
rpcauth_refreshcred(task);
1648-
if (rpc_task_need_resched(task))
1649-
return;
1650-
call_refreshresult(task);
16511639
}
16521640

16531641
/*
@@ -1666,7 +1654,6 @@ call_refreshresult(struct rpc_task *task)
16661654
case 0:
16671655
if (rpcauth_uptodatecred(task)) {
16681656
task->tk_action = call_allocate;
1669-
call_allocate(task);
16701657
return;
16711658
}
16721659
/* Use rate-limiting and a max number of retries if refresh
@@ -1685,7 +1672,6 @@ call_refreshresult(struct rpc_task *task)
16851672
task->tk_cred_retry--;
16861673
dprintk("RPC: %5u %s: retry refresh creds\n",
16871674
task->tk_pid, __func__);
1688-
call_refresh(task);
16891675
return;
16901676
}
16911677
dprintk("RPC: %5u %s: refresh creds failed with error %d\n",
@@ -1711,10 +1697,8 @@ call_allocate(struct rpc_task *task)
17111697
task->tk_status = 0;
17121698
task->tk_action = call_encode;
17131699

1714-
if (req->rq_buffer) {
1715-
call_encode(task);
1700+
if (req->rq_buffer)
17161701
return;
1717-
}
17181702

17191703
if (proc->p_proc != 0) {
17201704
BUG_ON(proc->p_arglen == 0);
@@ -1740,12 +1724,8 @@ call_allocate(struct rpc_task *task)
17401724

17411725
status = xprt->ops->buf_alloc(task);
17421726
xprt_inject_disconnect(xprt);
1743-
if (status == 0) {
1744-
if (rpc_task_need_resched(task))
1745-
return;
1746-
call_encode(task);
1727+
if (status == 0)
17471728
return;
1748-
}
17491729
if (status != -ENOMEM) {
17501730
rpc_exit(task, status);
17511731
return;
@@ -1828,8 +1808,12 @@ call_encode(struct rpc_task *task)
18281808
xprt_request_enqueue_receive(task);
18291809
xprt_request_enqueue_transmit(task);
18301810
out:
1831-
task->tk_action = call_bind;
1832-
call_bind(task);
1811+
task->tk_action = call_transmit;
1812+
/* Check that the connection is OK */
1813+
if (!xprt_bound(task->tk_xprt))
1814+
task->tk_action = call_bind;
1815+
else if (!xprt_connected(task->tk_xprt))
1816+
task->tk_action = call_connect;
18331817
}
18341818

18351819
/*
@@ -1847,7 +1831,6 @@ rpc_task_handle_transmitted(struct rpc_task *task)
18471831
{
18481832
xprt_end_transmit(task);
18491833
task->tk_action = call_transmit_status;
1850-
call_transmit_status(task);
18511834
}
18521835

18531836
/*
@@ -1865,7 +1848,6 @@ call_bind(struct rpc_task *task)
18651848

18661849
if (xprt_bound(xprt)) {
18671850
task->tk_action = call_connect;
1868-
call_connect(task);
18691851
return;
18701852
}
18711853

@@ -1896,7 +1878,6 @@ call_bind_status(struct rpc_task *task)
18961878
dprint_status(task);
18971879
task->tk_status = 0;
18981880
task->tk_action = call_connect;
1899-
call_connect(task);
19001881
return;
19011882
}
19021883

@@ -1981,7 +1962,6 @@ call_connect(struct rpc_task *task)
19811962

19821963
if (xprt_connected(xprt)) {
19831964
task->tk_action = call_transmit;
1984-
call_transmit(task);
19851965
return;
19861966
}
19871967

@@ -2051,7 +2031,6 @@ call_connect_status(struct rpc_task *task)
20512031
case 0:
20522032
clnt->cl_stats->netreconn++;
20532033
task->tk_action = call_transmit;
2054-
call_transmit(task);
20552034
return;
20562035
}
20572036
rpc_exit(task, status);
@@ -2087,9 +2066,6 @@ call_transmit(struct rpc_task *task)
20872066
xprt_transmit(task);
20882067
}
20892068
xprt_end_transmit(task);
2090-
if (rpc_task_need_resched(task))
2091-
return;
2092-
call_transmit_status(task);
20932069
}
20942070

20952071
/*
@@ -2107,9 +2083,6 @@ call_transmit_status(struct rpc_task *task)
21072083
if (rpc_task_transmitted(task)) {
21082084
if (task->tk_status == 0)
21092085
xprt_request_wait_receive(task);
2110-
if (rpc_task_need_resched(task))
2111-
return;
2112-
call_status(task);
21132086
return;
21142087
}
21152088

@@ -2170,7 +2143,6 @@ call_bc_encode(struct rpc_task *task)
21702143
{
21712144
xprt_request_enqueue_transmit(task);
21722145
task->tk_action = call_bc_transmit;
2173-
call_bc_transmit(task);
21742146
}
21752147

21762148
/*
@@ -2261,7 +2233,6 @@ call_status(struct rpc_task *task)
22612233
status = task->tk_status;
22622234
if (status >= 0) {
22632235
task->tk_action = call_decode;
2264-
call_decode(task);
22652236
return;
22662237
}
22672238

0 commit comments

Comments
 (0)