[openib-general] Re: [PATCH] mthca: missing cleanup in reset state
Roland Dreier
rolandd at cisco.com
Mon Nov 28 11:26:41 PST 2005
Michael> The following patch fixes system hangs I am sometimes
Michael> seeing when ipoib is brought down and back up.
Thanks, applied and queued for 2.6.15.
Michael> Should something similiar be done in libmthca?
I think so -- like this?
--- libmthca/src/qp.c (revision 4128)
+++ libmthca/src/qp.c (working copy)
@@ -65,6 +65,21 @@ static void *get_send_wqe(struct mthca_q
return qp->buf + qp->send_wqe_offset + (n << qp->sq.wqe_shift);
}
+void mthca_init_qp_indices(struct mthca_qp *qp)
+{
+ qp->sq.next_ind = 0;
+ qp->sq.last_comp = qp->sq.max - 1;
+ qp->sq.head = 0;
+ qp->sq.tail = 0;
+ qp->sq.last = get_send_wqe(qp, qp->sq.max - 1);
+
+ qp->rq.next_ind = 0;
+ qp->rq.last_comp = qp->rq.max - 1;
+ qp->rq.head = 0;
+ qp->rq.tail = 0;
+ qp->rq.last = get_recv_wqe(qp, qp->rq.max - 1);
+}
+
static inline int wq_overflow(struct mthca_wq *wq, int nreq, struct mthca_cq *cq)
{
unsigned cur;
--- libmthca/src/verbs.c (revision 4128)
+++ libmthca/src/verbs.c (working copy)
@@ -394,19 +394,6 @@ int mthca_destroy_srq(struct ibv_srq *sr
return 0;
}
-static void mthca_init_qp_indices(struct mthca_qp *qp)
-{
- qp->sq.next_ind = 0;
- qp->sq.last_comp = qp->sq.max - 1;
- qp->sq.head = 0;
- qp->sq.tail = 0;
-
- qp->rq.next_ind = 0;
- qp->rq.last_comp = qp->rq.max - 1;
- qp->rq.head = 0;
- qp->rq.tail = 0;
-}
-
struct ibv_qp *mthca_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr)
{
struct mthca_create_qp cmd;
@@ -427,11 +414,12 @@ struct ibv_qp *mthca_create_qp(struct ib
qp->sq.max = align_queue_size(pd->context, attr->cap.max_send_wr, 0);
qp->rq.max = align_queue_size(pd->context, attr->cap.max_recv_wr, 0);
- mthca_init_qp_indices(qp);
if (mthca_alloc_qp_buf(pd, &attr->cap, attr->qp_type, qp))
goto err;
+ mthca_init_qp_indices(qp);
+
if (pthread_spin_init(&qp->sq.lock, PTHREAD_PROCESS_PRIVATE) ||
pthread_spin_init(&qp->rq.lock, PTHREAD_PROCESS_PRIVATE))
goto err_free;
--- libmthca/src/mthca.h (revision 4128)
+++ libmthca/src/mthca.h (working copy)
@@ -310,6 +310,7 @@ extern struct ibv_qp *mthca_create_qp(st
extern int mthca_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
enum ibv_qp_attr_mask attr_mask);
extern int mthca_destroy_qp(struct ibv_qp *qp);
+extern void mthca_init_qp_indices(struct mthca_qp *qp);
extern int mthca_tavor_post_send(struct ibv_qp *ibqp, struct ibv_send_wr *wr,
struct ibv_send_wr **bad_wr);
extern int mthca_tavor_post_recv(struct ibv_qp *ibqp, struct ibv_recv_wr *wr,
--- libmthca/ChangeLog (revision 4128)
+++ libmthca/ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2005-11-28 Roland Dreier <roland at cisco.com>
+
+ * src/qp.c (mthca_init_qp_indices): Set qp->sq.last and
+ qp->rq.last so that QP is fully reset when the indices are
+ reinited on transition to RESET state.
+
2005-11-09 Roland Dreier <roland at cisco.com>
* src/srq.c (mthca_tavor_post_srq_recv), src/qp.c
More information about the general
mailing list