rping: make sure that the CQ event thread can never poll a CQ after it

has been destroyed.

Submitted by:	Hariprasad at Chelsio dot com
Sponsored by:	Chelsio Communications
This commit is contained in:
Navdeep Parhar 2014-10-29 06:24:12 +00:00
parent 05f0ff5a30
commit 1db6552d17
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=273811

View File

@ -40,7 +40,6 @@
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <byteswap.h>
#include <semaphore.h>
#include <arpa/inet.h>
#include <pthread.h>
@ -280,10 +279,10 @@ static int rping_cq_event_handler(struct rping_cb *cb)
ret = 0;
if (wc.status) {
fprintf(stderr, "cq completion failed status %d\n",
wc.status);
if (wc.status != IBV_WC_WR_FLUSH_ERR)
ret = -1;
fprintf(stderr, "cq completion failed status %d\n",
wc.status);
ret = -1;
goto error;
}
@ -800,10 +799,9 @@ static void *rping_persistent_server_thread(void *arg)
rping_test_server(cb);
rdma_disconnect(cb->child_cm_id);
pthread_join(cb->cqthread, NULL);
rping_free_buffers(cb);
rping_free_qp(cb);
pthread_cancel(cb->cqthread);
pthread_join(cb->cqthread, NULL);
rdma_destroy_id(cb->child_cm_id);
free_cb(cb);
return NULL;
@ -888,6 +886,7 @@ static int rping_run_server(struct rping_cb *cb)
rping_test_server(cb);
rdma_disconnect(cb->child_cm_id);
pthread_join(cb->cqthread, NULL);
rdma_destroy_id(cb->child_cm_id);
err2:
rping_free_buffers(cb);
@ -1053,9 +1052,16 @@ static int rping_run_client(struct rping_cb *cb)
goto err2;
}
rping_test_client(cb);
ret = rping_test_client(cb);
if (ret) {
fprintf(stderr, "rping client failed: %d\n", ret);
goto err3;
}
ret = 0;
err3:
rdma_disconnect(cb->cm_id);
err2:
pthread_join(cb->cqthread, NULL);
rping_free_buffers(cb);
err1:
rping_free_qp(cb);