Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp657847pxf; Wed, 31 Mar 2021 12:37:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwEDjKfmeePHpp9VVmlY6PfeZUijHvrCLAr1Fos6YQCgzLgK5Q5Xd//AL4cjHAm76FF9vAF X-Received: by 2002:aa7:cf16:: with SMTP id a22mr5618560edy.288.1617219475097; Wed, 31 Mar 2021 12:37:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617219475; cv=none; d=google.com; s=arc-20160816; b=NhHDNwors6T0DVQk68IAih3WJ9MeV6C9WZi0Rfb3ABx65VLPNvpR/VO0BRb9Uv4OZv 7Vu+xVoEDKwfSLKPo55jPC0jVN1WojFH66Vi/zjTAoeN6arVvyGPN2piJNt1iYBfV4qs jTedhnp3EcOyZdCztjs6gXQxoDcKlE6N1cOxPYs2gm9twEtiZGRsVXeDssUIdF7nc+6x aCPIjAPMB5Fna6S+7WfN4MwCdJIK7evUQjn4/TZ6UfVBbaH58zYCcTHdOCACrA1RV7Tv C8B8AulLp0QnEiMnNVZxh+rJLoKwzfO6OPuch7vOWCBAbTkZm8nGQicz2vLwGETJ8RnT fo2A== 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:to:from:subject; bh=dPMnvKJRDMrj4oxPqxq0ucCvBm78OF84Guslbbiq6us=; b=xvKTI2vE5vhYCBYQ/4mB0FBRfI6sX05ir1U5aKKABEYM6FQUddVeMGDFcW5Y0l7wYR Ppq5Ko2Y+qRE3rviKacH4e0HuyT3dkJe+bDRGyHyuZ5r2MTLPSj49xa2De0Hi3cf3bnL lmrjTALoiuYKxJ+E+Pbbp8RxPyREzkzGZEXjrKsGNcx0GORNEFmBkemv8jniGxgWCDvE OpdjFzdOP/rAKnkPSggeWID4XpKdCRWYn7NbkybejH49Plvz6AMKnAzfp3ig9tE/tToY x9/YLfaKzWsv+PrpEa8kTZv7e/lURo0ma3VW47uki2eCFHLKhiUsY30Xkf51990QMFsF 03OA== 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 qw16si2504454ejb.673.2021.03.31.12.37.32; Wed, 31 Mar 2021 12:37:55 -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 S236157AbhCaTg2 (ORCPT + 99 others); Wed, 31 Mar 2021 15:36:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:44448 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235991AbhCaTgM (ORCPT ); Wed, 31 Mar 2021 15:36:12 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 02A566100C; Wed, 31 Mar 2021 19:36:11 +0000 (UTC) Subject: [PATCH v1 2/8] xprtrdma: Do not post Receives after disconnect From: Chuck Lever To: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Date: Wed, 31 Mar 2021 15:36:11 -0400 Message-ID: <161721937122.515226.14731175629421422152.stgit@manet.1015granger.net> In-Reply-To: <161721926778.515226.9805598788670386587.stgit@manet.1015granger.net> References: <161721926778.515226.9805598788670386587.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 Currently the Receive completion handler refreshes the Receive Queue whenever a successful Receive completion occurs. On disconnect, xprtrdma drains the Receive Queue. The first few Receive completions after a disconnect are typically successful, until the first flushed Receive. This means the Receive completion handler continues to post more Receive WRs after the drain sentinel has been posted. The late- posted Receives flush after the drain sentinel has completed, leading to a crash later in rpcrdma_xprt_disconnect(). To prevent this crash, xprtrdma has to ensure that the Receive handler stops posting Receives before ib_drain_rq() posts its drain sentinel. This patch is probably not sufficient to fully close that window, but does significantly reduce the opportunity for a crash to occur without incurring undue performance overhead. Cc: stable@vger.kernel.org # v5.7 Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/verbs.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index ec912cf9c618..1d88685badbe 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c @@ -1371,8 +1371,10 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) { struct rpcrdma_buffer *buf = &r_xprt->rx_buf; struct rpcrdma_ep *ep = r_xprt->rx_ep; + struct ib_qp_init_attr init_attr; struct ib_recv_wr *wr, *bad_wr; struct rpcrdma_rep *rep; + struct ib_qp_attr attr; int needed, count, rc; rc = 0; @@ -1385,6 +1387,11 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp) if (!temp) needed += RPCRDMA_MAX_RECV_BATCH; + if (ib_query_qp(ep->re_id->qp, &attr, IB_QP_STATE, &init_attr)) + goto out; + if (attr.qp_state == IB_QPS_ERR) + goto out; + /* fast path: all needed reps can be found on the free list */ wr = NULL; while (needed) {