Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp347468pxj; Tue, 18 May 2021 04:55:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxNFokWN4vBgjhOEYuxmE3MU/4UujOFxBKVLXhR4+LI2wHbUcO/tLSnxXjzh0eIH671CLpC X-Received: by 2002:a17:906:3016:: with SMTP id 22mr5573383ejz.28.1621338920553; Tue, 18 May 2021 04:55:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621338920; cv=none; d=google.com; s=arc-20160816; b=MwSmEGD3BiSP6dWhsUu0pqimz6pHmgaT9WensJ/Uvx21Xh2GBreeHL2fSyMGhyyPFk UEzrvFYimTUO1TSZBqpTrHkoW2K03O3DGW7KVriDcbPqHq03vbiko1JiRH/7YadsmQ/X pReR5CG8NnB90cvMIQ8yWLMgm45qWwP0wfsqWvgZTF3VBxvxt06GBxk7Q2FmE9YNNEdK W8sjiGWfmnElN5tbXgeOHI11qvymzHaGD8wfaem9LYAyLoZg+nfulHtHRxBUNvqeaW6I e6Lr0MfFJpZBBZP+ATe9MImGNW63pym1ytZ4ehgLOV1f5tcTnLiH100Ik2xi2v6PF58z rzbg== 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:subject:cc:to :from:dkim-signature; bh=UjjUsTFA7A0uEMYp3P6XPmhEVKp7El1ggEyrR1NN1HE=; b=bYD6Rc1rDba4oMNgNVwjarzstSV4rD+yXnvcpBfjxxr4c8YYDjc1+6cKqrquq/E/i7 7ZTeiTMWZBm6omgQ/nnq8qknYfXA3Lj2sp4GiyQRN/3dYmPcQG69+9XYycCxuaFcEt7x VBYQYz3ZHGs5bv/wpzoPHrcrbEaeFxJZyAfKATNB/q8eTE35rBECwPJykABDbDESxY3e ClUChE7+WZrWgpYpRl3y0HCAJ9ArDXqvYutldoaviRSGMCbq81QmCnePLfp7T3nVwfRs YmY4bsCdgD7xETtPgBpBMmd/hzUlZDGTr9ZVjSyl34VygghyrhZnDf2cqJETeXh9phXh Npbg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=JdAmARxQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id af16si11844586ejc.427.2021.05.18.04.54.57; Tue, 18 May 2021 04:55:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=JdAmARxQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245128AbhEQPYl (ORCPT + 99 others); Mon, 17 May 2021 11:24:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:34050 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241879AbhEQPLW (ORCPT ); Mon, 17 May 2021 11:11:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4469461864; Mon, 17 May 2021 14:30:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621261857; bh=U6gq9psvxV9ReQVnJZJjIA78xvwHY8/l1lAawTQkcvM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JdAmARxQHK5M60tNDLc9QLXnFgAGkVPWfq6ZO1oR+KlzBBb15B/+s61kZh4Ib85Gm 2fXzJJiOqo5ee+npTxWhWvcv4HnG8gnSz9qP1DKpHPz0WTONPK4uzQEy2k7mwlJj5f L6bY3mLrodLoMYnx7kxxNrfPtszR352Yj3Vtuitc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chuck Lever , Trond Myklebust , Sasha Levin Subject: [PATCH 5.11 169/329] xprtrdma: Fix cwnd update ordering Date: Mon, 17 May 2021 16:01:20 +0200 Message-Id: <20210517140307.848909421@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210517140302.043055203@linuxfoundation.org> References: <20210517140302.043055203@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chuck Lever [ Upstream commit 35d8b10a25884050bb3b0149b62c3818ec59f77c ] After a reconnect, the reply handler is opening the cwnd (and thus enabling more RPC Calls to be sent) /before/ rpcrdma_post_recvs() can post enough Receive WRs to receive their replies. This causes an RNR and the new connection is lost immediately. The race is most clearly exposed when KASAN and disconnect injection are enabled. This slows down rpcrdma_rep_create() enough to allow the send side to post a bunch of RPC Calls before the Receive completion handler can invoke ib_post_recv(). Fixes: 2ae50ad68cd7 ("xprtrdma: Close window between waking RPC senders and posting Receives") Signed-off-by: Chuck Lever Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- net/sunrpc/xprtrdma/rpc_rdma.c | 3 ++- net/sunrpc/xprtrdma/verbs.c | 10 +++++----- net/sunrpc/xprtrdma/xprt_rdma.h | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index 8f5d0cb68360..d40ace8a973d 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c @@ -1459,9 +1459,10 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep) credits = 1; /* don't deadlock */ else if (credits > r_xprt->rx_ep->re_max_requests) credits = r_xprt->rx_ep->re_max_requests; + rpcrdma_post_recvs(r_xprt, credits + (buf->rb_bc_srv_max_requests << 1), + false); if (buf->rb_credits != credits) rpcrdma_update_cwnd(r_xprt, credits); - rpcrdma_post_recvs(r_xprt, false); req = rpcr_to_rdmar(rqst); if (unlikely(req->rl_reply)) diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index ec912cf9c618..f3fffc74ab0f 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -535,7 +535,7 @@ int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt) * outstanding Receives. */ rpcrdma_ep_get(ep); - rpcrdma_post_recvs(r_xprt, true); + rpcrdma_post_recvs(r_xprt, 1, true); rc = rdma_connect(ep->re_id, &ep->re_remote_cma); if (rc) @@ -1364,21 +1364,21 @@ int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) /** * rpcrdma_post_recvs - Refill the Receive Queue * @r_xprt: controlling transport instance - * @temp: mark Receive buffers to be deleted after use + * @needed: current credit grant + * @temp: mark Receive buffers to be deleted after one use * */ -void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) +void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed, bool temp) { struct rpcrdma_buffer *buf = &r_xprt->rx_buf; struct rpcrdma_ep *ep = r_xprt->rx_ep; struct ib_recv_wr *wr, *bad_wr; struct rpcrdma_rep *rep; - int needed, count, rc; + int count, rc; rc = 0; count = 0; - needed = buf->rb_credits + (buf->rb_bc_srv_max_requests << 1); if (likely(ep->re_receive_count > needed)) goto out; needed -= ep->re_receive_count; diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h index 94b28657aeeb..c3bcc84c16c4 100644 --- a/net/sunrpc/xprtrdma/xprt_rdma.h +++ b/net/sunrpc/xprtrdma/xprt_rdma.h @@ -460,7 +460,7 @@ int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt); void rpcrdma_xprt_disconnect(struct rpcrdma_xprt *r_xprt); int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req); -void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp); +void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed, bool temp); /* * Buffer calls - xprtrdma/verbs.c -- 2.30.2