When cleaning up a CQ for a QP attached to SRQ, need to free an SRQ wqe
only if the CQE is a receive completion.

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

Index: openib/drivers/infiniband/hw/mthca/mthca_cq.c
===================================================================
--- openib.orig/drivers/infiniband/hw/mthca/mthca_cq.c
+++ openib/drivers/infiniband/hw/mthca/mthca_cq.c
@@ -150,6 +150,13 @@ struct mthca_err_cqe {
 #define MTHCA_ARBEL_CQ_DB_REQ_NOT      (2 << 24)
 #define MTHCA_ARBEL_CQ_DB_REQ_NOT_MULT (3 << 24)
 
+static inline int is_recv_cqe(struct mthca_cqe * cqe)
+{
+       return (((cqe->opcode & MTHCA_ERROR_CQE_OPCODE_MASK) ==
+                MTHCA_ERROR_CQE_OPCODE_MASK) ?
+               !(cqe->opcode & 0x01) : !(cqe->is_send & 0x80));
+}
+
 static inline struct mthca_cqe *get_cqe(struct mthca_cq *cq, int entry)
 {
        if (cq->is_direct)
@@ -296,7 +303,7 @@ void mthca_cq_clean(struct mthca_dev *de
        while ((int) --prod_index - (int) cq->cons_index >= 0) {
                cqe = get_cqe(cq, prod_index & cq->ibcq.cqe);
                if (cqe->my_qpn == cpu_to_be32(qpn)) {
-                       if (srq)
+                       if (srq && is_recv_cqe(cqe))
                                mthca_free_srq_wqe(srq, be32_to_cpu(cqe->wqe));
                        ++nfreed;
                } else if (nfreed)
_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

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

Reply via email to