Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

IB/mthca: memfree completion with error FW bug workaround

Memfree firmware is in rare cases reporting WQE index == base - 1 in
receive completion with error, instead of (rq size - 1); base is 0 in
mthca. Here is a patch to avoid kernel crash and report a correct WR
id in this case.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by

Michael S. Tsirkin and committed by
Roland Dreier
4e56ea79 13aa6ecb

+10 -1
+10 -1
drivers/infiniband/hw/mthca/mthca_cq.c
··· 540 540 entry->wr_id = srq->wrid[wqe_index]; 541 541 mthca_free_srq_wqe(srq, wqe); 542 542 } else { 543 + s32 wqe; 543 544 wq = &(*cur_qp)->rq; 544 - wqe_index = be32_to_cpu(cqe->wqe) >> wq->wqe_shift; 545 + wqe = be32_to_cpu(cqe->wqe); 546 + wqe_index = wqe >> wq->wqe_shift; 547 + /* 548 + * WQE addr == base - 1 might be reported in receive completion 549 + * with error instead of (rq size - 1) by Sinai FW 1.0.800 and 550 + * Arbel FW 5.1.400. This bug should be fixed in later FW revs. 551 + */ 552 + if (unlikely(wqe_index < 0)) 553 + wqe_index = wq->max - 1; 545 554 entry->wr_id = (*cur_qp)->wrid[wqe_index]; 546 555 } 547 556