Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2777294pxb; Mon, 19 Apr 2021 13:44:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxJaH28q2mLUQ8jrAc1mxrfqC1Qg6Y06P+pEAlI+a+/VgDkhwzQ4AFQggsTHpjt9i71a7AB X-Received: by 2002:a17:902:6b8c:b029:ea:f54f:c330 with SMTP id p12-20020a1709026b8cb02900eaf54fc330mr25309707plk.10.1618865089847; Mon, 19 Apr 2021 13:44:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618865089; cv=none; d=google.com; s=arc-20160816; b=eLgqMj2UEhHaFXRMGvnBsMvSGj1JeABDqeF9kZy4N2/auBtCWclY1rsezcUq1uX7Ix ADxtUylvWX5TlpFQV3z/alAF1QmUgB/k6Hl8dXsdNERF9behgjfTSa73/KSGLR0hRzQ7 OlA24aBSAGz9y682MlZjIzdGroUQ+xAt9fACZg/VBnv1OF+/Xjl8cjqVncmMenn8H0yy yYLiEUF5JSZY6JjjGwtsi34HvGHBH+P7CXJF5uPqSotARjJwHJ5qlU1poWEeKzlYBcxY rJiHYn+im/ZHzAPb/fMgSEjLyJ5L6vkt2evwc6kCq6wYzUoBLxIalZ2TZwaT1jOUw0Bj xfEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject; bh=watIRcpvFM0uXwHfuPI27SX1FOOdR3Vbh4xfmdsAak8=; b=NvgsZI1egGOIT/HWz47slfLdPGIncCN6QKjTg80H+N4jIBJ8UnqWRTfqBRTzY7v6pw d8NfbsQih2sJqXjmylMTBMyZqvMzwQOsbLi+IC3cC968QeWNFV5oIp0DiHqTzcX6fzjb WykbozNTcIPWu68THhD9Fsomc5Yg085/VqvjsNiu7QtVxVqehvaUWhzJaN+I0CfN124S 8gQoTGGRNDqkwJBfORS3W0qtCCQUcV1+k7Vr7BpOuXRou7Gt7kZwcNF7T/ukrP+Nxrlj 94MMeJs4ELapVx8KRcu9r3vxn/J++xzrgmvWUja5wBLhgzT9WhM78vhUuCrxIrqZwdi0 EJHQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u32si15121649pgm.314.2021.04.19.13.44.36; Mon, 19 Apr 2021 13:44:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240569AbhDSSD4 (ORCPT + 99 others); Mon, 19 Apr 2021 14:03:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:41318 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240553AbhDSSD4 (ORCPT ); Mon, 19 Apr 2021 14:03:56 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3D9F561107; Mon, 19 Apr 2021 18:03:26 +0000 (UTC) Subject: [PATCH v3 17/26] xprtrdma: Avoid Send Queue wrapping From: Chuck Lever To: trondmy@hammerspace.com Cc: linux-nfs@vger.kernel.org, linux-rdma@vger.kernel.org Date: Mon, 19 Apr 2021 14:03:25 -0400 Message-ID: <161885540540.38598.8756855506309086070.stgit@manet.1015granger.net> In-Reply-To: <161885481568.38598.16682844600209775665.stgit@manet.1015granger.net> References: <161885481568.38598.16682844600209775665.stgit@manet.1015granger.net> User-Agent: StGit/0.23-29-ga622f1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Send WRs can be signalled or unsignalled. A signalled Send WR always has a matching Send completion, while a unsignalled Send has a completion only if the Send WR fails. xprtrdma has a Send account mechanism that is designed to reduce the number of signalled Send WRs. This in turn mitigates the interrupt rate of the underlying device. RDMA consumers can't leave all Sends unsignaled, however, because providers rely on Send completions to maintain their Send Queue head and tail pointers. xprtrdma counts the number of unsignaled Send WRs that have been posted to ensure that Sends are signalled often enough to prevent the Send Queue from wrapping. This mechanism neglected to account for FastReg WRs, which are posted on the Send Queue but never signalled. As a result, the Send Queue wrapped on occasion, resulting in duplication completions of FastReg and LocalInv WRs. Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/frwr_ops.c | 17 +++++++++++++++-- net/sunrpc/xprtrdma/verbs.c | 16 +--------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c index 951ae20485f3..43a412ea337a 100644 --- a/net/sunrpc/xprtrdma/frwr_ops.c +++ b/net/sunrpc/xprtrdma/frwr_ops.c @@ -390,11 +390,13 @@ static void frwr_cid_init(struct rpcrdma_ep *ep, */ int frwr_send(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) { + struct ib_send_wr *post_wr, *send_wr = &req->rl_wr; struct rpcrdma_ep *ep = r_xprt->rx_ep; - struct ib_send_wr *post_wr; struct rpcrdma_mr *mr; + unsigned int num_wrs; - post_wr = &req->rl_wr; + num_wrs = 1; + post_wr = send_wr; list_for_each_entry(mr, &req->rl_registered, mr_list) { struct rpcrdma_frwr *frwr; @@ -409,8 +411,19 @@ int frwr_send(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) frwr->fr_regwr.wr.send_flags = 0; post_wr = &frwr->fr_regwr.wr; + ++num_wrs; } + if ((kref_read(&req->rl_kref) > 1) || num_wrs > ep->re_send_count) { + send_wr->send_flags |= IB_SEND_SIGNALED; + ep->re_send_count = min_t(unsigned int, ep->re_send_batch, + num_wrs - ep->re_send_count); + } else { + send_wr->send_flags &= ~IB_SEND_SIGNALED; + ep->re_send_count -= num_wrs; + } + + trace_xprtrdma_post_send(req); return ib_post_send(ep->re_id->qp, post_wr, NULL); } diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index d4e573eef416..55c45cad2c8a 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -1365,21 +1365,7 @@ static void rpcrdma_regbuf_free(struct rpcrdma_regbuf *rb) */ int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) { - struct ib_send_wr *send_wr = &req->rl_wr; - struct rpcrdma_ep *ep = r_xprt->rx_ep; - int rc; - - if (!ep->re_send_count || kref_read(&req->rl_kref) > 1) { - send_wr->send_flags |= IB_SEND_SIGNALED; - ep->re_send_count = ep->re_send_batch; - } else { - send_wr->send_flags &= ~IB_SEND_SIGNALED; - --ep->re_send_count; - } - - trace_xprtrdma_post_send(req); - rc = frwr_send(r_xprt, req); - if (rc) + if (frwr_send(r_xprt, req)) return -ENOTCONN; return 0; }