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