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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to