Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3472776pxv; Mon, 26 Jul 2021 05:06:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzlg1Snl/urtv3Sy5iUQaZ9FcFrha98X6Xsvyrnm6TMPSWYjohl+XyVftOG8/w5fH6vzgY2 X-Received: by 2002:ac2:41d0:: with SMTP id d16mr12465851lfi.361.1627301196212; Mon, 26 Jul 2021 05:06:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627301196; cv=none; d=google.com; s=arc-20160816; b=tLMZZu15RZyEwylOD7dr+JiTG5D7Ie7tSgbS9tHYruWWHgH6F1st9JxpNnVSydhBh5 8eZravVZjSIIkWbaq3K5QD1pTzsQnF/tjMdAVExGa88w6CL6HJ2UqvWgdbafXhoaAC1p vIwjmM13ljbZtJMzG2O8wyCn6n6mBiaK66mzMihDYTuK2UXPlR2rNGTadDVGSPmwJ1Nr s/zJtu1K/v29mSWQ1TsH+OGADCd4iPnqV3Wyo6/vK36ulGI8mTE1LukzDQfF12XdXrov jaLacYlEqZlgUSykYiyP+p4usRIw3cy8gGuYRoeS6LO7vsq/qRHdKtuShC2RaxNEyUNG PFFg== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=/Y+3e61GMnFCwU5tBJc2gUFMlG8u1/PbaJeuHsF7V9c=; b=KaSMRnwML/bnR90eQ5TfO0Pnx8xTVUwxJ/Z1Uaxkr/YYdhg5Ic2cUCCnN7sfMhMriB d/3HRcoVeydjCEySN0vFN+NLOPn7pfJGV9HD2jfPElOJegpnwJME6Ln1L6WuiTUvu0of n8n25nmVhPPNMuMRhAccZWkiTxGesswmUbKvu/fNSoMYibedDVk6tDjzXghwtm8cVMM9 lj4LpaWanfgFfeHjMPnaFKFggOZvgHP4h5vWRCq0beMbWyZDYvLbESfp9TnS5cmf+KtX gXyKeo6Z3w1Gh5pk+RLBmNeux5Euhir9Lqtk5ZgvYBdSG7OJUAHT8OS4aYuw+rJmTgzY jrsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XcPvHwM4; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n14si4498730ejc.276.2021.07.26.05.06.12; Mon, 26 Jul 2021 05:06:36 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XcPvHwM4; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233673AbhGZLWp (ORCPT + 99 others); Mon, 26 Jul 2021 07:22:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:38502 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233633AbhGZLWp (ORCPT ); Mon, 26 Jul 2021 07:22:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8C4AA60F38; Mon, 26 Jul 2021 12:03:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1627300993; bh=PbDXgMU54OUeu0I/sdyHnTMg6/U+mhZHv/5tJOo+C7A=; h=From:To:Cc:Subject:Date:From; b=XcPvHwM438tCr4LIVnpbtTOPLDtAX703p+rdVYxbMIPUBYrhwlouWbfHBEHYZx/6i U1fmfojcHsn9tj5LiwPmSfznLdMPSjk+ZZ+hUgj7O4aDfL57KV6y7WIhPd5mpjuqIA D1K6N5ZUZj/6upSHjBnhGjIFeT6f0g1rJ63/f9cDtsh8MPipPOqwSBSccXDWgJTcm3 96tBBRkCifSyALqDOFt9hbCP1rCOtqju0NC3IKs9rMqicXnqIEY3lVd9zvI3StuGUm NSL+ZJK05/Hd1bvsfPSCVWPbBbddK0zrqETHEROEEbn9pzz4LyKLqam99UomUY0mQ2 vgAGHijj5Yo1w== From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Cc: Chuck Lever Subject: [PATCH] SUNRPC/xprtrdma: Fix reconnection locking Date: Mon, 26 Jul 2021 08:03:12 -0400 Message-Id: <20210726120312.8856-1-trondmy@kernel.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust The xprtrdma client code currently relies on the task that initiated the connect to hold the XPRT_LOCK for the duration of the connection attempt. If the task is woken early, due to some other event, then that lock could get released early. Avoid races by using the same mechanism that the socket code uses of transferring lock ownership to the RDMA connect worker itself. That frees us to call rpcrdma_xprt_disconnect() directly since we're now guaranteed exclusion w.r.t. other callers. Fixes: 4cf44be6f1e8 ("xprtrdma: Fix recursion into rpcrdma_xprt_disconnect()") Signed-off-by: Trond Myklebust --- net/sunrpc/xprt.c | 2 ++ net/sunrpc/xprtrdma/transport.c | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index aae5a328b15b..b88ac8132054 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -877,6 +877,7 @@ bool xprt_lock_connect(struct rpc_xprt *xprt, spin_unlock(&xprt->transport_lock); return ret; } +EXPORT_SYMBOL_GPL(xprt_lock_connect); void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie) { @@ -893,6 +894,7 @@ void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie) spin_unlock(&xprt->transport_lock); wake_up_bit(&xprt->state, XPRT_LOCKED); } +EXPORT_SYMBOL_GPL(xprt_unlock_connect); /** * xprt_connect - schedule a transport connect operation diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 9c2ffc67c0fd..975aef16ad34 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c @@ -250,12 +250,9 @@ xprt_rdma_connect_worker(struct work_struct *work) xprt->stat.connect_start; xprt_set_connected(xprt); rc = -EAGAIN; - } else { - /* Force a call to xprt_rdma_close to clean up */ - spin_lock(&xprt->transport_lock); - set_bit(XPRT_CLOSE_WAIT, &xprt->state); - spin_unlock(&xprt->transport_lock); - } + } else + rpcrdma_xprt_disconnect(r_xprt); + xprt_unlock_connect(xprt, r_xprt); xprt_wake_pending_tasks(xprt, rc); } @@ -489,6 +486,8 @@ xprt_rdma_connect(struct rpc_xprt *xprt, struct rpc_task *task) struct rpcrdma_ep *ep = r_xprt->rx_ep; unsigned long delay; + WARN_ON_ONCE(!xprt_lock_connect(xprt, task, r_xprt)); + delay = 0; if (ep && ep->re_connect_status != 0) { delay = xprt_reconnect_delay(xprt); -- 2.31.1