svn commit: r273811 - head/contrib/ofed/librdmacm/examples

Navdeep Parhar np at FreeBSD.org
Wed Oct 29 06:24:13 UTC 2014


Author: np
Date: Wed Oct 29 06:24:12 2014
New Revision: 273811
URL: https://svnweb.freebsd.org/changeset/base/273811

Log:
  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

Modified:
  head/contrib/ofed/librdmacm/examples/rping.c

Modified: head/contrib/ofed/librdmacm/examples/rping.c
==============================================================================
--- head/contrib/ofed/librdmacm/examples/rping.c	Wed Oct 29 04:32:46 2014	(r273810)
+++ head/contrib/ofed/librdmacm/examples/rping.c	Wed Oct 29 06:24:12 2014	(r273811)
@@ -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
 		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_thr
 
 	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
 
 	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
 		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);


More information about the svn-src-all mailing list