From patchwork Wed May 4 14:53:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever III X-Patchwork-Id: 9015401 Return-Path: X-Original-To: patchwork-linux-rdma@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0A0239F30C for ; Wed, 4 May 2016 14:53:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1AC44203AA for ; Wed, 4 May 2016 14:53:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 31006203AB for ; Wed, 4 May 2016 14:53:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751196AbcEDOxJ (ORCPT ); Wed, 4 May 2016 10:53:09 -0400 Received: from mail-io0-f169.google.com ([209.85.223.169]:35996 "EHLO mail-io0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751161AbcEDOxI (ORCPT ); Wed, 4 May 2016 10:53:08 -0400 Received: by mail-io0-f169.google.com with SMTP id u185so64608019iod.3; Wed, 04 May 2016 07:53:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=OogzsVSmjU/lIXHO4OKwPcNyWZKD/WeeIdqXjTXE8LI=; b=M6bumgnQXDBjS4zN0WAp5J1Il44t5kYa5v0AY+igX88NpY9RkIlX9DUWnLBN7Ybbtr C/kommq78hVQxN2V06yMpyiYDTZ8AqmRd7aSJn+QZQWRl2sJPsSPsp2CE4QL0REkuvPp WZXbcmYxbR/36tlrdg4038aeUhxVL52h89POnP9CneAp5RdAgc+VipWN8F6Q5J0jGyUc TpZFGaXGRrPew+nirk4nZTYUCVX9qRTWikghAhw8iqlj7QoE4gPq8YHrwIKKzoh7kkjM EXN+qoi6E9I9o6KcVLx4ldf7rlRvEePp4QQ42xWaoDeCOdqeDbApSqF6KLHsxp9OdvOx MB0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:from:to:cc:date:message-id :in-reply-to:references:user-agent:mime-version :content-transfer-encoding; bh=OogzsVSmjU/lIXHO4OKwPcNyWZKD/WeeIdqXjTXE8LI=; b=Z35AZBcI605J3NCfMufZmCZ+uaP86G0qBPKX9NOUIm2TVIaocTTAEg6zMy7MSYYH4Y pWTi9O8h2vXmU40cn55mvpq721rYx9S/P3xO8WYD9ztE4M/wTk28uKG4BbEhC+g1M6gj aZ1zwT2yKS74YvXZmsop6SBILCh2ywEo23KFqtieD8PJHZAu27qdDBVOHSDraDG5onNA 97yhmcgpeiQaJ5bneonD9+EKKEWQbVnFJVZCXjtBe/RZWPX3fnwymDvKegF8Mi6mdZlB l+NuXDff5TCrsb5cerVO38Fh1SfzBhJkFFXUj+cPGF4pHSnXQM4MvHQHw0U7GR8BwgzC N2HQ== X-Gm-Message-State: AOPr4FWrvFILqBaB25jJb9A3xR01eeFVhW1NeCDMcMY3yw3cSCZ/JJzmjJuxont6bZXLHQ== X-Received: by 10.107.174.205 with SMTP id n74mr11028797ioo.96.1462373587014; Wed, 04 May 2016 07:53:07 -0700 (PDT) Received: from klimt.1015granger.net ([2604:8800:100:81fc:ec4:7aff:fe6c:6aa0]) by smtp.gmail.com with ESMTPSA id k3sm1803430igz.2.2016.05.04.07.53.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 May 2016 07:53:06 -0700 (PDT) Subject: [PATCH v2 3/9] svcrdma: svc_rdma_put_context() is invoked twice in Send error path From: Chuck Lever To: bfields@fieldses.org Cc: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Date: Wed, 04 May 2016 10:53:05 -0400 Message-ID: <20160504145305.6602.70505.stgit@klimt.1015granger.net> In-Reply-To: <20160504144730.6602.89073.stgit@klimt.1015granger.net> References: <20160504144730.6602.89073.stgit@klimt.1015granger.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Get a fresh op_ctxt in send_reply() instead of in svc_rdma_sendto(). This ensures that svc_rdma_put_context() is invoked only once if send_reply() fails. Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/svc_rdma_sendto.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c index 4f1b1c4..54d53330 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c @@ -463,25 +463,21 @@ static int send_reply(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp, struct page *page, struct rpcrdma_msg *rdma_resp, - struct svc_rdma_op_ctxt *ctxt, struct svc_rdma_req_map *vec, int byte_count) { + struct svc_rdma_op_ctxt *ctxt; struct ib_send_wr send_wr; u32 xdr_off; int sge_no; int sge_bytes; int page_no; int pages; - int ret; - - ret = svc_rdma_repost_recv(rdma, GFP_KERNEL); - if (ret) { - svc_rdma_put_context(ctxt, 0); - return -ENOTCONN; - } + int ret = -EIO; /* Prepare the context */ + ctxt = svc_rdma_get_context(rdma); + ctxt->direction = DMA_TO_DEVICE; ctxt->pages[0] = page; ctxt->count = 1; @@ -565,8 +561,7 @@ static int send_reply(struct svcxprt_rdma *rdma, err: svc_rdma_unmap_dma(ctxt); svc_rdma_put_context(ctxt, 1); - pr_err("svcrdma: failed to send reply, rc=%d\n", ret); - return -EIO; + return ret; } void svc_rdma_prep_reply_hdr(struct svc_rqst *rqstp) @@ -585,7 +580,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) int ret; int inline_bytes; struct page *res_page; - struct svc_rdma_op_ctxt *ctxt; struct svc_rdma_req_map *vec; dprintk("svcrdma: sending response for rqstp=%p\n", rqstp); @@ -598,8 +592,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) rp_ary = svc_rdma_get_reply_array(rdma_argp, wr_ary); /* Build an req vec for the XDR */ - ctxt = svc_rdma_get_context(rdma); - ctxt->direction = DMA_TO_DEVICE; vec = svc_rdma_get_req_map(rdma); ret = svc_rdma_map_xdr(rdma, &rqstp->rq_res, vec, wr_ary != NULL); if (ret) @@ -635,7 +627,12 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) inline_bytes -= ret; } - ret = send_reply(rdma, rqstp, res_page, rdma_resp, ctxt, vec, + /* Post a fresh Receive buffer _before_ sending the reply */ + ret = svc_rdma_post_recv(rdma, GFP_KERNEL); + if (ret) + goto err1; + + ret = send_reply(rdma, rqstp, res_page, rdma_resp, vec, inline_bytes); if (ret < 0) goto err1; @@ -648,7 +645,8 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) put_page(res_page); err0: svc_rdma_put_req_map(rdma, vec); - svc_rdma_put_context(ctxt, 0); + pr_err("svcrdma: Could not send reply, err=%d. Closing transport.\n", + ret); set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags); return -ENOTCONN; }