FAILED: patch "[PATCH] IB/hfi1: Unreserve a flushed OPFN request" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2b74c878b0eae4c32629c2d5ba69a29f69048313 Mon Sep 17 00:00:00 2001
From: Kaike Wan <[email protected]>
Date: Mon, 15 Jul 2019 12:45:28 -0400
Subject: [PATCH] IB/hfi1: Unreserve a flushed OPFN request
When an OPFN request is flushed, the request is completed without unreserving itself from the send queue. Subsequently, when a new request is post sent, the following warning will be triggered:
WARNING: CPU: 4 PID: 8130 at rdmavt/qp.c:1761 rvt_post_send+0x72a/0x880 [rdmavt] Call Trace: [<ffffffffbbb61e41>] dump_stack+0x19/0x1b [<ffffffffbb497688>] __warn+0xd8/0x100 [<ffffffffbb4977cd>] warn_slowpath_null+0x1d/0x20 [<ffffffffc01c941a>] rvt_post_send+0x72a/0x880 [rdmavt] [<ffffffffbb4dcabe>] ? account_entity_dequeue+0xae/0xd0 [<ffffffffbb61d645>] ? __kmalloc+0x55/0x230 [<ffffffffc04e1a4c>] ib_uverbs_post_send+0x37c/0x5d0 [ib_uverbs] [<ffffffffc04e5e36>] ? rdma_lookup_put_uobject+0x26/0x60 [ib_uverbs] [<ffffffffc04dbce6>] ib_uverbs_write+0x286/0x460 [ib_uverbs] [<ffffffffbb6f9457>] ? security_file_permission+0x27/0xa0 [<ffffffffbb641650>] vfs_write+0xc0/0x1f0 [<ffffffffbb64246f>] SyS_write+0x7f/0xf0 [<ffffffffbbb74ddb>] system_call_fastpath+0x22/0x27
This patch fixes the problem by moving rvt_qp_wqe_unreserve() into rvt_qp_complete_swqe() to simplify the code and make it less error-prone.
drivers/infiniband/hw/hfi1/rc.c +0 -2
@@ -1835,7 +1835,6 @@ void hfi1_rc_send_complete(struct rvt_qp *qp, struct hfi1_opa_header *opah) cmp_psn(qp->s_sending_psn, qp->s_sending_hpsn) <= 0)break ;trdma_clean_swqe (qp, wqe); -rvt_qp_wqe_unreserve (qp, wqe);trace_hfi1_qp_send_completion (qp, wqe, qp->s_last); rvt_qp_complete_swqe(qp, wqe,
@@ -1882,7 +1881,6 @@ struct rvt_swqe *do_rc_completion(struct rvt_qp *qp,if (cmp_psn (wqe->lpsn, qp->s_sending_psn) <0 ||cmp_psn (qp->s_sending_psn, qp->s_sending_hpsn) >0 ) {trdma_clean_swqe (qp, wqe); -rvt_qp_wqe_unreserve (qp, wqe);trace_hfi1_qp_send_completion (qp, wqe, qp->s_last); rvt_qp_complete_swqe(qp, wqe,
include/rdma/rdmavt_qp.h +4 -5
@@ -608,7 +608,7 @@ static inline void rvt_qp_wqe_reserve(/** * rvt_qp_wqe_unreserve - clean reserved operation * @qp - the rvt qp -* @wqe - the send wqe +* @flags - send wqe flags * * This decrements the reserve use count. *
@@ -620,11 +620,9 @@ static inline void rvt_qp_wqe_reserve(* the compiler does not juggle the order of the s_last * ring index and the decrementing of s_reserved_used. */ -static inline void rvt_qp_wqe_unreserve ( -struct rvt_qp *qp, -struct rvt_swqe *wqe) +static inline void rvt_qp_wqe_unreserve (struct rvt_qp *qp,int flags) { -if (unlikely (wqe->wr.send_flags &RVT_SEND_RESERVE_USED )) { +if (unlikely (flags &RVT_SEND_RESERVE_USED )) {atomic_dec (&qp->s_reserved_used);/* insure no compiler re-order up to s_last change */ smp_mb__after_atomic ();
@@ -853,6 +851,7 @@ rvt_qp_complete_swqe(struct rvt_qp *qp,u32 byte_len, last;int flags = wqe->wr.send_flags; +rvt_qp_wqe_unreserve (qp, flags);rvt_put_qp_swqe (qp, wqe); need_completion =