identify the race condition in this code and win the respect of linux-rdma developers!

From: Hefty, Sean <hidden>
Date: 2011-09-15 23:58:34

I have a ping-pong test application that loops doing: send, wait for send completion, wait for receive completion.  The test occasionally hangs in the following code at ibv_get_cq_event() (error handling removed):

Case 1:
	ret = ibv_poll_cq(id->recv_cq, 1, wc);
	ret = ibv_req_notify_cq(id->recv_cq, 0);

	while (!(ret = ibv_poll_cq(id->recv_cq, 1, wc))) {
		ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
		ibv_ack_cq_events(id->recv_cq, 1);
	}

The test does NOT hang if the code is restructured as either of the below: 

Case 2:
	ret = ibv_poll_cq(id->recv_cq, 1, wc);
	ret = ibv_req_notify_cq(id->recv_cq, 0);

	do {
		ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
		ibv_ack_cq_events(id->recv_cq, 1);
	} while (!(ret = ibv_poll_cq(id->recv_cq, 1, wc)));

or
Case 3:
	ret = ibv_poll_cq(id->recv_cq, 1, wc);
	while (1)
		ret = ibv_req_notify_cq(id->recv_cq, 0);

		ret = ibv_poll_cq(id->recv_cq, 1, wc);
		if (ret)
			break;
		ret = ibv_get_cq_event(id->recv_cq_channel, &cq, &context);
		ibv_ack_cq_events(id->recv_cq, 1);
	}

Personally, I would have expected case 2 to hang and cases 1 and 3 to work.  Does anyone see why case 1 should hang?  This is with mlx4.

- Sean
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help