When compacting the cqe's, need to preserve the
proper ownership value of the cqe in case of wraparound.

Found by Ronni Zimmerman of Mellanox.

Signed-off-by: Jack Morgenstein <[EMAIL PROTECTED]>

diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 048c527..ced854d 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -496,14 +496,24 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, 
struct mlx4_ib_srq *srq)
         * that match our QP by copying older entries on top of them.
         */
        while ((int) --prod_index - (int) cq->mcq.cons_index >= 0) {
+               struct mlx4_cqe *q;
+               u8 own;
                cqe = get_cqe(cq, prod_index & cq->ibcq.cqe);
                if ((be32_to_cpu(cqe->my_qpn) & 0xffffff) == qpn) {
                        if (srq && !(cqe->owner_sr_opcode & 
MLX4_CQE_IS_SEND_MASK))
                                mlx4_ib_free_srq_wqe(srq, 
be16_to_cpu(cqe->wqe_index));
                        ++nfreed;
-               } else if (nfreed)
-                       memcpy(get_cqe(cq, (prod_index + nfreed) & 
cq->ibcq.cqe),
-                              cqe, sizeof *cqe);
+               } else if (nfreed) {
+                       /*
+                        * preserve proper ownership bit value in case of
+                        * wraparound.
+                        */
+                       q = get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe);
+                       own = q->owner_sr_opcode & MLX4_CQE_OWNER_MASK;
+                       memcpy(q, cqe, sizeof *cqe);
+                       q->owner_sr_opcode =
+                               (q->owner_sr_opcode & ~MLX4_CQE_OWNER_MASK) | 
own;
+               }
        }
 
        if (nfreed) {
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to