Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp621138img; Fri, 22 Mar 2019 05:19:23 -0700 (PDT) X-Google-Smtp-Source: APXvYqwX9j7FEr4L9ZFvw+qZCTpIm7+MaVGSwNO334LhX7a9o9wUw3ebP52rj+zMdOp1o8Qrv38I X-Received: by 2002:a63:d158:: with SMTP id c24mr8518572pgj.34.1553257163287; Fri, 22 Mar 2019 05:19:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553257163; cv=none; d=google.com; s=arc-20160816; b=0wCvTLy1VMC30gNkM8lxAsXXnnjdCyGMOzmcrm2w0qfwsymcsIjTPdYpPi/myRyej1 AwajovjbGc0QoU9tPgnaUajH+FzI2iC6gCUvZ26x2VNMAw0mteNLhroeQHI8TiR5bcjq D1xG5tGE3uWWUcI3btuhV2eERfTe/k1zmMn91pPXzOybSdmtFy8L00IHEQUFcQpfuOKF Wsm5GpfqibruChvP96uQaoNhrSs0vA8jCYEx0bbdeUlOxQjLRYuxxA0aIeslg0ULxi3Q B1yzrpJx/isIrjHEoKJ+JjPdXw0snvUZtSF8vRm9nJ6qxVw+19rZTJgXWpApnqT4dRcp Z0OQ== 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=n6y9pNgk8AAO+DD2Xr15sDXckuoeIt4RZ7WKpd9fqZI=; b=Uz0wXuOlJuUTONNvOlnI/38xnZ16plAZmCJ3U9Hbj8HIG9eUhjU/j3fmb4AdT+v9P4 /ke6kjQP0xT3w2T7jx6wtiMzc0wJ3tvDEpVtRPhtpnir7PvgfaA7PNDz8jFGW2Y/A4U1 SRBCxf0gLRJUS87Yd1otk6BoGZlkPaf/vSOhImZ7tCUBWN+j1xcJTFZopl+pyi6J4J+1 MUh/SflrYApDT6XCVDnrViQX2st2Pu81Dam4g/mRRYP9D3aLHmDFKDCBMuUflt3dcSTC a2k/QfEivb6ykogd0s74uI+R0dUKVIooIE/V022k2zKPc7Dut0HaI1xl5a2nmyCZM9ZV U7uQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="k+/S20Qi"; 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 g5si6465758pgc.122.2019.03.22.05.19.08; Fri, 22 Mar 2019 05:19:23 -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="k+/S20Qi"; 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 S2390526AbfCVMSf (ORCPT + 99 others); Fri, 22 Mar 2019 08:18:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:57456 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390322AbfCVMSc (ORCPT ); Fri, 22 Mar 2019 08:18:32 -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 0226E218A1; Fri, 22 Mar 2019 12:18:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553257111; bh=WcWHsNNVlV1q3rfuDshAlJVM4NiN5y2gIrAeMPBbTzA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k+/S20Qi8zD4ZlJNVWrckJoRqakT/efYkUAKnRW7vSx8WZ8BEewAd9z32END12YUw znndRJP+S533pYc3FscejJ0SQiooChPsNGrr1YojmHaA0neByZGqV3/apAw35Yq/vl NdvmxBVtRT2pWK3sX2wAAddnJEE5HqowTP+utmzg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mike Marciniszyn , "Michael J. Ruhl" , Dennis Dalessandro , Jason Gunthorpe Subject: [PATCH 5.0 136/238] IB/rdmavt: Fix concurrency panics in QP post_send and modify to error Date: Fri, 22 Mar 2019 12:15:55 +0100 Message-Id: <20190322111306.470949972@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: Michael J. Ruhl commit d757c60eca9b22f4d108929a24401e0fdecda0b1 upstream. The RC/UC code path can go through a software loopback. In this code path the receive side QP is manipulated. If two threads are working on the QP receive side (i.e. post_send, and modify_qp to an error state), QP information can be corrupted. (post_send via loopback) set r_sge loop update r_sge (modify_qp) take r_lock update r_sge <---- r_sge is now incorrect (post_send) update r_sge <---- crash, etc. ... This can lead to one of the two following crashes: BUG: unable to handle kernel NULL pointer dereference at (null) IP: hfi1_copy_sge+0xf1/0x2e0 [hfi1] PGD 8000001fe6a57067 PUD 1fd9e0c067 PMD 0 Call Trace: ruc_loopback+0x49b/0xbc0 [hfi1] hfi1_do_send+0x38e/0x3e0 [hfi1] _hfi1_do_send+0x1e/0x20 [hfi1] process_one_work+0x17f/0x440 worker_thread+0x126/0x3c0 kthread+0xd1/0xe0 ret_from_fork_nospec_begin+0x21/0x21 or: BUG: unable to handle kernel NULL pointer dereference at 0000000000000048 IP: rvt_clear_mr_refs+0x45/0x370 [rdmavt] PGD 80000006ae5eb067 PUD ef15d0067 PMD 0 Call Trace: rvt_error_qp+0xaa/0x240 [rdmavt] rvt_modify_qp+0x47f/0xaa0 [rdmavt] ib_security_modify_qp+0x8f/0x400 [ib_core] ib_modify_qp_with_udata+0x44/0x70 [ib_core] modify_qp.isra.23+0x1eb/0x2b0 [ib_uverbs] ib_uverbs_modify_qp+0xaa/0xf0 [ib_uverbs] ib_uverbs_write+0x272/0x430 [ib_uverbs] vfs_write+0xc0/0x1f0 SyS_write+0x7f/0xf0 system_call_fastpath+0x1c/0x21 Fix by using the appropriate locking on the receiving QP. Fixes: 15703461533a ("IB/{hfi1, qib, rdmavt}: Move ruc_loopback to rdmavt") Cc: #v4.9+ Reviewed-by: Mike Marciniszyn Signed-off-by: Michael J. Ruhl Signed-off-by: Dennis Dalessandro Signed-off-by: Jason Gunthorpe Signed-off-by: Greg Kroah-Hartman --- drivers/infiniband/sw/rdmavt/qp.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) --- a/drivers/infiniband/sw/rdmavt/qp.c +++ b/drivers/infiniband/sw/rdmavt/qp.c @@ -2785,6 +2785,18 @@ again: } EXPORT_SYMBOL(rvt_copy_sge); +static enum ib_wc_status loopback_qp_drop(struct rvt_ibport *rvp, + struct rvt_qp *sqp) +{ + rvp->n_pkt_drops++; + /* + * For RC, the requester would timeout and retry so + * shortcut the timeouts and just signal too many retries. + */ + return sqp->ibqp.qp_type == IB_QPT_RC ? + IB_WC_RETRY_EXC_ERR : IB_WC_SUCCESS; +} + /** * ruc_loopback - handle UC and RC loopback requests * @sqp: the sending QP @@ -2857,17 +2869,14 @@ again: } spin_unlock_irqrestore(&sqp->s_lock, flags); - if (!qp || !(ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) || + if (!qp) { + send_status = loopback_qp_drop(rvp, sqp); + goto serr_no_r_lock; + } + spin_lock_irqsave(&qp->r_lock, flags); + if (!(ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) || qp->ibqp.qp_type != sqp->ibqp.qp_type) { - rvp->n_pkt_drops++; - /* - * For RC, the requester would timeout and retry so - * shortcut the timeouts and just signal too many retries. - */ - if (sqp->ibqp.qp_type == IB_QPT_RC) - send_status = IB_WC_RETRY_EXC_ERR; - else - send_status = IB_WC_SUCCESS; + send_status = loopback_qp_drop(rvp, sqp); goto serr; } @@ -3047,6 +3056,7 @@ do_write: wqe->wr.send_flags & IB_SEND_SOLICITED); send_comp: + spin_unlock_irqrestore(&qp->r_lock, flags); spin_lock_irqsave(&sqp->s_lock, flags); rvp->n_loop_pkts++; flush_send: @@ -3073,6 +3083,7 @@ rnr_nak: } if (sqp->s_rnr_retry_cnt < 7) sqp->s_rnr_retry--; + spin_unlock_irqrestore(&qp->r_lock, flags); spin_lock_irqsave(&sqp->s_lock, flags); if (!(ib_rvt_state_ops[sqp->state] & RVT_PROCESS_RECV_OK)) goto clr_busy; @@ -3101,6 +3112,8 @@ err: rvt_rc_error(qp, wc.status); serr: + spin_unlock_irqrestore(&qp->r_lock, flags); +serr_no_r_lock: spin_lock_irqsave(&sqp->s_lock, flags); rvt_send_complete(sqp, wqe, send_status); if (sqp->ibqp.qp_type == IB_QPT_RC) {