From patchwork Mon Mar 11 01:29:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10846549 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 66B0D1515 for ; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 52E5928DCD for ; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 512A328DD7; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DA8AB28DDB for ; Mon, 11 Mar 2019 01:31:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727053AbfCKBbH (ORCPT ); Sun, 10 Mar 2019 21:31:07 -0400 Received: from mail-io1-f68.google.com ([209.85.166.68]:35191 "EHLO mail-io1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726901AbfCKBbH (ORCPT ); Sun, 10 Mar 2019 21:31:07 -0400 Received: by mail-io1-f68.google.com with SMTP id x4so2619698ion.2 for ; Sun, 10 Mar 2019 18:31:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=QapxjmDMh3e4kgR0jm5KZjvtjNP0u9f3AxHVvc9E+i0=; b=TqkIx/bIcQQFsSAumIE0MACcw3yrU8XuEbbriU4ZeOAUqypoPlHSJeoPCU/TD65NmU 2UjRkCVal7ODI/On0uXhcVNeKSsZjay9Xnzh6CIbHPioRMnO0gK7rzb1Vn/ZvFvTcPuA 4MwP1BQTKKVsGpEczh4yAcAYNn19TzjuY/qjuhVEitqoSTqg8/h33oDVSZ4anizjUsIK 4RkfFMTaEDhwdYm0JnhJG0Ze95tE2OJmpE3TUqQl6jexLqDjJqL3Y+B2m9XDccQnXVJB 77jGef5eHbnP4HriRw2u28MhH1XgmDqJ8s0Fzsq2Wb5M3bJzI0KGHrQtXvYcANVLVwB/ RkJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=QapxjmDMh3e4kgR0jm5KZjvtjNP0u9f3AxHVvc9E+i0=; b=H69zSXAz4ycjWyOB2jmxvMjH15HZ5/XB7HGArDn9JnbS3Nz1Nks1jTv+4bgfUR7oSg apQDnUJpHI75f22lZbM6ZsRcFD0KFaqlTtEkbhqXkcgE7TR7Zgbf69hCMvAS3SMTxuR6 K9sufy5QAc+Tn3zVqKxuHfrAncVEI6IRb8Uif/B0sTJO6ztlG/LUR8owMCx925zTgToA lktmMtHbpf1VqO78kWu5xXvTlTP0o0cFTa7xNME+fLXaIRQXGVcXCqnjcrpjX2Q4BNBj wUCswdc3lUb0poN2n7oqQZ/ZTArkLr3/iuJKgTRGIPKb2PWSInKiWh46YFa1Mjsnoc/s 8wyA== X-Gm-Message-State: APjAAAWoeQ7sSSPD/u698la6i1tvosCEGtGiIEsF92YchV5OEA1wBM/r Z7iwwMG/Fk1RFKqjcIoZ6QibuZ0= X-Google-Smtp-Source: APXvYqzNtAZsf46CuXGN4gtcAgfaBlC2S/z8L7n/RZX3ksQsRDC83WyzBRUA1cyUgzbwiag82tjdnw== X-Received: by 2002:a6b:c544:: with SMTP id v65mr14685381iof.222.1552267865435; Sun, 10 Mar 2019 18:31:05 -0700 (PDT) Received: from localhost.localdomain (c-68-40-189-247.hsd1.mi.comcast.net. [68.40.189.247]) by smtp.gmail.com with ESMTPSA id p79sm7515011itb.7.2019.03.10.18.31.04 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Mar 2019 18:31:04 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 1/5] SUNRPC: Clean up Date: Sun, 10 Mar 2019 21:29:53 -0400 Message-Id: <20190311012957.3994-1-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Replace remaining callers of call_timeout() with rpc_check_timeout(). Signed-off-by: Trond Myklebust --- net/sunrpc/clnt.c | 47 ++++++++++++++--------------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 311029b7c33a..a0e7322fc171 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -70,7 +70,6 @@ static void call_status(struct rpc_task *task); static void call_transmit_status(struct rpc_task *task); static void call_refresh(struct rpc_task *task); static void call_refreshresult(struct rpc_task *task); -static void call_timeout(struct rpc_task *task); static void call_connect(struct rpc_task *task); static void call_connect_status(struct rpc_task *task); @@ -1908,7 +1907,8 @@ call_bind_status(struct rpc_task *task) retry_timeout: task->tk_status = 0; - task->tk_action = call_timeout; + task->tk_action = call_encode; + rpc_check_timeout(task); } /* @@ -2197,10 +2197,8 @@ call_status(struct rpc_task *task) case -EHOSTUNREACH: case -ENETUNREACH: case -EPERM: - if (RPC_IS_SOFTCONN(task)) { - rpc_exit(task, status); - break; - } + if (RPC_IS_SOFTCONN(task)) + goto out_exit; /* * Delay any retries for 3 seconds, then handle as if it * were a timeout. @@ -2208,7 +2206,6 @@ call_status(struct rpc_task *task) rpc_delay(task, 3*HZ); /* fall through */ case -ETIMEDOUT: - task->tk_action = call_timeout; break; case -ECONNREFUSED: case -ECONNRESET: @@ -2221,18 +2218,21 @@ call_status(struct rpc_task *task) case -EPIPE: case -ENOTCONN: case -EAGAIN: - task->tk_action = call_timeout; break; case -EIO: /* shutdown or soft timeout */ - rpc_exit(task, status); - break; + goto out_exit; default: if (clnt->cl_chatty) printk("%s: RPC call returned error %d\n", clnt->cl_program->name, -status); - rpc_exit(task, status); + goto out_exit; } + task->tk_action = call_encode; + rpc_check_timeout(task); + return; +out_exit: + rpc_exit(task, status); } static void @@ -2279,19 +2279,6 @@ rpc_check_timeout(struct rpc_task *task) rpcauth_invalcred(task); } -/* - * 6a. Handle RPC timeout - * We do not release the request slot, so we keep using the - * same XID for all retransmits. - */ -static void -call_timeout(struct rpc_task *task) -{ - task->tk_action = call_encode; - task->tk_status = 0; - rpc_check_timeout(task); -} - /* * 7. Decode the RPC reply */ @@ -2329,16 +2316,8 @@ call_decode(struct rpc_task *task) WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, sizeof(req->rq_rcv_buf)) != 0); - if (req->rq_rcv_buf.len < 12) { - if (!RPC_IS_SOFT(task)) { - task->tk_action = call_encode; - goto out_retry; - } - dprintk("RPC: %s: too small RPC reply size (%d bytes)\n", - clnt->cl_program->name, task->tk_status); - task->tk_action = call_timeout; + if (req->rq_rcv_buf.len < 12) goto out_retry; - } xdr_init_decode(&xdr, &req->rq_rcv_buf, req->rq_rcv_buf.head[0].iov_base, req); @@ -2361,6 +2340,8 @@ call_decode(struct rpc_task *task) xprt_conditional_disconnect(req->rq_xprt, req->rq_connect_cookie); } + task->tk_action = call_encode; + rpc_check_timeout(task); } } From patchwork Mon Mar 11 01:29:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10846551 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D5ABC922 for ; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BE0C828DCD for ; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BC95D28EDA; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6AE7E28DCD for ; Mon, 11 Mar 2019 01:31:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726901AbfCKBbH (ORCPT ); Sun, 10 Mar 2019 21:31:07 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:34714 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727017AbfCKBbH (ORCPT ); Sun, 10 Mar 2019 21:31:07 -0400 Received: by mail-io1-f67.google.com with SMTP id n11so1537819ioh.1 for ; Sun, 10 Mar 2019 18:31:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=sTQstrRQpEwoll4XVAuITGwDtJFVfhFLj4gsmO2N23Q=; b=gRyf1XJjTOvctGdimQWcGnj2RGyj/r48JlA5bjz+JoFJT7TlraGMz9wVFRe0r0Q0dd K21Jb7qFvxH3c0XVCCFmKV5DMbO/261wyp520AQIZmScpmknO7BgemqM/u8lm2JVR/pL 3BrWIe6ZWcxYSzkGvFfsJZq/sWXzlSDbk2XbslqcTbxJ/r561TjGR29AiAp9/v+hl5ua g7WNLPksEy2JCYr74rk+DDXhjHMQFcW35zFuHQ0IGIuI7dVGLXvdkQERl969BgC8LHf0 lsQsG0HxHuo1GIWnX15oBzhG2Gu6NJmi8zEzOXWruSMPp1zOodXhbUqHwfcy/9qL56jK OnxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sTQstrRQpEwoll4XVAuITGwDtJFVfhFLj4gsmO2N23Q=; b=ZmtQqCsxbpZO9lvc/KjVPYLqCoW0OqLtKEtDYLQrJ6gw5+pWyYf0HJooloyp6NvArv g7NBcnNmoIpy9KHjH9Ee7yZNoD8KZ6vOqv0QjCfafri4A5y/h+7gbqD/7z0lpuFZKDqt MY8TXyN5AyakzI1BXa33sa64DxW/ksr+c1YZbwmySGO3P8W1XXM3HwKOJ3/7ZujvFdIJ havtTit43vrmQY4oRB+VrJJWpZ0K+FU9jigVVUsojtbyiBQe3FiCue1+Kwl+ZtSKP18w fOUxy9ImZt9Y5u7I1UKVu1vbNH3aOyQzIdBSZfH/r0kPFukbAXjrBDzA5+Gh5dE6YcLV CyCw== X-Gm-Message-State: APjAAAXZq76/BH6f+d6+bQaz8EsqGt+nWGWYaWHNHwtzJIshtBfnipUX 77McbVuD12IUZOZYjHvClvbPMgo= X-Google-Smtp-Source: APXvYqxny1oRCjzF92BYQnF7FUxJVm4p6ClpwN0geyEadx2IHv3mAsgiOlv3dWOoykxy+jolXHfvCA== X-Received: by 2002:a6b:90e:: with SMTP id t14mr15437789ioi.19.1552267866162; Sun, 10 Mar 2019 18:31:06 -0700 (PDT) Received: from localhost.localdomain (c-68-40-189-247.hsd1.mi.comcast.net. [68.40.189.247]) by smtp.gmail.com with ESMTPSA id p79sm7515011itb.7.2019.03.10.18.31.05 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Mar 2019 18:31:05 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 2/5] SUNRPC: Remove redundant calls to RPC_IS_QUEUED() Date: Sun, 10 Mar 2019 21:29:54 -0400 Message-Id: <20190311012957.3994-2-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190311012957.3994-1-trond.myklebust@hammerspace.com> References: <20190311012957.3994-1-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The RPC task wakeup calls all check for RPC_IS_QUEUED() before taking any locks. In addition, rpc_exit() already calls rpc_wake_up_queued_task(). Signed-off-by: Trond Myklebust --- net/sunrpc/clnt.c | 3 --- net/sunrpc/sched.c | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index a0e7322fc171..9cf63e6339f4 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -833,9 +833,6 @@ void rpc_killall_tasks(struct rpc_clnt *clnt) if (!(rovr->tk_flags & RPC_TASK_KILLED)) { rovr->tk_flags |= RPC_TASK_KILLED; rpc_exit(rovr, -EIO); - if (RPC_IS_QUEUED(rovr)) - rpc_wake_up_queued_task(rovr->tk_waitqueue, - rovr); } } spin_unlock(&clnt->cl_lock); diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index f21557213a43..28956c70100a 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -785,8 +785,7 @@ void rpc_exit(struct rpc_task *task, int status) { task->tk_status = status; task->tk_action = rpc_exit_task; - if (RPC_IS_QUEUED(task)) - rpc_wake_up_queued_task(task->tk_waitqueue, task); + rpc_wake_up_queued_task(task->tk_waitqueue, task); } EXPORT_SYMBOL_GPL(rpc_exit); From patchwork Mon Mar 11 01:29:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10846553 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0AB511515 for ; Mon, 11 Mar 2019 01:31:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ED02628C86 for ; Mon, 11 Mar 2019 01:31:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EB92928D5B; Mon, 11 Mar 2019 01:31:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8EE3928DD1 for ; Mon, 11 Mar 2019 01:31:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727059AbfCKBbJ (ORCPT ); Sun, 10 Mar 2019 21:31:09 -0400 Received: from mail-io1-f43.google.com ([209.85.166.43]:45312 "EHLO mail-io1-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727017AbfCKBbI (ORCPT ); Sun, 10 Mar 2019 21:31:08 -0400 Received: by mail-io1-f43.google.com with SMTP id x9so2596245iog.12 for ; Sun, 10 Mar 2019 18:31:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=9iBB59kGK8qfP8sIMKf6cSe+ibEf9BWC8paPRH7y7Bg=; b=leTwuNzDGhHdg1VA3s8KvSqoNrhaDJdkJRtl0XvMlUedvMc89oT3CiL39vgUJH7Tpc fwoEbQYHWlNqkb+6dcV5E8ND23m4NCGc0GdRZOmkLvt9zi7wLh3Fqfehcp7U9s9J0Swd ZHGj4jr1k8dqKK8dwVROT7fe5MhzPdfHhw8HeFPPl/tW/SBEjLXLhfkUFWMSzjDW0rVf bqEiJSOWKHghfjrxQbWEkSzdD5h2p1/Ag2FR0l4WwPCKUbFz4uzmHHqVCq+8/Bud2iv1 wtZxYBYU+GTCeL8ODGdEuUGgiDlK4eFYcLoSLme70fExifEZ1JMRz1HNdKoNmkLFKOtX fRvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9iBB59kGK8qfP8sIMKf6cSe+ibEf9BWC8paPRH7y7Bg=; b=HhM0w0lXhiDoZpu6w44FugxVJYbRDDMjGCk+R0xgMFCCzXYegjHeyA3/Uz239fAiTO ymNWvW8qWLxQC9/clH9kVxsMmdvR7qfqXmnVg13xffWS3ayyfM8MrCibZ2vP1kMjIsLT /8KiAWo+JnjC+C6uCK3RKMkfaU00YI81i0K2Iy/8Qj1JEUM+gc//ZGU5SqDtaxYG317v lqrqeOIT9e3cfHMmNH/kBogvPyT+yIbpF5VxSQnxlATZ+A71rr2lYP6Ji4t9N27wQSU9 1LV6TXJp7peP6JuYUdfZKcTJrnffa2fjpbUnuJ0S/4YlPYmwQ8Mf54hupB64pVbiIa3f QPNg== X-Gm-Message-State: APjAAAXk0KweoDJlxq2IDHSJfO0rQQg1h5LnArNK6sjTDXzDb2DP3oVl tD4XZ3/Z4yKwlbQSLsQy6kHO/ug= X-Google-Smtp-Source: APXvYqx/ZFJOkJ952P3sCU9LnzWusYh4UCaQzP8LCyXMZwKb/kqs4L29MVj/MzYPp5n94AP0CI01hw== X-Received: by 2002:a6b:6214:: with SMTP id f20mr14507666iog.213.1552267866959; Sun, 10 Mar 2019 18:31:06 -0700 (PDT) Received: from localhost.localdomain (c-68-40-189-247.hsd1.mi.comcast.net. [68.40.189.247]) by smtp.gmail.com with ESMTPSA id p79sm7515011itb.7.2019.03.10.18.31.06 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Mar 2019 18:31:06 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 3/5] SUNRPC: Check whether the task was transmitted before rebind/reconnect Date: Sun, 10 Mar 2019 21:29:55 -0400 Message-Id: <20190311012957.3994-3-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190311012957.3994-2-trond.myklebust@hammerspace.com> References: <20190311012957.3994-1-trond.myklebust@hammerspace.com> <20190311012957.3994-2-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Before initiating transport actions that require putting the task to sleep, such as rebinding or reconnecting, we should check whether or not the task was already transmitted. Signed-off-by: Trond Myklebust --- net/sunrpc/clnt.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 9cf63e6339f4..67c955d8b21b 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1811,6 +1811,24 @@ call_encode(struct rpc_task *task) task->tk_action = call_connect; } +/* + * Helpers to check if the task was already transmitted, and + * to take action when that is the case. + */ +static bool +rpc_task_transmitted(struct rpc_task *task) +{ + return !test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate); +} + +static void +rpc_task_handle_transmitted(struct rpc_task *task) +{ + xprt_end_transmit(task); + task->tk_action = call_transmit_status; + call_transmit_status(task); +} + /* * 4. Get the server port number if not yet set */ @@ -1819,6 +1837,11 @@ call_bind(struct rpc_task *task) { struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; + if (rpc_task_transmitted(task)) { + rpc_task_handle_transmitted(task); + return; + } + dprint_status(task); task->tk_action = call_connect; @@ -1837,6 +1860,11 @@ call_bind_status(struct rpc_task *task) { int status = -EIO; + if (rpc_task_transmitted(task)) { + rpc_task_handle_transmitted(task); + return; + } + if (task->tk_status >= 0) { dprint_status(task); task->tk_status = 0; @@ -1916,6 +1944,11 @@ call_connect(struct rpc_task *task) { struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; + if (rpc_task_transmitted(task)) { + rpc_task_handle_transmitted(task); + return; + } + dprintk("RPC: %5u call_connect xprt %p %s connected\n", task->tk_pid, xprt, (xprt_connected(xprt) ? "is" : "is not")); @@ -1942,10 +1975,8 @@ call_connect_status(struct rpc_task *task) struct rpc_clnt *clnt = task->tk_client; int status = task->tk_status; - /* Check if the task was already transmitted */ - if (!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { - xprt_end_transmit(task); - task->tk_action = call_transmit_status; + if (rpc_task_transmitted(task)) { + rpc_task_handle_transmitted(task); return; } @@ -2001,6 +2032,11 @@ call_connect_status(struct rpc_task *task) static void call_transmit(struct rpc_task *task) { + if (rpc_task_transmitted(task)) { + rpc_task_handle_transmitted(task); + return; + } + dprint_status(task); task->tk_action = call_transmit_status; From patchwork Mon Mar 11 01:29:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10846555 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A062C1515 for ; Mon, 11 Mar 2019 01:31:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8992528DD2 for ; Mon, 11 Mar 2019 01:31:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 85F9528D9B; Mon, 11 Mar 2019 01:31:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6C39C28EEA for ; Mon, 11 Mar 2019 01:31:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727017AbfCKBbJ (ORCPT ); Sun, 10 Mar 2019 21:31:09 -0400 Received: from mail-io1-f44.google.com ([209.85.166.44]:44035 "EHLO mail-io1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727056AbfCKBbJ (ORCPT ); Sun, 10 Mar 2019 21:31:09 -0400 Received: by mail-io1-f44.google.com with SMTP id u12so2594713iop.11 for ; Sun, 10 Mar 2019 18:31:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=KIMqOEZXsaH/c96izyKkwDtA5GObFaXLlPgQve2hVi4=; b=jYqwExmq5eNXAdE9IMde/mqPP4Z2EyaHqTweaj6IXwO4hsL77Sp9QM1thYpqL8F7TQ 8ZMIoos4omrkPoy9sPDsaW66N+YwyNe1sJB9kEoLYMf7SbLy7F5ccfUlp6cQ0uCAhxjs 8FTLNy6doWkd3/ntBuYlabx+EVmTHAMdA1vRI500UoFg3zr6ujDrecBhOYLTlA53HRYg XaU3vXVh9h21rs0ubgszk1ybFEpoPCGXS4Cv1SFfPGR/yk/1lrtsSBFhRQU4jGZXIF0y KU5ZH51l5anBIhUdH/9ho9PK+dpuBl8WjsnxmZZUFxi1ulQN8YID4SEP+JswYKvotWTl bvTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KIMqOEZXsaH/c96izyKkwDtA5GObFaXLlPgQve2hVi4=; b=JJGjupvMeC3HaD7AOCcG/v+epd9kn2it3wRms6DYuC5nt456CcSfiL/njkxwpAqU4T IeW8DXuSsi7PSdJRHhllf8EufBBnn2qdX8AP/b8yr/TtTs2ZGuMNuPniT5HmRLbdt2Y1 d8daNhrNRQMClk2t7fQHgO2RJ4Xh6x5jTDh6j7S8wnuVmYouI1yYAQqsuX+XYFhbx24t cFE9cCdBQEyNu01ERiYHA3Ebks8DayYB4qmsQOZSewue6HNhxagZRvuKwkwOcKSbxR0S oEKoaTmQs+RbmHfiEnxdOGzD3xCVX4GjPP3kvZrMjwQVkfnSBqbpOKK/mackFV2h8g1Q HlvA== X-Gm-Message-State: APjAAAUiJML3GQO4EHS8fAX2MIKCGlAehPuTbAr1HF5+toug+TgFeFNN StIMYvZcnn0+NvxqLMnq4CZewUU= X-Google-Smtp-Source: APXvYqx4zQEiNbdbYnfh20jZRccDCiD75wh1go9+/We4nGqkk1IxrPW0rm4X1HVFYWbm+ofs+Qmnlg== X-Received: by 2002:a6b:7708:: with SMTP id n8mr14075993iom.141.1552267867985; Sun, 10 Mar 2019 18:31:07 -0700 (PDT) Received: from localhost.localdomain (c-68-40-189-247.hsd1.mi.comcast.net. [68.40.189.247]) by smtp.gmail.com with ESMTPSA id p79sm7515011itb.7.2019.03.10.18.31.07 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Mar 2019 18:31:07 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 4/5] SUNRPC: Micro-optimise when the task is known not to be sleeping Date: Sun, 10 Mar 2019 21:29:56 -0400 Message-Id: <20190311012957.3994-4-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190311012957.3994-3-trond.myklebust@hammerspace.com> References: <20190311012957.3994-1-trond.myklebust@hammerspace.com> <20190311012957.3994-2-trond.myklebust@hammerspace.com> <20190311012957.3994-3-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In cases where we know the task is not sleeping, try to optimise away the indirect call to task->tk_action() by replacing it with a direct call. Only change tail calls, to allow gcc to perform tail call elimination. Signed-off-by: Trond Myklebust --- include/linux/sunrpc/sched.h | 8 +++ net/sunrpc/clnt.c | 99 +++++++++++++++++++++++------------- 2 files changed, 73 insertions(+), 34 deletions(-) diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 52d41d0c1ae1..ec861cd0cfe8 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -304,4 +304,12 @@ 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_ */ diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 67c955d8b21b..498dd6ad5bc5 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1540,6 +1540,7 @@ call_start(struct rpc_task *task) clnt->cl_stats->rpccnt++; task->tk_action = call_reserve; rpc_task_set_transport(task, clnt); + call_reserve(task); } /* @@ -1553,6 +1554,9 @@ 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); @@ -1575,6 +1579,7 @@ call_reserveresult(struct rpc_task *task) if (status >= 0) { if (task->tk_rqstp) { task->tk_action = call_refresh; + call_refresh(task); return; } @@ -1600,6 +1605,7 @@ 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; @@ -1622,6 +1628,9 @@ 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); } /* @@ -1636,6 +1645,9 @@ 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); } /* @@ -1654,6 +1666,7 @@ 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 @@ -1672,6 +1685,7 @@ 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", @@ -1697,8 +1711,10 @@ call_allocate(struct rpc_task *task) task->tk_status = 0; task->tk_action = call_encode; - if (req->rq_buffer) + if (req->rq_buffer) { + call_encode(task); return; + } if (proc->p_proc != 0) { BUG_ON(proc->p_arglen == 0); @@ -1719,8 +1735,12 @@ call_allocate(struct rpc_task *task) status = xprt->ops->buf_alloc(task); xprt_inject_disconnect(xprt); - if (status == 0) + if (status == 0) { + if (rpc_task_need_resched(task)) + return; + call_encode(task); return; + } if (status != -ENOMEM) { rpc_exit(task, status); return; @@ -1803,12 +1823,8 @@ call_encode(struct rpc_task *task) xprt_request_enqueue_receive(task); xprt_request_enqueue_transmit(task); out: - 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; + task->tk_action = call_bind; + call_bind(task); } /* @@ -1842,14 +1858,17 @@ call_bind(struct rpc_task *task) return; } + if (xprt_bound(xprt)) { + task->tk_action = call_connect; + call_connect(task); + return; + } + dprint_status(task); - task->tk_action = call_connect; - if (!xprt_bound(xprt)) { - task->tk_action = call_bind_status; - task->tk_timeout = xprt->bind_timeout; - xprt->ops->rpcbind(task); - } + task->tk_action = call_bind_status; + task->tk_timeout = xprt->bind_timeout; + xprt->ops->rpcbind(task); } /* @@ -1869,6 +1888,7 @@ call_bind_status(struct rpc_task *task) dprint_status(task); task->tk_status = 0; task->tk_action = call_connect; + call_connect(task); return; } @@ -1949,21 +1969,24 @@ call_connect(struct rpc_task *task) return; } + if (xprt_connected(xprt)) { + task->tk_action = call_transmit; + call_transmit(task); + return; + } + dprintk("RPC: %5u call_connect xprt %p %s connected\n", task->tk_pid, xprt, (xprt_connected(xprt) ? "is" : "is not")); - task->tk_action = call_transmit; - if (!xprt_connected(xprt)) { - task->tk_action = call_connect_status; - if (task->tk_status < 0) - return; - if (task->tk_flags & RPC_TASK_NOCONNECT) { - rpc_exit(task, -ENOTCONN); - return; - } - xprt_connect(task); + task->tk_action = call_connect_status; + if (task->tk_status < 0) + return; + if (task->tk_flags & RPC_TASK_NOCONNECT) { + rpc_exit(task, -ENOTCONN); + return; } + xprt_connect(task); } /* @@ -2016,6 +2039,7 @@ 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); @@ -2040,19 +2064,20 @@ call_transmit(struct rpc_task *task) dprint_status(task); task->tk_action = call_transmit_status; + if (!xprt_prepare_transmit(task)) + return; + task->tk_status = 0; if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { - if (!xprt_prepare_transmit(task)) + if (!xprt_connected(task->tk_xprt)) { + task->tk_status = -ENOTCONN; return; - task->tk_status = 0; - if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { - if (!xprt_connected(task->tk_xprt)) { - task->tk_status = -ENOTCONN; - return; - } - xprt_transmit(task); } + xprt_transmit(task); } xprt_end_transmit(task); + if (rpc_task_need_resched(task)) + return; + call_transmit_status(task); } /* @@ -2067,8 +2092,12 @@ call_transmit_status(struct rpc_task *task) * Common case: success. Force the compiler to put this * test first. */ - if (task->tk_status == 0) { - xprt_request_wait_receive(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; } @@ -2129,6 +2158,7 @@ call_bc_encode(struct rpc_task *task) { xprt_request_enqueue_transmit(task); task->tk_action = call_bc_transmit; + call_bc_transmit(task); } /* @@ -2219,6 +2249,7 @@ call_status(struct rpc_task *task) status = task->tk_status; if (status >= 0) { task->tk_action = call_decode; + call_decode(task); return; } From patchwork Mon Mar 11 01:29:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10846557 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 59B8D922 for ; Mon, 11 Mar 2019 01:31:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46E1E28DB4 for ; Mon, 11 Mar 2019 01:31:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 453E928D28; Mon, 11 Mar 2019 01:31:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EACB028DDB for ; Mon, 11 Mar 2019 01:31:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726916AbfCKBbL (ORCPT ); Sun, 10 Mar 2019 21:31:11 -0400 Received: from mail-io1-f47.google.com ([209.85.166.47]:40610 "EHLO mail-io1-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727056AbfCKBbL (ORCPT ); Sun, 10 Mar 2019 21:31:11 -0400 Received: by mail-io1-f47.google.com with SMTP id p17so2603848iol.7 for ; Sun, 10 Mar 2019 18:31:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=7XDzLdk6wYYHBUZn6T3GDQV3N0qgM4JOMSW85fV9bEw=; b=rpQIoFBdCQN3EypyT0BvhqisgJOZMhVTi7vR6pUPeNCMvS5+7xSuL2TufabjKjNMTn 7V/+fKPU6t3QXo9wsYxC1XGj5ZoC+CdZiBnrpmncVoUMcirvA3xL5K/5mvZWYTM27JeR ovHGLi2kfHH25GJfweQ+b08V4gymFC/YL/+dNY6O6lvtpJZkF4BOW85OPdlT7OYQJjAZ JvSLhx/fvKd2eJPV40LzaMdxc+YhWcT4Vcieyk9zUVlhQV5nwMX+r3upsp6Ec19OE7QS 77PiqBIdaju4BF3V6xKDcazbaMCAyt37MvIJc6B3bPvz5LqZGFTUqTsjs22lfxmrf74w K/Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7XDzLdk6wYYHBUZn6T3GDQV3N0qgM4JOMSW85fV9bEw=; b=uHxfI6/yTbXQ99JxhRoHhylQiwcvlVdcYSrOItFTmB66TntAt3sufRVCayyqsIuri9 TaSiUXlYHpLZqkDKy/Mgt7SFc1oEvlW/YUh3pdKngjE5YQ00lDgavi47AnlQa2BSKZ4c j+ZaAe4FvcouNZmTQuuvn1o42O4HrQr3WJG5hUwODTJXsU+1maf7zGbMdvBYtVcgOpnl tiGJcRKKXU7nYBcz1RbGDOvX7xcMqSnftrPJ2s2uLJ3wAWSIBCVyLrcIUBRrFZbTNT+W qqFR+goAvKMVtKsJWiE1Oy2uRugAfR16JrNRibGqhDkzWvJePpa0xzTYA1Ta17sFewju GkgQ== X-Gm-Message-State: APjAAAVW8KJEowVbluco/cf/Irl/2AE70W532ngoYdHjkeEkhpWDw3Yt SVKIldKgOKUXYTgH3H/ar5o525A= X-Google-Smtp-Source: APXvYqzjH8tj56BkqGoxySzPZIrvkd7jMphPz+4vQtb0b1frKnKFPXzjB4+3C5qr0kIG8Uq+G60tYg== X-Received: by 2002:a6b:7219:: with SMTP id n25mr6872288ioc.117.1552267869492; Sun, 10 Mar 2019 18:31:09 -0700 (PDT) Received: from localhost.localdomain (c-68-40-189-247.hsd1.mi.comcast.net. [68.40.189.247]) by smtp.gmail.com with ESMTPSA id p79sm7515011itb.7.2019.03.10.18.31.08 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 10 Mar 2019 18:31:08 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 5/5] SUNRPC: Take the transport send lock before binding+connecting Date: Sun, 10 Mar 2019 21:29:57 -0400 Message-Id: <20190311012957.3994-5-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190311012957.3994-4-trond.myklebust@hammerspace.com> References: <20190311012957.3994-1-trond.myklebust@hammerspace.com> <20190311012957.3994-2-trond.myklebust@hammerspace.com> <20190311012957.3994-3-trond.myklebust@hammerspace.com> <20190311012957.3994-4-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Before trying to bind a port, ensure we grab the send lock to ensure that we don't change the port while another task is busy transmitting requests. The connect code already takes the send lock in xprt_connect(), but it is harmless to take it before that. Signed-off-by: Trond Myklebust --- net/sunrpc/clnt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 498dd6ad5bc5..4216fe33204a 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1867,6 +1867,9 @@ call_bind(struct rpc_task *task) dprint_status(task); task->tk_action = call_bind_status; + if (!xprt_prepare_transmit(task)) + return; + task->tk_timeout = xprt->bind_timeout; xprt->ops->rpcbind(task); } @@ -1911,6 +1914,8 @@ call_bind_status(struct rpc_task *task) task->tk_rebind_retry--; rpc_delay(task, 3*HZ); goto retry_timeout; + case -EAGAIN: + goto retry_timeout; case -ETIMEDOUT: dprintk("RPC: %5u rpcbind request timed out\n", task->tk_pid); @@ -1952,7 +1957,7 @@ call_bind_status(struct rpc_task *task) retry_timeout: task->tk_status = 0; - task->tk_action = call_encode; + task->tk_action = call_bind; rpc_check_timeout(task); } @@ -1986,6 +1991,8 @@ call_connect(struct rpc_task *task) rpc_exit(task, -ENOTCONN); return; } + if (!xprt_prepare_transmit(task)) + return; xprt_connect(task); }