summaryrefslogtreecommitdiffstats
path: root/contrib/ofed
diff options
context:
space:
mode:
authornp <np@FreeBSD.org>2014-10-29 06:24:12 +0000
committernp <np@FreeBSD.org>2014-10-29 06:24:12 +0000
commite8852d82cc71dc9a97e048dd3eaa8993cf53fb78 (patch)
tree9ac5c268bf363ade033e2010e6f88761431dcee5 /contrib/ofed
parentbfd8ea0720840171bc38785724a72b105cde7a76 (diff)
downloadFreeBSD-src-e8852d82cc71dc9a97e048dd3eaa8993cf53fb78.zip
FreeBSD-src-e8852d82cc71dc9a97e048dd3eaa8993cf53fb78.tar.gz
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
Diffstat (limited to 'contrib/ofed')
-rw-r--r--contrib/ofed/librdmacm/examples/rping.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/contrib/ofed/librdmacm/examples/rping.c b/contrib/ofed/librdmacm/examples/rping.c
index 40e6bf4..9bbfab1 100644
--- a/contrib/ofed/librdmacm/examples/rping.c
+++ b/contrib/ofed/librdmacm/examples/rping.c
@@ -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);
OpenPOWER on IntegriCloud