lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 916/917] SUNRPC: Partial revert of commit 6f9f17287e78
    Date
    From: Trond Myklebust <trond.myklebust@hammerspace.com>

    commit ea7a1019d8baf8503ecd6e3ec8436dec283569e6 upstream.

    The premise of commit 6f9f17287e78 ("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 6f9f17287e78 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: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/sunrpc/xprt.c | 28 +++++++++++++++-------------
    1 file changed, 15 insertions(+), 13 deletions(-)

    --- a/net/sunrpc/xprt.c
    +++ b/net/sunrpc/xprt.c
    @@ -1603,15 +1603,14 @@ xprt_transmit(struct rpc_task *task)
    {
    struct rpc_rqst *next, *req = task->tk_rqstp;
    struct rpc_xprt *xprt = req->rq_xprt;
    - int counter, status;
    + int status;

    spin_lock(&xprt->queue_lock);
    - counter = 0;
    - while (!list_empty(&xprt->xmit_queue)) {
    - if (++counter == 20)
    + for (;;) {
    + next = list_first_entry_or_null(&xprt->xmit_queue,
    + struct rpc_rqst, rq_xmit);
    + if (!next)
    break;
    - next = list_first_entry(&xprt->xmit_queue,
    - struct rpc_rqst, rq_xmit);
    xprt_pin_rqst(next);
    spin_unlock(&xprt->queue_lock);
    status = xprt_request_transmit(next, task);
    @@ -1619,13 +1618,16 @@ xprt_transmit(struct rpc_task *task)
    status = 0;
    spin_lock(&xprt->queue_lock);
    xprt_unpin_rqst(next);
    - if (status == 0) {
    - if (!xprt_request_data_received(task) ||
    - test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
    - continue;
    - } else if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
    - task->tk_status = status;
    - break;
    + if (status < 0) {
    + if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate))
    + task->tk_status = status;
    + break;
    + }
    + /* Was @task transmitted, and has it received a reply? */
    + 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);
    }

    \
     
     \ /
      Last update: 2021-11-16 01:40    [W:2.416 / U:1.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site