Sean, You mentioned that the cm_id leak was fixed, but I don't see a patch for it, so I'm submitting one. Fixed leak of cm_ids in server side of cmpost. Fixed an Oops if number of connections on server and client side don't match. Signed-off-by: Bill Jordan <[EMAIL PROTECTED]> Index: cmpost.c =================================================================== --- cmpost.c (revision 2369) +++ cmpost.c (working copy) @@ -207,7 +207,7 @@ static int modify_to_rts(struct cmtest_n return 0; } -static void req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) +static int req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) { struct cmtest_node *node; struct ib_cm_req_event_param *req; @@ -215,6 +215,10 @@ static void req_handler(struct ib_cm_id int ret; down(&test.sem); + if (test.conn_index == connections) { + up(&test.sem); + goto fail1; + } node = &test.nodes[ test.conn_index++]; up(&test.sem); @@ -223,11 +227,11 @@ static void req_handler(struct ib_cm_id ret = modify_to_rtr(node); if (ret) - goto fail; + goto fail2; ret = post_recvs(node); if (ret) - goto fail; + goto fail2; req = &event->param.req_rcvd; memset(&rep, 0, sizeof rep); @@ -243,15 +247,18 @@ static void req_handler(struct ib_cm_id ret = ib_send_cm_rep(cm_id, &rep); if (ret) { printk("cmpost: failed to send CM REP: %d\n", ret); - goto fail; + goto fail2; } - return; -fail: - printk("cmpost: failing connection request\n"); - ib_send_cm_rej(cm_id, IB_CM_REJ_UNSUPPORTED, NULL, 0, NULL, 0); + return 0; +fail2: + node->cm_id = NULL; atomic_dec(&test.disconnects_left); if (atomic_dec_and_test(&test.connects_left)) wake_up(&test.wait); +fail1: + printk("cmpost: failing connection request\n"); + ib_send_cm_rej(cm_id, IB_CM_REJ_UNSUPPORTED, NULL, 0, NULL, 0); + return -1; } static void rep_handler(struct cmtest_node *node, struct ib_cm_event *event) @@ -310,10 +317,11 @@ fail: static int cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) { struct cmtest_node *node = cm_id->context; + int ret = 0; switch (event->event) { case IB_CM_REQ_RECEIVED: - req_handler(cm_id, event); + ret = req_handler(cm_id, event); break; case IB_CM_REP_RECEIVED: rep_handler(node, event); @@ -349,7 +357,7 @@ static int cm_handler(struct ib_cm_id *c default: break; } - return 0; + return ret; } static void comp_handler(struct ib_cq *cq, void *cq_context) @@ -406,6 +414,8 @@ static int init_node(struct cmtest_node printk("cmpost: failed to create cm_id: %d\n", ret); return ret; } + } else { + node->cm_id = NULL; } cqe = message_count ? message_count * 2 : 2; @@ -438,7 +448,7 @@ static void destroy_node(struct cmtest_n { ib_destroy_qp(node->qp); ib_destroy_cq(node->cq); - if (!is_server) + if (node->cm_id) ib_destroy_cm_id(node->cm_id); }
-- Bill Jordan InfiniCon Systems _______________________________________________ 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