Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3480704imu; Sun, 11 Nov 2018 16:04:35 -0800 (PST) X-Google-Smtp-Source: AJdET5e72aAMDGWl2eBoPlAhrw/9/rjfBKga3gRA7eK+lqocSOL3cb3pw08RtV8X/motpmLhJoOD X-Received: by 2002:a17:902:9a9:: with SMTP id 38-v6mr14598456pln.180.1541981075551; Sun, 11 Nov 2018 16:04:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541981075; cv=none; d=google.com; s=arc-20160816; b=eCpeK6/y2glHZQBVB6965zmR+Y8cCOIlQhAp7nDPNnUmacJLHcIgWTAGdYC5X2afDw +UTsWIpTRfi8nPvnUiwdXtM6ql/d1MVOyDpp+fmuOgnwDp6WsoPs2P1WnzuLXk75M0zJ cXI8oldxDXvV6mZoj9cTO2aTKgPU+nsxMJblyG0ralRLc9FYzLLq0QhHT80YOfGeH70t 1t2D+fiWscDQ0WIgiG39WJuDdQ7lyzFbnFXZugxA74URMk4vbAVLWCNj9BQYSNck9eca xrdZ8LDT8hi89c8hSoLPUgiXDkZcOaKs/RJoXxbaFH6E/IIzmmNFWytNNlIkfjLDkCJJ 8+oA== 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=4TiOm+7w0vrpCgO15QjZTPrpj7rVHYPam2B94gtkk54=; b=veaNaXPR9ddOpce/xWpL7rDsfMOVOr8GpnwJmxUxIUiebe4WmyWA7qutBtvL4+gVx4 dRxbEbe1FJjR64Xunfcqw5qRkEWWf6f0AFRt2+P1I3cgYWIruAenRFB5353154EDVtqS lfQ7Xs+NRA9wdZqlIbM69EgVW7p3ArCbsWNL0NHXOb/RH25hBl9MTmTpLAttto+0kkPw MBoNWplRPzk37Q5FxQG38nn5MHuatV/h2uFD8NwXML/m2Xe+Vyq991YS3sgO5ZNYJ/0O mbEQuditREQwjbAGdMwJSqQIDrxlGTBcCtpFqZ+KUSmY5grjD6kVIagQNk0DKWXIXZbw 4qtA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HfyZpKIP; 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 129-v6si17322620pfy.164.2018.11.11.16.04.20; Sun, 11 Nov 2018 16:04:35 -0800 (PST) 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=HfyZpKIP; 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 S1732554AbeKLJxN (ORCPT + 99 others); Mon, 12 Nov 2018 04:53:13 -0500 Received: from mail.kernel.org ([198.145.29.99]:34452 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732118AbeKLIRw (ORCPT ); Mon, 12 Nov 2018 03:17:52 -0500 Received: from localhost (unknown [206.108.79.134]) (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 DF798223C8; Sun, 11 Nov 2018 22:27:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541975276; bh=bIybaGHTxsUvGrY7nh8qgf6BCv4mHoVbJK6/wau0Y+4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HfyZpKIPMM43HhoPjtp2WJpwmFyZfzxbY4l/UI1EmugCQWjj0mE9ebRvWNNFvO/jQ TGlaRqjbC5o4HuozVdX4tIPM0L0nSyMHK8tbj9Byg4klphWzMjMZZ07Be4nv6FnEWM xlKWu22d2apT5He1O2cv3863AR+eo7c7CcEOjOhM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vijay Immanuel , Doug Ledford , Sasha Levin Subject: [PATCH 4.19 189/361] IB/rxe: fix for duplicate request processing and ack psns Date: Sun, 11 Nov 2018 14:18:56 -0800 Message-Id: <20181111221646.935404539@linuxfoundation.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181111221619.915519183@linuxfoundation.org> References: <20181111221619.915519183@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review 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 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Vijay Immanuel [ Upstream commit b97db58557f4aa6d9903f8e1deea6b3d1ed0ba43 ] Don't reset the resp opcode for a replayed read response. The resp opcode could be in the middle of a write or send sequence, when the duplicate read request was received. An example sequence is as follows: - Receive read request for 12KB PSN 20. Transmit read response first, middle and last with PSNs 20,21,22. - Receive write first PSN 23. At this point the resp psn is 24 and resp opcode is write first. - The sender notices that PSN 20 is dropped and retransmits. Receive read request for 12KB PSN 20. Transmit read response first, middle and last with PSNs 20,21,22. The resp opcode is set to -1, the resp psn remains 24. - Receive write first PSN 23. This is processed by duplicate_request(). The resp opcode remains -1 and resp psn remains 24. - Receive write middle PSN 24. check_op_seq() reports a missing first error since the resp opcode is -1. When sending an ack for a duplicate send or write request, use the psn of the previous ack sent. Do not use the psn of a read response for the ack. An example sequence is as follows: - Receive write PSN 30. Transmit ACK for PSN 30. - Receive read request 4KB PSN 31. Transmit read response with PSN 31. The resp psn is now 32. - The sender notices that PSN 30 is dropped and retransmits. Receive write PSN 30. duplicate_request() sends an ACK with PSN 31. That is incorrect since PSN 31 was a read request. Signed-off-by: Vijay Immanuel Signed-off-by: Doug Ledford Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/infiniband/sw/rxe/rxe_resp.c | 8 ++++++-- drivers/infiniband/sw/rxe/rxe_verbs.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) --- a/drivers/infiniband/sw/rxe/rxe_resp.c +++ b/drivers/infiniband/sw/rxe/rxe_resp.c @@ -682,6 +682,7 @@ static enum resp_states read_reply(struc rxe_advance_resp_resource(qp); res->type = RXE_READ_MASK; + res->replay = 0; res->read.va = qp->resp.va; res->read.va_org = qp->resp.va; @@ -752,7 +753,8 @@ static enum resp_states read_reply(struc state = RESPST_DONE; } else { qp->resp.res = NULL; - qp->resp.opcode = -1; + if (!res->replay) + qp->resp.opcode = -1; if (psn_compare(res->cur_psn, qp->resp.psn) >= 0) qp->resp.psn = res->cur_psn; state = RESPST_CLEANUP; @@ -814,6 +816,7 @@ static enum resp_states execute(struct r /* next expected psn, read handles this separately */ qp->resp.psn = (pkt->psn + 1) & BTH_PSN_MASK; + qp->resp.ack_psn = qp->resp.psn; qp->resp.opcode = pkt->opcode; qp->resp.status = IB_WC_SUCCESS; @@ -1065,7 +1068,7 @@ static enum resp_states duplicate_reques struct rxe_pkt_info *pkt) { enum resp_states rc; - u32 prev_psn = (qp->resp.psn - 1) & BTH_PSN_MASK; + u32 prev_psn = (qp->resp.ack_psn - 1) & BTH_PSN_MASK; if (pkt->mask & RXE_SEND_MASK || pkt->mask & RXE_WRITE_MASK) { @@ -1108,6 +1111,7 @@ static enum resp_states duplicate_reques res->state = (pkt->psn == res->first_psn) ? rdatm_res_state_new : rdatm_res_state_replay; + res->replay = 1; /* Reset the resource, except length. */ res->read.va_org = iova; --- a/drivers/infiniband/sw/rxe/rxe_verbs.h +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h @@ -171,6 +171,7 @@ enum rdatm_res_state { struct resp_res { int type; + int replay; u32 first_psn; u32 last_psn; u32 cur_psn; @@ -195,6 +196,7 @@ struct rxe_resp_info { enum rxe_qp_state state; u32 msn; u32 psn; + u32 ack_psn; int opcode; int drop_msg; int goto_error;