From patchwork Fri Oct 20 14:47:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 10020447 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 59358602CB for ; Fri, 20 Oct 2017 14:48:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 377B428EC2 for ; Fri, 20 Oct 2017 14:48:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2BEC128ED3; Fri, 20 Oct 2017 14:48:03 +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 7B13D28EC2 for ; Fri, 20 Oct 2017 14:48:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751871AbdJTOsA (ORCPT ); Fri, 20 Oct 2017 10:48:00 -0400 Received: from mail-it0-f68.google.com ([209.85.214.68]:54797 "EHLO mail-it0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751858AbdJTOr5 (ORCPT ); Fri, 20 Oct 2017 10:47:57 -0400 Received: by mail-it0-f68.google.com with SMTP id 72so13685749itk.3; Fri, 20 Oct 2017 07:47:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=KtMjPmCwp/XewJ/W82nhiWfw9bxZI5m0otn5/fTrOjA=; b=XH/qJeNaTTZaL7+hTR/TYGrJc6wvb+eWklsZWIqbRzy6NMVp2lNsXXdXQMZz58ETp9 dkUySJ16hKqxo6Ltfr0BB2NpA9z7EITsnbredfLEY4TQCtkPf0UmIGSuBUijMPGGyP8G 70cL5CkUOgtx7VhnvYhK1hcSAY9/rb61aC9Io4SIIAcrbKFLJB0wiGZjMIh+XiX2JlJE NBb6bgvazKZ8XRh9Z7D0HEEOPstWBFZDpoMTYYJoyrJCXJZqIr4gLrn9C1KLiyORDj6G IN1ZC3TpSz3+mk1/3INg7Ik6bS4BhCFg/4cd2SqOUgMxYI+kcXm72tuDIdHmGVizGSbb NMyA== 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:cc:date:message-id :in-reply-to:references:user-agent:mime-version :content-transfer-encoding; bh=KtMjPmCwp/XewJ/W82nhiWfw9bxZI5m0otn5/fTrOjA=; b=OXzjWqrTHTMHHi0PWW+oF6eU2TFWytneJsGaaFWuaB+yAl0kNuiXhFepzeZX9Ui9bF juEgKlFDHXwRiqOBReThVHldwiY5EXaIxE5H/iqfRmuG4WooWSubLQFVat/KlPD/xsBM hZKCogfcboLiP3hBucUxyg9vTyJJDKEt1pC0Ob5MijcaJ7uxfwvZ+IJrpN29g8RLHPaA fdR/Gil9dLvt2mEYxUwGx2MoySkboGtDynfbXN1IaNZNRkBSMQF2C331qOAlyBaAMs80 UPUj8ASjLBU8WfCcWF8q6PY+mImHRs9vU8HsMCew/PWIiEDy7YXrtmqaCtY9Qj6tGKU9 JR7g== X-Gm-Message-State: AMCzsaVPz/0iJdzY3V1I++wY46P20BL14sMwRZdTg+jCnZXEOHcibjZQ 7TuE84MqhFR7mbBi3Xv0bp9IIw== X-Google-Smtp-Source: ABhQp+RrGmdErz5Ed0aTNZgcFYG0FVvErUfCRaBa1KMeNfkPp5xNGDVhlTMe/ZM2pZH+hge4pAM/Hg== X-Received: by 10.36.64.19 with SMTP id n19mr2610496ita.119.1508510876815; Fri, 20 Oct 2017 07:47:56 -0700 (PDT) Received: from manet.1015granger.net (c-68-46-169-226.hsd1.mi.comcast.net. [68.46.169.226]) by smtp.gmail.com with ESMTPSA id i201sm574512ita.32.2017.10.20.07.47.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Oct 2017 07:47:56 -0700 (PDT) Subject: [PATCH 3/9] xprtrdma: Change return value of rpcrdma_prepare_send_sges() From: Chuck Lever To: anna.schumaker@netapp.com Cc: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Date: Fri, 20 Oct 2017 10:47:55 -0400 Message-ID: <20171020144755.14869.64770.stgit@manet.1015granger.net> In-Reply-To: <20171020143635.14869.15714.stgit@manet.1015granger.net> References: <20171020143635.14869.15714.stgit@manet.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 Clean up: Make rpcrdma_prepare_send_sges() return a negative errno instead of a bool. Soon callers will want distinct treatments of different types of failures. Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/backchannel.c | 4 +-- net/sunrpc/xprtrdma/rpc_rdma.c | 52 +++++++++++++++++++++++-------------- net/sunrpc/xprtrdma/xprt_rdma.h | 6 +++- 3 files changed, 38 insertions(+), 24 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/backchannel.c b/net/sunrpc/xprtrdma/backchannel.c index d31d0ac..f0d5998 100644 --- a/net/sunrpc/xprtrdma/backchannel.c +++ b/net/sunrpc/xprtrdma/backchannel.c @@ -222,8 +222,8 @@ int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst) *p++ = xdr_zero; *p = xdr_zero; - if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, RPCRDMA_HDRLEN_MIN, - &rqst->rq_snd_buf, rpcrdma_noch)) + if (rpcrdma_prepare_send_sges(r_xprt, req, RPCRDMA_HDRLEN_MIN, + &rqst->rq_snd_buf, rpcrdma_noch)) return -EIO; return 0; } diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index 4f6c539..e3ece98 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c @@ -544,7 +544,7 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, if (unlikely(!rpcrdma_regbuf_is_mapped(rb))) { if (!__rpcrdma_dma_map_regbuf(ia, rb)) - return false; + goto out_regbuf; sge->addr = rdmab_addr(rb); sge->lkey = rdmab_lkey(rb); } @@ -554,6 +554,10 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, sge->length, DMA_TO_DEVICE); req->rl_send_wr.num_sge++; return true; + +out_regbuf: + pr_err("rpcrdma: failed to DMA map a Send buffer\n"); + return false; } /* Prepare the Send SGEs. The head and tail iovec, and each entry @@ -574,7 +578,7 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, * DMA-mapped. Sync the content that has changed. */ if (!rpcrdma_dma_map_regbuf(ia, rb)) - return false; + goto out_regbuf; sge_no = 1; sge[sge_no].addr = rdmab_addr(rb); sge[sge_no].length = xdr->head[0].iov_len; @@ -662,6 +666,10 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, req->rl_send_wr.num_sge += sge_no; return true; +out_regbuf: + pr_err("rpcrdma: failed to DMA map a Send buffer\n"); + return false; + out_mapping_overflow: rpcrdma_unmap_sges(ia, req); pr_err("rpcrdma: too many Send SGEs (%u)\n", sge_no); @@ -673,26 +681,32 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, return false; } -bool -rpcrdma_prepare_send_sges(struct rpcrdma_ia *ia, struct rpcrdma_req *req, - u32 hdrlen, struct xdr_buf *xdr, - enum rpcrdma_chunktype rtype) +/** + * rpcrdma_prepare_send_sges - Construct SGEs for a Send WR + * @r_xprt: controlling transport + * @req: context of RPC Call being marshalled + * @hdrlen: size of transport header, in bytes + * @xdr: xdr_buf containing RPC Call + * @rtype: chunk type being encoded + * + * Returns 0 on success; otherwise a negative errno is returned. + */ +int +rpcrdma_prepare_send_sges(struct rpcrdma_xprt *r_xprt, + struct rpcrdma_req *req, u32 hdrlen, + struct xdr_buf *xdr, enum rpcrdma_chunktype rtype) { req->rl_send_wr.num_sge = 0; req->rl_mapped_sges = 0; - if (!rpcrdma_prepare_hdr_sge(ia, req, hdrlen)) - goto out_map; + if (!rpcrdma_prepare_hdr_sge(&r_xprt->rx_ia, req, hdrlen)) + return -EIO; if (rtype != rpcrdma_areadch) - if (!rpcrdma_prepare_msg_sges(ia, req, xdr, rtype)) - goto out_map; - - return true; + if (!rpcrdma_prepare_msg_sges(&r_xprt->rx_ia, req, xdr, rtype)) + return -EIO; -out_map: - pr_err("rpcrdma: failed to DMA map a Send buffer\n"); - return false; + return 0; } /** @@ -843,12 +857,10 @@ static bool rpcrdma_results_inline(struct rpcrdma_xprt *r_xprt, transfertypes[rtype], transfertypes[wtype], xdr_stream_pos(xdr)); - if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, - xdr_stream_pos(xdr), - &rqst->rq_snd_buf, rtype)) { - ret = -EIO; + ret = rpcrdma_prepare_send_sges(r_xprt, req, xdr_stream_pos(xdr), + &rqst->rq_snd_buf, rtype); + if (ret) goto out_err; - } return 0; out_err: diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h index 0e0ae61..0b8ca5e 100644 --- a/net/sunrpc/xprtrdma/xprt_rdma.h +++ b/net/sunrpc/xprtrdma/xprt_rdma.h @@ -613,8 +613,10 @@ enum rpcrdma_chunktype { rpcrdma_replych }; -bool rpcrdma_prepare_send_sges(struct rpcrdma_ia *, struct rpcrdma_req *, - u32, struct xdr_buf *, enum rpcrdma_chunktype); +int rpcrdma_prepare_send_sges(struct rpcrdma_xprt *r_xprt, + struct rpcrdma_req *req, u32 hdrlen, + struct xdr_buf *xdr, + enum rpcrdma_chunktype rtype); void rpcrdma_unmap_sges(struct rpcrdma_ia *, struct rpcrdma_req *); int rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst); void rpcrdma_set_max_header_sizes(struct rpcrdma_xprt *);