From patchwork Fri Oct 27 14:49:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 10030069 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 8386D6022E for ; Fri, 27 Oct 2017 14:50:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 74DE728DAA for ; Fri, 27 Oct 2017 14:50:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 68A4028E58; Fri, 27 Oct 2017 14:50:01 +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=unavailable 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 1B51028DAA for ; Fri, 27 Oct 2017 14:50:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751632AbdJ0Otz (ORCPT ); Fri, 27 Oct 2017 10:49:55 -0400 Received: from mail-io0-f194.google.com ([209.85.223.194]:56553 "EHLO mail-io0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750781AbdJ0Otx (ORCPT ); Fri, 27 Oct 2017 10:49:53 -0400 Received: by mail-io0-f194.google.com with SMTP id m81so13210795ioi.13; Fri, 27 Oct 2017 07:49:53 -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:user-agent:mime-version :content-transfer-encoding; bh=L4LCVO5JejB1wuEwpI6GRKV+/3TYbPAnuxylftVu3Bs=; b=WlJk/dbYch3BIwb5OPralaOkwKMDjdh2jQQpslc7vd1wsFqgOcDqMsBeU241V4P0tS u1SsKg9fq6BCFu8i2BwozpMXam9ueiliCefXsw3/Nif8mZig1JKgqgf5G7Ej/7rMZRlW gyhTannPsoKmmrPTLzn0kurb+DuOjMdED3UTJxidTSP6o044yhRP/++Qre7UBib3/Bt4 hI1XFfUO5BKSp6nIYKo/S0cmKayTIlkYcDR/9sVM0WB3u2fPrEJFC7T2Rp7xY2ulXrUL r4BD7TDHnlevqOX4ELoeY77/4w5kX0YFXie0Y688jLw34K31qFNhC+E15Xtk4NRt4jfT 8t/A== 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 :user-agent:mime-version:content-transfer-encoding; bh=L4LCVO5JejB1wuEwpI6GRKV+/3TYbPAnuxylftVu3Bs=; b=rExWR+H6L/LuhJ0lPHndYHnULosEaFMgts1Js3U6oJRkKr6tF3zKmkjFwOoBkcnD6s MQHOYxyJ048oNOIHTgwonPryY7ukk8KVHlKIHh4JllDFaaxYL8MfvipHlL4etjW06h78 3jC/N5yK+bOLdl2tNOXC8Kj9IfhYePwaTMq29HnJplzIUWrCoD1siByxcMb3sthSG5Ss 5QEskm8DP6JVnLa/oQmG2r4n+cX5sUc5aW1OJMzDU4Qu8YLt8xtPjVUBsW8fBsvhkcNf TFeURZCLZSeBZPaPwMgGoSzjrQM35+xcliWTgmZ2Un4SunQEqrSEUjOv5muyazKSZPUv QZFA== X-Gm-Message-State: AMCzsaUySyiECe3tIPFDDy8YCkhiLWQ6v8Nlg0VU8ZhU2EMzUnXpP9wl 7nQnw391b+RXd3TxbI8dcJs= X-Google-Smtp-Source: ABhQp+Ql/zZG6hFqETiRBNgHq65qG3PYSh+juw6S+hy+l4fLbFL3R2Gv1W3y7GDdhDRq7lfHYg+/PA== X-Received: by 10.107.104.16 with SMTP id d16mr925764ioc.128.1509115793161; Fri, 27 Oct 2017 07:49:53 -0700 (PDT) Received: from klimt.1015granger.net (c-68-46-169-226.hsd1.mi.comcast.net. [68.46.169.226]) by smtp.gmail.com with ESMTPSA id q1sm980251itc.9.2017.10.27.07.49.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Oct 2017 07:49:52 -0700 (PDT) Subject: [PATCH] svcrdma: Enqueue after setting XPT_CLOSE in completion handlers From: Chuck Lever To: bfields@fieldses.org Cc: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Date: Fri, 27 Oct 2017 10:49:51 -0400 Message-ID: <20171027144743.15444.3407.stgit@klimt.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 I noticed the server was sometimes not closing the connection after a flushed Send. For example, if the client responds with an RNR NAK to a Reply from the server, that client might be deadlocked, and thus wouldn't send any more traffic. Thus the server wouldn't have any opportunity to notice the XPT_CLOSE bit has been set. Enqueue the transport so that svcxprt notices the bit even if there is no more transport activity after a flushed completion, QP access error, or device removal event. Signed-off-by: Chuck Lever --- net/sunrpc/xprtrdma/svc_rdma_transport.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) Hi Bruce- Please consider this patch for v4.15. Thanks! -- 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/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 5caf8e7..46ec069 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -290,6 +290,7 @@ static void qp_event_handler(struct ib_event *event, void *context) ib_event_msg(event->event), event->event, event->element.qp); set_bit(XPT_CLOSE, &xprt->xpt_flags); + svc_xprt_enqueue(xprt); break; } } @@ -322,8 +323,7 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc) set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); if (test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags)) goto out; - svc_xprt_enqueue(&xprt->sc_xprt); - goto out; + goto out_enqueue; flushed: if (wc->status != IB_WC_WR_FLUSH_ERR) @@ -333,6 +333,8 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc) set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); svc_rdma_put_context(ctxt, 1); +out_enqueue: + svc_xprt_enqueue(&xprt->sc_xprt); out: svc_xprt_put(&xprt->sc_xprt); } @@ -358,6 +360,7 @@ void svc_rdma_wc_send(struct ib_cq *cq, struct ib_wc *wc) if (unlikely(wc->status != IB_WC_SUCCESS)) { set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); + svc_xprt_enqueue(&xprt->sc_xprt); if (wc->status != IB_WC_WR_FLUSH_ERR) pr_err("svcrdma: Send: %s (%u/0x%x)\n", ib_wc_status_msg(wc->status), @@ -569,8 +572,10 @@ static int rdma_listen_handler(struct rdma_cm_id *cma_id, case RDMA_CM_EVENT_DEVICE_REMOVAL: dprintk("svcrdma: Device removal xprt=%p, cm_id=%p\n", xprt, cma_id); - if (xprt) + if (xprt) { set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags); + svc_xprt_enqueue(&xprt->sc_xprt); + } break; default: