From patchwork Thu Mar 16 15:54:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 9628801 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 965B56048C for ; Thu, 16 Mar 2017 16:00:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8693128528 for ; Thu, 16 Mar 2017 16:00:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7907728676; Thu, 16 Mar 2017 16:00:56 +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=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 02BA028528 for ; Thu, 16 Mar 2017 16:00:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752131AbdCPQAz (ORCPT ); Thu, 16 Mar 2017 12:00:55 -0400 Received: from mail-it0-f68.google.com ([209.85.214.68]:35568 "EHLO mail-it0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751677AbdCPQAy (ORCPT ); Thu, 16 Mar 2017 12:00:54 -0400 Received: by mail-it0-f68.google.com with SMTP id y18so2437560itc.2; Thu, 16 Mar 2017 09:00:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:from:to:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=99jZv09lmUR5ablVFLqz1abYybS19a3soZINMkAj1Fw=; b=Bj9s4anbJXOgH0/IUvDbCxnMeH5O8C9uAJZyt4Cuph+WpXM/ZxuNdtaNQ/xn4YDgj4 NkfHlg8HnLUiQT9hU6rEX9rZjX507tZyf+VnO4S9FOcax/ooukY3wAdi8WhQs7RuQWnf nrX6JDqkW9cJs7VDjO3tfYVU3gitMS6rNoc6EUoo//uhMtb+7lpBhSyy4hF28HsHNMW8 4OpbHcvvNEIl9tx0a4PWQN7YdhMEZD9uMNa3ylxKQwbObJxMPnZavTlOwAaOrWXMYft4 eTm2qEnOqiB+yhUL/09vm/cAvwQf9hop7XUxvZa5zE27/vyBFlgCO9bsYByiIubNszGo q3qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:from:to:date:message-id :in-reply-to:references:user-agent:mime-version :content-transfer-encoding; bh=99jZv09lmUR5ablVFLqz1abYybS19a3soZINMkAj1Fw=; b=MJD5j3rW8bCtQbJfjD3KPmaPhJRtrpyG2+PlPeDQiGF9dYU3Wz0ANucvow8M2EjvE9 45s1JRo0YMFrB5iAaepogxQWFd65PXgfmZlCCzHcYHHfp/ShIgAsGWDdFPWvU6Dnfka+ 60mNYsuCVtuuSjSk/1xuqciD+7jlh7MHen9wgvPoNfR3nOdjG7IryeOkaTt7M37X/07P fp6FN4NiWXVpP3Dg/GQ4llQ5849/Iwre3XCIll86LwGleYfFhQ4xrV3cDwXXDGNS4bSR hghVWRYhKMMLqFHe3RsA7j15zzVF4BWoHiaHvVBH2mzY5ijfE7PGDM9c1CSN9Aey4NKA tE7A== X-Gm-Message-State: AFeK/H2BUOZhaMvw9i5AulGu8LIumVIuHY59P+yEJL0inaoMnP07J35tOeJigX+Q9rpxWg== X-Received: by 10.36.60.76 with SMTP id m73mr4426581ita.118.1489679660581; Thu, 16 Mar 2017 08:54:20 -0700 (PDT) Received: from klimt.1015granger.net ([2604:8800:100:81fc:ec4:7aff:fe6c:6aa0]) by smtp.gmail.com with ESMTPSA id m63sm382235ioa.15.2017.03.16.08.54.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Mar 2017 08:54:20 -0700 (PDT) Subject: [PATCH v1 14/14] svcrdma: Clean up svc_rdma_post_recv() error handling From: Chuck Lever To: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Date: Thu, 16 Mar 2017 11:54:19 -0400 Message-ID: <20170316155419.4482.21602.stgit@klimt.1015granger.net> In-Reply-To: <20170316154132.4482.56769.stgit@klimt.1015granger.net> References: <20170316154132.4482.56769.stgit@klimt.1015granger.net> User-Agent: StGit/0.17.1-dirty 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 Distinguish and document failure modes. Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/svc_rdma_transport.c | 66 +++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 19 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" 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_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 9176a35..95af982 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -486,6 +486,17 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, return cma_xprt; } +/** + * svc_rdma_post_recv - Post one Receive buffer + * @xprt: controlling transport + * @flags: memory allocation flags + * + * Returns: + * %0 if Receive was posted successfully, + * %-EINVAL if arguments are not correct, + * %-ENOMEM if a resource shortage occurred, + * %-EIO if DMA mapping failed. + */ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) { struct ib_recv_wr recv_wr, *bad_recv_wr; @@ -501,14 +512,14 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) ctxt->direction = DMA_FROM_DEVICE; ctxt->cqe.done = svc_rdma_wc_receive; for (sge_no = 0; buflen < xprt->sc_max_req_size; sge_no++) { - if (sge_no >= xprt->sc_max_sge) { - pr_err("svcrdma: Too many sges (%d)\n", sge_no); - goto err_put_ctxt; - } + if (sge_no >= xprt->sc_max_sge) + goto err_sges; + ret = -ENOMEM; page = alloc_page(flags); if (!page) goto err_put_ctxt; ctxt->pages[sge_no] = page; + ret = -EIO; pa = ib_dma_map_page(xprt->sc_cm_id->device, page, 0, PAGE_SIZE, DMA_FROM_DEVICE); @@ -528,32 +539,49 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) svc_xprt_get(&xprt->sc_xprt); ret = ib_post_recv(xprt->sc_qp, &recv_wr, &bad_recv_wr); - if (ret) { - svc_rdma_unmap_dma(ctxt); - svc_rdma_put_context(ctxt, 1); - svc_xprt_put(&xprt->sc_xprt); - } - return ret; + if (ret) + goto err_post; + return 0; + + err_sges: + ret = -EINVAL; + pr_err("svcrdma: Too many sges (%d)\n", sge_no); err_put_ctxt: svc_rdma_unmap_dma(ctxt); svc_rdma_put_context(ctxt, 1); - return -ENOMEM; + return ret; + + err_post: + svc_rdma_unmap_dma(ctxt); + svc_rdma_put_context(ctxt, 1); + svc_xprt_put(&xprt->sc_xprt); + return ret; } +/** + * svc_rdma_repost_recv - Post one Receive buffer, disconnect on failure + * @xprt: controlling transport + * @flags: memory allocation flags + * + * Returns: + * %0 if Receive was posted successfully, + * %-ENOTCONN if posting failed (connection is lost). + */ int svc_rdma_repost_recv(struct svcxprt_rdma *xprt, gfp_t flags) { int ret = 0; ret = svc_rdma_post_recv(xprt, flags); - if (ret) { - pr_err("svcrdma: could not post a receive buffer, err=%d.\n", - ret); - pr_err("svcrdma: closing transport %p.\n", xprt); - set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); - ret = -ENOTCONN; - } - return ret; + if (ret) + goto err_disconnect; + return 0; + + err_disconnect: + pr_err("svcrdma: could not post a receive buffer, err=%d.\n", ret); + pr_err("svcrdma: closing transport %p.\n", xprt); + set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); + return -ENOTCONN; } static void