From 54cee3079b1b51b06e66eb9aac559e16eb9d7d29 Mon Sep 17 00:00:00 2001 From: Wei Lin Guay Date: Mon, 30 May 2016 09:54:34 +0200 Subject: [PATCH] sif: cq: tear-down sequence in cleaning up the SendCQ MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This commit ensures that the sif_fixup_cqes for a sendCQ can only be executed after post_process_wa4074. As the CQE in a sendCQ cannot be trusted, walk_and_update CQ must be performed first. In a scenario where the post_process_wa4074 and sif_fixup_cqes are performed concurrently, the post_process_wa4074 is given priority where no polling of the SendCQ is allowed in sif_fixup_cqes. Then, post_process_wa4074 will generate the remaining FLUSH-IN ERR for a Send queue. Signed-off-by: Wei Lin Guay Reviewed-by: HÃ¥kon Bugge Reviewed-by: Knut Omang --- drivers/infiniband/hw/sif/sif_cq.c | 4 ++++ drivers/infiniband/hw/sif/sif_qp.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/drivers/infiniband/hw/sif/sif_cq.c b/drivers/infiniband/hw/sif/sif_cq.c index 26502cef3823..f3409f54c342 100644 --- a/drivers/infiniband/hw/sif/sif_cq.c +++ b/drivers/infiniband/hw/sif/sif_cq.c @@ -750,6 +750,10 @@ int sif_fixup_cqes(struct sif_cq *cq, struct sif_sq *sq, struct sif_qp *qp) struct psif_cq_entry lcqe; uint64_t wr_id_host_order = 0; + /* TBD - maybe should hide this as a function in sif_r3.c */ + if ((test_bit(CQ_POLLING_NOT_ALLOWED, &cq_sw->flags))) + break; + cqe = get_cq_entry(cq, seqno); polled_value = get_psif_cq_entry__seq_num(cqe); diff --git a/drivers/infiniband/hw/sif/sif_qp.c b/drivers/infiniband/hw/sif/sif_qp.c index 7c293d426ee8..8b5a59a69344 100644 --- a/drivers/infiniband/hw/sif/sif_qp.c +++ b/drivers/infiniband/hw/sif/sif_qp.c @@ -2153,6 +2153,14 @@ int destroy_qp(struct sif_dev *sdev, struct sif_qp *qp) struct sif_cq *recv_cq = rq ? get_sif_cq(sdev, cq_idx) : NULL; if (send_cq) { + ret = post_process_wa4074(sdev, qp); + if (ret) { + sif_log(sdev, SIF_INFO, + "post_process_wa4074 failed for qp %d send cq %d with error %d", + qp->qp_idx, sq->cq_idx, ret); + goto fixup_failed; + } + nfixup = sif_fixup_cqes(send_cq, sq, qp); if (nfixup < 0) { sif_log(sdev, SIF_INFO, -- 2.49.0