Skip to content

Commit

Permalink
Revert "SUNRPC: Micro-optimise when the task is known not to be sleep…
Browse files Browse the repository at this point in the history
…ing"

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>
  • Loading branch information
Trond Myklebust committed Apr 11, 2019
1 parent 0769663 commit af6b61d
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 45 deletions.
8 changes: 0 additions & 8 deletions include/linux/sunrpc/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,4 @@ rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
}
#endif /* CONFIG_SUNRPC_SWAP */

static inline bool
rpc_task_need_resched(const struct rpc_task *task)
{
if (RPC_IS_QUEUED(task) || task->tk_callback)
return true;
return false;
}

#endif /* _LINUX_SUNRPC_SCHED_H_ */
45 changes: 8 additions & 37 deletions net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1540,7 +1540,6 @@ call_start(struct rpc_task *task)
clnt->cl_stats->rpccnt++;
task->tk_action = call_reserve;
rpc_task_set_transport(task, clnt);
call_reserve(task);
}

/*
Expand All @@ -1554,9 +1553,6 @@ call_reserve(struct rpc_task *task)
task->tk_status = 0;
task->tk_action = call_reserveresult;
xprt_reserve(task);
if (rpc_task_need_resched(task))
return;
call_reserveresult(task);
}

static void call_retry_reserve(struct rpc_task *task);
Expand All @@ -1579,7 +1575,6 @@ call_reserveresult(struct rpc_task *task)
if (status >= 0) {
if (task->tk_rqstp) {
task->tk_action = call_refresh;
call_refresh(task);
return;
}

Expand All @@ -1605,7 +1600,6 @@ call_reserveresult(struct rpc_task *task)
/* fall through */
case -EAGAIN: /* woken up; retry */
task->tk_action = call_retry_reserve;
call_retry_reserve(task);
return;
case -EIO: /* probably a shutdown */
break;
Expand All @@ -1628,9 +1622,6 @@ call_retry_reserve(struct rpc_task *task)
task->tk_status = 0;
task->tk_action = call_reserveresult;
xprt_retry_reserve(task);
if (rpc_task_need_resched(task))
return;
call_reserveresult(task);
}

/*
Expand All @@ -1645,9 +1636,6 @@ call_refresh(struct rpc_task *task)
task->tk_status = 0;
task->tk_client->cl_stats->rpcauthrefresh++;
rpcauth_refreshcred(task);
if (rpc_task_need_resched(task))
return;
call_refreshresult(task);
}

/*
Expand All @@ -1666,7 +1654,6 @@ call_refreshresult(struct rpc_task *task)
case 0:
if (rpcauth_uptodatecred(task)) {
task->tk_action = call_allocate;
call_allocate(task);
return;
}
/* Use rate-limiting and a max number of retries if refresh
Expand All @@ -1685,7 +1672,6 @@ call_refreshresult(struct rpc_task *task)
task->tk_cred_retry--;
dprintk("RPC: %5u %s: retry refresh creds\n",
task->tk_pid, __func__);
call_refresh(task);
return;
}
dprintk("RPC: %5u %s: refresh creds failed with error %d\n",
Expand All @@ -1711,10 +1697,8 @@ call_allocate(struct rpc_task *task)
task->tk_status = 0;
task->tk_action = call_encode;

if (req->rq_buffer) {
call_encode(task);
if (req->rq_buffer)
return;
}

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

status = xprt->ops->buf_alloc(task);
xprt_inject_disconnect(xprt);
if (status == 0) {
if (rpc_task_need_resched(task))
return;
call_encode(task);
if (status == 0)
return;
}
if (status != -ENOMEM) {
rpc_exit(task, status);
return;
Expand Down Expand Up @@ -1828,8 +1808,12 @@ call_encode(struct rpc_task *task)
xprt_request_enqueue_receive(task);
xprt_request_enqueue_transmit(task);
out:
task->tk_action = call_bind;
call_bind(task);
task->tk_action = call_transmit;
/* Check that the connection is OK */
if (!xprt_bound(task->tk_xprt))
task->tk_action = call_bind;
else if (!xprt_connected(task->tk_xprt))
task->tk_action = call_connect;
}

/*
Expand All @@ -1847,7 +1831,6 @@ rpc_task_handle_transmitted(struct rpc_task *task)
{
xprt_end_transmit(task);
task->tk_action = call_transmit_status;
call_transmit_status(task);
}

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

if (xprt_bound(xprt)) {
task->tk_action = call_connect;
call_connect(task);
return;
}

Expand Down Expand Up @@ -1896,7 +1878,6 @@ call_bind_status(struct rpc_task *task)
dprint_status(task);
task->tk_status = 0;
task->tk_action = call_connect;
call_connect(task);
return;
}

Expand Down Expand Up @@ -1981,7 +1962,6 @@ call_connect(struct rpc_task *task)

if (xprt_connected(xprt)) {
task->tk_action = call_transmit;
call_transmit(task);
return;
}

Expand Down Expand Up @@ -2051,7 +2031,6 @@ call_connect_status(struct rpc_task *task)
case 0:
clnt->cl_stats->netreconn++;
task->tk_action = call_transmit;
call_transmit(task);
return;
}
rpc_exit(task, status);
Expand Down Expand Up @@ -2087,9 +2066,6 @@ call_transmit(struct rpc_task *task)
xprt_transmit(task);
}
xprt_end_transmit(task);
if (rpc_task_need_resched(task))
return;
call_transmit_status(task);
}

/*
Expand All @@ -2107,9 +2083,6 @@ call_transmit_status(struct rpc_task *task)
if (rpc_task_transmitted(task)) {
if (task->tk_status == 0)
xprt_request_wait_receive(task);
if (rpc_task_need_resched(task))
return;
call_status(task);
return;
}

Expand Down Expand Up @@ -2170,7 +2143,6 @@ call_bc_encode(struct rpc_task *task)
{
xprt_request_enqueue_transmit(task);
task->tk_action = call_bc_transmit;
call_bc_transmit(task);
}

/*
Expand Down Expand Up @@ -2261,7 +2233,6 @@ call_status(struct rpc_task *task)
status = task->tk_status;
if (status >= 0) {
task->tk_action = call_decode;
call_decode(task);
return;
}

Expand Down

0 comments on commit af6b61d

Please sign in to comment.