Commit ea7a1019 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Partial revert of commit 6f9f1728

The premise of commit 6f9f1728 ("SUNRPC: Mitigate cond_resched() in
xprt_transmit()") was that cond_resched() is expensive and unnecessary
when there has been just a single send.
The point of cond_resched() is to ensure that tasks that should pre-empt
this one get a chance to do so when it is safe to do so. The code prior
to commit 6f9f1728 failed to take into account that it was keeping a
rpc_task pinned for longer than it needed to, and so rather than doing a
full revert, let's just move the cond_resched.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent ca05cbae
...@@ -1603,15 +1603,14 @@ xprt_transmit(struct rpc_task *task) ...@@ -1603,15 +1603,14 @@ xprt_transmit(struct rpc_task *task)
{ {
struct rpc_rqst *next, *req = task->tk_rqstp; struct rpc_rqst *next, *req = task->tk_rqstp;
struct rpc_xprt *xprt = req->rq_xprt; struct rpc_xprt *xprt = req->rq_xprt;
int counter, status; int status;
spin_lock(&xprt->queue_lock); spin_lock(&xprt->queue_lock);
counter = 0; for (;;) {
while (!list_empty(&xprt->xmit_queue)) { next = list_first_entry_or_null(&xprt->xmit_queue,
if (++counter == 20) struct rpc_rqst, rq_xmit);
if (!next)
break; break;
next = list_first_entry(&xprt->xmit_queue,
struct rpc_rqst, rq_xmit);
xprt_pin_rqst(next); xprt_pin_rqst(next);
spin_unlock(&xprt->queue_lock); spin_unlock(&xprt->queue_lock);
status = xprt_request_transmit(next, task); status = xprt_request_transmit(next, task);
...@@ -1619,13 +1618,16 @@ xprt_transmit(struct rpc_task *task) ...@@ -1619,13 +1618,16 @@ xprt_transmit(struct rpc_task *task)
status = 0; status = 0;
spin_lock(&xprt->queue_lock); spin_lock(&xprt->queue_lock);
xprt_unpin_rqst(next); xprt_unpin_rqst(next);
if (status == 0) { if (status < 0) {
if (!xprt_request_data_received(task) || if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) task->tk_status = status;
continue; break;
} else if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) }
task->tk_status = status; /* Was @task transmitted, and has it received a reply? */
break; if (xprt_request_data_received(task) &&
!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
break;
cond_resched_lock(&xprt->queue_lock);
} }
spin_unlock(&xprt->queue_lock); spin_unlock(&xprt->queue_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment