From patchwork Thu Aug 4 13:00:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9263601 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 3F5816048F for ; Thu, 4 Aug 2016 13:01:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 30FDC28330 for ; Thu, 4 Aug 2016 13:01:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 25BDC2840D; Thu, 4 Aug 2016 13:01:53 +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.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham 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 5103A28330 for ; Thu, 4 Aug 2016 13:01:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933545AbcHDNBu (ORCPT ); Thu, 4 Aug 2016 09:01:50 -0400 Received: from mail-io0-f196.google.com ([209.85.223.196]:34165 "EHLO mail-io0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933543AbcHDNBt (ORCPT ); Thu, 4 Aug 2016 09:01:49 -0400 Received: by mail-io0-f196.google.com with SMTP id g86so21673767ioj.1 for ; Thu, 04 Aug 2016 06:01:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id; bh=mPVpCJJTYgomNm3blUkuCV94Tgfc8o4+Q3aLEq3MHKs=; b=OTUtcP8/BbLoPLfFZuYEeG4AMPm+G6D21LCGfiPOmzA6UhBesrsJKVvr3uHlV26M2M IHBWN2t8tANyPLWeb4+wr92iwiAdfbrKXWkpnVFM/hbE9WzB/YwjcaYeyQzI/6Oge2il xP1BVxhbiL+2DUILy7/FSi09nC1Hxre14kzJtjN+YrSUizSGJLUWWVs6yk+HyNkKF7+1 MUNpVr0OFfrfpCzBkjd6srtLASZ0qL76t5nZ1SyXFXhFJZDSExwjuds/CkSYqpGftsES H2A8T20VQ5n0wVKX9CZb4DJYlQKzo495ZM/91RLmFLRuS1xGNELjSwZX8DuP0h5Rni3/ 9Gjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:date:message-id; bh=mPVpCJJTYgomNm3blUkuCV94Tgfc8o4+Q3aLEq3MHKs=; b=i8lqtZFO39Z96R9HQ7ydQv3wxv/RGvnxxpmQ3UnKkSef67WMblOGxVDzW93NsT1rmS atTi0wVqelDFLoDgK9IjOOsSBZ9l8qB/idHvlMgUVhGM8mR1PB6RbSC4Fg4jWA79QuHs AFhsyEi79ca5XzZjKCguJLRBMtUkbNhzlq/x1LpnhlVF7tqrcFdzCHXaXcE0Dt6RWMGk SmaDc/q1fTEdJ6efB0a7ndQk1C6ezMJK8QsoF3Sow126v4OO3iUqVzcdIUhVau75Y+DV H674Kb+dtlsSSkj8cQ8bQm8Q1DGW/MVgi2UydXh/9NUcDgESS70wUdHKs8Z3YRadV0G4 CwHw== X-Gm-Message-State: AEkoouse4YrmyO310uCx5GLnk6VJYtJ5S0yobJRbry7MaNnOF7TxI0ysWOrUiPqUdKACcw== X-Received: by 10.107.3.65 with SMTP id 62mr83860975iod.140.1470315708344; Thu, 04 Aug 2016 06:01:48 -0700 (PDT) Received: from leira.trondhjem.org.localdomain (c-68-49-162-121.hsd1.mi.comcast.net. [68.49.162.121]) by smtp.gmail.com with ESMTPSA id t68sm1560243ita.1.2016.08.04.06.01.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Aug 2016 06:01:47 -0700 (PDT) From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 1/2] SUNRPC: Fix reconnection timeouts Date: Thu, 4 Aug 2016 09:00:59 -0400 Message-Id: <1470315660-37206-1-git-send-email-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.7.4 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 When the connect attempt fails and backs off, we should start the clock at the last connection attempt, not time at which we queue up the reconnect job. Signed-off-by: Trond Myklebust --- net/sunrpc/xprtsock.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index c6b1d48c4319..5eebf48cffa0 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -2173,6 +2173,8 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) write_unlock_bh(&sk->sk_callback_lock); } xs_udp_do_set_buffer_size(xprt); + + xprt->stat.connect_start = jiffies; } static void xs_udp_setup_socket(struct work_struct *work) @@ -2373,6 +2375,16 @@ out: xprt_wake_pending_tasks(xprt, status); } +static unsigned long xs_reconnect_delay(const struct rpc_xprt *xprt) +{ + unsigned long start, now = jiffies; + + start = xprt->stat.connect_start + xprt->reestablish_timeout; + if (time_after(start, now)) + return start - now; + return 0; +} + /** * xs_connect - connect a socket to a remote endpoint * @xprt: pointer to transport structure @@ -2390,6 +2402,7 @@ out: static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task) { struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); + unsigned long delay = 0; WARN_ON_ONCE(!xprt_lock_connect(xprt, task, transport)); @@ -2401,19 +2414,19 @@ static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task) /* Start by resetting any existing state */ xs_reset_transport(transport); - queue_delayed_work(xprtiod_workqueue, - &transport->connect_worker, - xprt->reestablish_timeout); + delay = xs_reconnect_delay(xprt); + xprt->reestablish_timeout <<= 1; if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO) xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; if (xprt->reestablish_timeout > XS_TCP_MAX_REEST_TO) xprt->reestablish_timeout = XS_TCP_MAX_REEST_TO; - } else { + } else dprintk("RPC: xs_connect scheduled xprt %p\n", xprt); - queue_delayed_work(xprtiod_workqueue, - &transport->connect_worker, 0); - } + + queue_delayed_work(xprtiod_workqueue, + &transport->connect_worker, + delay); } /**