Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp625913img; Fri, 22 Mar 2019 05:25:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqx5XYwR8Y3dPMJOKXphg8k43/bg8vZqpJ0BlgEMRnhBU/+kSAVFtV3qn6vWlybqfErnIqsx X-Received: by 2002:a63:fb16:: with SMTP id o22mr8437188pgh.209.1553257519825; Fri, 22 Mar 2019 05:25:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553257519; cv=none; d=google.com; s=arc-20160816; b=Dx9qzC7homKJugdIHPVdKsOLK9hCbcuTzPl9CdUnp2sNeEz9uq9cpf+M5UNzIiHV+h gtuwQRmKD8tWltdxUWT1byHdU7d2RqrYwkf/kdpg9nwxU4BDoO4TTDNqQjLNP2JiwcVo NxLEJ4F5w4bUFHH2/7A1kNNCZiRU6BIip7530JmKu9Ec4Iiz+jN/3/Qy0UEKGZA9GvDt wEBHy7Dsme7YY97anMCloQT7En0SHceJGUSRqMmO0CsOhlGTi//5ILjy7VhX98TgX/Br 0Gwp7BNSP150dvKO5jMHbeCdDeiC2/TdkOpuinxpN1w/Hvn48KIjoHDL8GR8svjaxBe7 hRBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=mLnBApA8OhRPhsIh63U8zN5DUkuQTtjFy4VMdG++Fqo=; b=l58vXWWNP6GSaQayuwzzOOPZPoeZ1k+J/Rz7MCdwpENnKAM9rWw30J1A+SlbBdJPIa 1WvcrXkRctC/MmBpDxm/f/IY1kFnBcoi5lM3EnSu8CqsnBFJIbWmkq31sntU7pzawONX 62NFQiR75TazxZLRw9KER9EEwxI3bLGVW+6m2QK/Jno+3/A9Unr78AFnMGpI50gj7rmg +XXdfYErZNt0FdEh202NMyHWgrPOogns5MSbq+Hr5m/xPPEZ+8PUsrU94dBXArQvlcJE k7FQFgtP+o6J0BXLHUL+ZJ6ZI1aDfp388eJZcXzFbEfbZ6I+4w5cujVmDG6H17/7Pkta BjtA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="M/CCvgq4"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 189si6601123pgb.412.2019.03.22.05.25.04; Fri, 22 Mar 2019 05:25:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="M/CCvgq4"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390353AbfCVMYO (ORCPT + 99 others); Fri, 22 Mar 2019 08:24:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:35982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391242AbfCVMYN (ORCPT ); Fri, 22 Mar 2019 08:24:13 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D3BF42054F; Fri, 22 Mar 2019 12:24:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553257452; bh=ZTmHbU968+1y7+TdMRCDn3vHlqnKM7SmwCX54KU330M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M/CCvgq4pxn+eVCf9UHsTO/J3L8zWKa3A70N4FiqQ6xzqv254m45ptMquS+gg8UOQ +6E4tLHn5svik3jzj3J3u+Fa+J2IF/fqFAWA66DS1TB8nmx9DxmhXanLrqYmxKjYng WsHM47Z8t2nRXZhxkCN3Gv4Xn3bzBeSop+mZKTwY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust Subject: [PATCH 5.0 237/238] SUNRPC: Fix up RPC back channel transmission Date: Fri, 22 Mar 2019 12:17:36 +0100 Message-Id: <20190322111312.487141535@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111258.383569278@linuxfoundation.org> References: <20190322111258.383569278@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Trond Myklebust commit 477687e1116ad16180caf8633dd830b296a5ce73 upstream. Now that transmissions happen through a queue, we require the RPC tasks to handle error conditions that may have been set while they were sleeping. The back channel does not currently do this, but assumes that any error condition happens during its own call to xprt_transmit(). The solution is to ensure that the back channel splits out the error handling just like the forward channel does. Fixes: 89f90fe1ad8b ("SUNRPC: Allow calls to xprt_transmit() to drain...") Signed-off-by: Trond Myklebust Signed-off-by: Greg Kroah-Hartman --- net/sunrpc/clnt.c | 61 +++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 28 deletions(-) --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -66,9 +66,6 @@ static void call_decode(struct rpc_task static void call_bind(struct rpc_task *task); static void call_bind_status(struct rpc_task *task); static void call_transmit(struct rpc_task *task); -#if defined(CONFIG_SUNRPC_BACKCHANNEL) -static void call_bc_transmit(struct rpc_task *task); -#endif /* CONFIG_SUNRPC_BACKCHANNEL */ static void call_status(struct rpc_task *task); static void call_transmit_status(struct rpc_task *task); static void call_refresh(struct rpc_task *task); @@ -1131,6 +1128,8 @@ rpc_call_async(struct rpc_clnt *clnt, co EXPORT_SYMBOL_GPL(rpc_call_async); #if defined(CONFIG_SUNRPC_BACKCHANNEL) +static void call_bc_encode(struct rpc_task *task); + /** * rpc_run_bc_task - Allocate a new RPC task for backchannel use, then run * rpc_execute against it @@ -1152,7 +1151,7 @@ struct rpc_task *rpc_run_bc_task(struct task = rpc_new_task(&task_setup_data); xprt_init_bc_request(req, task); - task->tk_action = call_bc_transmit; + task->tk_action = call_bc_encode; atomic_inc(&task->tk_count); WARN_ON_ONCE(atomic_read(&task->tk_count) != 2); rpc_execute(task); @@ -2064,6 +2063,16 @@ call_transmit_status(struct rpc_task *ta } #if defined(CONFIG_SUNRPC_BACKCHANNEL) +static void call_bc_transmit(struct rpc_task *task); +static void call_bc_transmit_status(struct rpc_task *task); + +static void +call_bc_encode(struct rpc_task *task) +{ + xprt_request_enqueue_transmit(task); + task->tk_action = call_bc_transmit; +} + /* * 5b. Send the backchannel RPC reply. On error, drop the reply. In * addition, disconnect on connectivity errors. @@ -2071,26 +2080,23 @@ call_transmit_status(struct rpc_task *ta static void call_bc_transmit(struct rpc_task *task) { - struct rpc_rqst *req = task->tk_rqstp; - - if (rpc_task_need_encode(task)) - xprt_request_enqueue_transmit(task); - if (!test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) - goto out_wakeup; - - if (!xprt_prepare_transmit(task)) - goto out_retry; - - if (task->tk_status < 0) { - printk(KERN_NOTICE "RPC: Could not send backchannel reply " - "error: %d\n", task->tk_status); - goto out_done; + task->tk_action = call_bc_transmit_status; + if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { + if (!xprt_prepare_transmit(task)) + return; + task->tk_status = 0; + xprt_transmit(task); } + xprt_end_transmit(task); +} - xprt_transmit(task); +static void +call_bc_transmit_status(struct rpc_task *task) +{ + struct rpc_rqst *req = task->tk_rqstp; - xprt_end_transmit(task); dprint_status(task); + switch (task->tk_status) { case 0: /* Success */ @@ -2104,8 +2110,14 @@ call_bc_transmit(struct rpc_task *task) case -ENOTCONN: case -EPIPE: break; + case -ENOBUFS: + rpc_delay(task, HZ>>2); + /* fall through */ + case -EBADSLT: case -EAGAIN: - goto out_retry; + task->tk_status = 0; + task->tk_action = call_bc_transmit; + return; case -ETIMEDOUT: /* * Problem reaching the server. Disconnect and let the @@ -2124,18 +2136,11 @@ call_bc_transmit(struct rpc_task *task) * We were unable to reply and will have to drop the * request. The server should reconnect and retransmit. */ - WARN_ON_ONCE(task->tk_status == -EAGAIN); printk(KERN_NOTICE "RPC: Could not send backchannel reply " "error: %d\n", task->tk_status); break; } -out_wakeup: - rpc_wake_up_queued_task(&req->rq_xprt->pending, task); -out_done: task->tk_action = rpc_exit_task; - return; -out_retry: - task->tk_status = 0; } #endif /* CONFIG_SUNRPC_BACKCHANNEL */