Lines Matching full:cb

164 	struct rping_cb *cb = cma_id->context;  in rping_cma_event_handler()  local
168 (cma_id == cb->cm_id) ? "parent" : "child"); in rping_cma_event_handler()
172 cb->state = ADDR_RESOLVED; in rping_cma_event_handler()
175 cb->state = ERROR; in rping_cma_event_handler()
177 sem_post(&cb->sem); in rping_cma_event_handler()
182 cb->state = ROUTE_RESOLVED; in rping_cma_event_handler()
183 sem_post(&cb->sem); in rping_cma_event_handler()
187 cb->state = CONNECT_REQUEST; in rping_cma_event_handler()
188 cb->child_cm_id = cma_id; in rping_cma_event_handler()
189 DEBUG_LOG("child cma %p\n", cb->child_cm_id); in rping_cma_event_handler()
190 sem_post(&cb->sem); in rping_cma_event_handler()
199 if (!cb->server) { in rping_cma_event_handler()
200 cb->state = CONNECTED; in rping_cma_event_handler()
202 sem_post(&cb->sem); in rping_cma_event_handler()
212 sem_post(&cb->sem); in rping_cma_event_handler()
218 cb->server ? "server" : "client"); in rping_cma_event_handler()
219 cb->state = DISCONNECTED; in rping_cma_event_handler()
220 sem_post(&cb->sem); in rping_cma_event_handler()
225 cb->state = ERROR; in rping_cma_event_handler()
226 sem_post(&cb->sem); in rping_cma_event_handler()
239 static int server_recv(struct rping_cb *cb, struct ibv_wc *wc) in server_recv() argument
241 if (wc->byte_len != sizeof(cb->recv_buf)) { in server_recv()
246 cb->remote_rkey = be32toh(cb->recv_buf.rkey); in server_recv()
247 cb->remote_addr = be64toh(cb->recv_buf.buf); in server_recv()
248 cb->remote_len = be32toh(cb->recv_buf.size); in server_recv()
250 cb->remote_rkey, cb->remote_addr, cb->remote_len); in server_recv()
252 if (cb->state <= CONNECTED || cb->state == RDMA_WRITE_COMPLETE) in server_recv()
253 cb->state = RDMA_READ_ADV; in server_recv()
255 cb->state = RDMA_WRITE_ADV; in server_recv()
260 static int client_recv(struct rping_cb *cb, struct ibv_wc *wc) in client_recv() argument
262 if (wc->byte_len != sizeof(cb->recv_buf)) { in client_recv()
267 if (cb->state == RDMA_READ_ADV) in client_recv()
268 cb->state = RDMA_WRITE_ADV; in client_recv()
270 cb->state = RDMA_WRITE_COMPLETE; in client_recv()
275 static int rping_cq_event_handler(struct rping_cb *cb) in rping_cq_event_handler() argument
282 while ((ret = ibv_poll_cq(cb->cq, 1, &wc)) == 1) { in rping_cq_event_handler()
305 cb->state = RDMA_WRITE_COMPLETE; in rping_cq_event_handler()
306 sem_post(&cb->sem); in rping_cq_event_handler()
311 cb->state = RDMA_READ_COMPLETE; in rping_cq_event_handler()
312 sem_post(&cb->sem); in rping_cq_event_handler()
317 ret = cb->server ? server_recv(cb, &wc) : in rping_cq_event_handler()
318 client_recv(cb, &wc); in rping_cq_event_handler()
324 ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr); in rping_cq_event_handler()
329 sem_post(&cb->sem); in rping_cq_event_handler()
345 cb->state = ERROR; in rping_cq_event_handler()
346 sem_post(&cb->sem); in rping_cq_event_handler()
350 static int rping_accept(struct rping_cb *cb) in rping_accept() argument
356 ret = rdma_accept(cb->child_cm_id, NULL); in rping_accept()
362 sem_wait(&cb->sem); in rping_accept()
363 if (cb->state == ERROR) { in rping_accept()
364 fprintf(stderr, "wait for CONNECTED state %d\n", cb->state); in rping_accept()
370 static void rping_setup_wr(struct rping_cb *cb) in rping_setup_wr() argument
372 cb->recv_sgl.addr = (uint64_t) (unsigned long) &cb->recv_buf; in rping_setup_wr()
373 cb->recv_sgl.length = sizeof cb->recv_buf; in rping_setup_wr()
374 cb->recv_sgl.lkey = cb->recv_mr->lkey; in rping_setup_wr()
375 cb->rq_wr.sg_list = &cb->recv_sgl; in rping_setup_wr()
376 cb->rq_wr.num_sge = 1; in rping_setup_wr()
378 cb->send_sgl.addr = (uint64_t) (unsigned long) &cb->send_buf; in rping_setup_wr()
379 cb->send_sgl.length = sizeof cb->send_buf; in rping_setup_wr()
380 cb->send_sgl.lkey = cb->send_mr->lkey; in rping_setup_wr()
382 cb->sq_wr.opcode = IBV_WR_SEND; in rping_setup_wr()
383 cb->sq_wr.send_flags = IBV_SEND_SIGNALED; in rping_setup_wr()
384 cb->sq_wr.sg_list = &cb->send_sgl; in rping_setup_wr()
385 cb->sq_wr.num_sge = 1; in rping_setup_wr()
387 cb->rdma_sgl.addr = (uint64_t) (unsigned long) cb->rdma_buf; in rping_setup_wr()
388 cb->rdma_sgl.lkey = cb->rdma_mr->lkey; in rping_setup_wr()
389 cb->rdma_sq_wr.send_flags = IBV_SEND_SIGNALED; in rping_setup_wr()
390 cb->rdma_sq_wr.sg_list = &cb->rdma_sgl; in rping_setup_wr()
391 cb->rdma_sq_wr.num_sge = 1; in rping_setup_wr()
394 static int rping_setup_buffers(struct rping_cb *cb) in rping_setup_buffers() argument
398 DEBUG_LOG("rping_setup_buffers called on cb %p\n", cb); in rping_setup_buffers()
400 cb->recv_mr = ibv_reg_mr(cb->pd, &cb->recv_buf, sizeof cb->recv_buf, in rping_setup_buffers()
402 if (!cb->recv_mr) { in rping_setup_buffers()
407 cb->send_mr = ibv_reg_mr(cb->pd, &cb->send_buf, sizeof cb->send_buf, 0); in rping_setup_buffers()
408 if (!cb->send_mr) { in rping_setup_buffers()
414 cb->rdma_buf = malloc(cb->size); in rping_setup_buffers()
415 if (!cb->rdma_buf) { in rping_setup_buffers()
421 cb->rdma_mr = ibv_reg_mr(cb->pd, cb->rdma_buf, cb->size, in rping_setup_buffers()
425 if (!cb->rdma_mr) { in rping_setup_buffers()
431 if (!cb->server) { in rping_setup_buffers()
432 cb->start_buf = malloc(cb->size); in rping_setup_buffers()
433 if (!cb->start_buf) { in rping_setup_buffers()
439 cb->start_mr = ibv_reg_mr(cb->pd, cb->start_buf, cb->size, in rping_setup_buffers()
443 if (!cb->start_mr) { in rping_setup_buffers()
450 rping_setup_wr(cb); in rping_setup_buffers()
455 free(cb->start_buf); in rping_setup_buffers()
457 ibv_dereg_mr(cb->rdma_mr); in rping_setup_buffers()
459 free(cb->rdma_buf); in rping_setup_buffers()
461 ibv_dereg_mr(cb->send_mr); in rping_setup_buffers()
463 ibv_dereg_mr(cb->recv_mr); in rping_setup_buffers()
467 static void rping_free_buffers(struct rping_cb *cb) in rping_free_buffers() argument
469 DEBUG_LOG("rping_free_buffers called on cb %p\n", cb); in rping_free_buffers()
470 ibv_dereg_mr(cb->recv_mr); in rping_free_buffers()
471 ibv_dereg_mr(cb->send_mr); in rping_free_buffers()
472 ibv_dereg_mr(cb->rdma_mr); in rping_free_buffers()
473 free(cb->rdma_buf); in rping_free_buffers()
474 if (!cb->server) { in rping_free_buffers()
475 ibv_dereg_mr(cb->start_mr); in rping_free_buffers()
476 free(cb->start_buf); in rping_free_buffers()
480 static int rping_create_qp(struct rping_cb *cb) in rping_create_qp() argument
491 init_attr.send_cq = cb->cq; in rping_create_qp()
492 init_attr.recv_cq = cb->cq; in rping_create_qp()
494 if (cb->server) { in rping_create_qp()
495 ret = rdma_create_qp(cb->child_cm_id, cb->pd, &init_attr); in rping_create_qp()
497 cb->qp = cb->child_cm_id->qp; in rping_create_qp()
499 ret = rdma_create_qp(cb->cm_id, cb->pd, &init_attr); in rping_create_qp()
501 cb->qp = cb->cm_id->qp; in rping_create_qp()
507 static void rping_free_qp(struct rping_cb *cb) in rping_free_qp() argument
509 ibv_destroy_qp(cb->qp); in rping_free_qp()
510 ibv_destroy_cq(cb->cq); in rping_free_qp()
511 ibv_destroy_comp_channel(cb->channel); in rping_free_qp()
512 ibv_dealloc_pd(cb->pd); in rping_free_qp()
515 static int rping_setup_qp(struct rping_cb *cb, struct rdma_cm_id *cm_id) in rping_setup_qp() argument
519 cb->pd = ibv_alloc_pd(cm_id->verbs); in rping_setup_qp()
520 if (!cb->pd) { in rping_setup_qp()
524 DEBUG_LOG("created pd %p\n", cb->pd); in rping_setup_qp()
526 cb->channel = ibv_create_comp_channel(cm_id->verbs); in rping_setup_qp()
527 if (!cb->channel) { in rping_setup_qp()
532 DEBUG_LOG("created channel %p\n", cb->channel); in rping_setup_qp()
534 cb->cq = ibv_create_cq(cm_id->verbs, RPING_SQ_DEPTH * 2, cb, in rping_setup_qp()
535 cb->channel, 0); in rping_setup_qp()
536 if (!cb->cq) { in rping_setup_qp()
541 DEBUG_LOG("created cq %p\n", cb->cq); in rping_setup_qp()
543 ret = ibv_req_notify_cq(cb->cq, 0); in rping_setup_qp()
550 ret = rping_create_qp(cb); in rping_setup_qp()
555 DEBUG_LOG("created qp %p\n", cb->qp); in rping_setup_qp()
559 ibv_destroy_cq(cb->cq); in rping_setup_qp()
561 ibv_destroy_comp_channel(cb->channel); in rping_setup_qp()
563 ibv_dealloc_pd(cb->pd); in rping_setup_qp()
569 struct rping_cb *cb = arg; in cm_thread() local
574 ret = rdma_get_cm_event(cb->cm_channel, &event); in cm_thread()
588 struct rping_cb *cb = arg; in cq_thread() local
598 ret = ibv_get_cq_event(cb->channel, &ev_cq, &ev_ctx); in cq_thread()
603 if (ev_cq != cb->cq) { in cq_thread()
607 ret = ibv_req_notify_cq(cb->cq, 0); in cq_thread()
612 ret = rping_cq_event_handler(cb); in cq_thread()
613 ibv_ack_cq_events(cb->cq, 1); in cq_thread()
619 static void rping_format_send(struct rping_cb *cb, char *buf, struct ibv_mr *mr) in rping_format_send() argument
621 struct rping_rdma_info *info = &cb->send_buf; in rping_format_send()
625 info->size = htobe32(cb->size); in rping_format_send()
631 static int rping_test_server(struct rping_cb *cb) in rping_test_server() argument
638 sem_wait(&cb->sem); in rping_test_server()
639 if (cb->state != RDMA_READ_ADV) { in rping_test_server()
641 cb->state); in rping_test_server()
649 cb->rdma_sq_wr.opcode = IBV_WR_RDMA_READ; in rping_test_server()
650 cb->rdma_sq_wr.wr.rdma.rkey = cb->remote_rkey; in rping_test_server()
651 cb->rdma_sq_wr.wr.rdma.remote_addr = cb->remote_addr; in rping_test_server()
652 cb->rdma_sq_wr.sg_list->length = cb->remote_len; in rping_test_server()
654 ret = ibv_post_send(cb->qp, &cb->rdma_sq_wr, &bad_wr); in rping_test_server()
662 sem_wait(&cb->sem); in rping_test_server()
663 if (cb->state != RDMA_READ_COMPLETE) { in rping_test_server()
665 cb->state); in rping_test_server()
672 if (cb->verbose) in rping_test_server()
673 printf("server ping data: %s\n", cb->rdma_buf); in rping_test_server()
676 ret = ibv_post_send(cb->qp, &cb->sq_wr, &bad_wr); in rping_test_server()
684 sem_wait(&cb->sem); in rping_test_server()
685 if (cb->state != RDMA_WRITE_ADV) { in rping_test_server()
687 cb->state); in rping_test_server()
694 cb->rdma_sq_wr.opcode = IBV_WR_RDMA_WRITE; in rping_test_server()
695 cb->rdma_sq_wr.wr.rdma.rkey = cb->remote_rkey; in rping_test_server()
696 cb->rdma_sq_wr.wr.rdma.remote_addr = cb->remote_addr; in rping_test_server()
697 cb->rdma_sq_wr.sg_list->length = strlen(cb->rdma_buf) + 1; in rping_test_server()
699 cb->rdma_sq_wr.sg_list->lkey, in rping_test_server()
700 cb->rdma_sq_wr.sg_list->addr, in rping_test_server()
701 cb->rdma_sq_wr.sg_list->length); in rping_test_server()
703 ret = ibv_post_send(cb->qp, &cb->rdma_sq_wr, &bad_wr); in rping_test_server()
710 ret = sem_wait(&cb->sem); in rping_test_server()
711 if (cb->state != RDMA_WRITE_COMPLETE) { in rping_test_server()
713 cb->state); in rping_test_server()
720 ret = ibv_post_send(cb->qp, &cb->sq_wr, &bad_wr); in rping_test_server()
728 return (cb->state == DISCONNECTED) ? 0 : ret; in rping_test_server()
731 static int rping_bind_server(struct rping_cb *cb) in rping_bind_server() argument
735 if (cb->sin.ss_family == AF_INET) in rping_bind_server()
736 ((struct sockaddr_in *) &cb->sin)->sin_port = cb->port; in rping_bind_server()
738 ((struct sockaddr_in6 *) &cb->sin)->sin6_port = cb->port; in rping_bind_server()
740 ret = rdma_bind_addr(cb->cm_id, (struct sockaddr *) &cb->sin); in rping_bind_server()
748 ret = rdma_listen(cb->cm_id, 3); in rping_bind_server()
759 struct rping_cb *cb = malloc(sizeof *cb); in clone_cb() local
760 if (!cb) in clone_cb()
762 memset(cb, 0, sizeof *cb); in clone_cb()
763 *cb = *listening_cb; in clone_cb()
764 cb->child_cm_id->context = cb; in clone_cb()
765 return cb; in clone_cb()
768 static void free_cb(struct rping_cb *cb) in free_cb() argument
770 free(cb); in free_cb()
775 struct rping_cb *cb = arg; in rping_persistent_server_thread() local
779 ret = rping_setup_qp(cb, cb->child_cm_id); in rping_persistent_server_thread()
785 ret = rping_setup_buffers(cb); in rping_persistent_server_thread()
791 ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr); in rping_persistent_server_thread()
797 ret = pthread_create(&cb->cqthread, NULL, cq_thread, cb); in rping_persistent_server_thread()
803 ret = rping_accept(cb); in rping_persistent_server_thread()
809 rping_test_server(cb); in rping_persistent_server_thread()
810 rdma_disconnect(cb->child_cm_id); in rping_persistent_server_thread()
811 pthread_join(cb->cqthread, NULL); in rping_persistent_server_thread()
812 rping_free_buffers(cb); in rping_persistent_server_thread()
813 rping_free_qp(cb); in rping_persistent_server_thread()
814 rdma_destroy_id(cb->child_cm_id); in rping_persistent_server_thread()
815 free_cb(cb); in rping_persistent_server_thread()
818 pthread_cancel(cb->cqthread); in rping_persistent_server_thread()
819 pthread_join(cb->cqthread, NULL); in rping_persistent_server_thread()
821 rping_free_buffers(cb); in rping_persistent_server_thread()
823 rping_free_qp(cb); in rping_persistent_server_thread()
825 free_cb(cb); in rping_persistent_server_thread()
832 struct rping_cb *cb; in rping_run_persistent_server() local
862 cb = clone_cb(listening_cb); in rping_run_persistent_server()
863 if (!cb) in rping_run_persistent_server()
866 ret = pthread_create(&cb->persistent_server_thread, &attr, rping_persistent_server_thread, cb); in rping_run_persistent_server()
875 static int rping_run_server(struct rping_cb *cb) in rping_run_server() argument
880 ret = rping_bind_server(cb); in rping_run_server()
884 sem_wait(&cb->sem); in rping_run_server()
885 if (cb->state != CONNECT_REQUEST) { in rping_run_server()
887 cb->state); in rping_run_server()
891 ret = rping_setup_qp(cb, cb->child_cm_id); in rping_run_server()
897 ret = rping_setup_buffers(cb); in rping_run_server()
903 ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr); in rping_run_server()
909 ret = pthread_create(&cb->cqthread, NULL, cq_thread, cb); in rping_run_server()
915 ret = rping_accept(cb); in rping_run_server()
921 ret = rping_test_server(cb); in rping_run_server()
929 rdma_disconnect(cb->child_cm_id); in rping_run_server()
930 pthread_join(cb->cqthread, NULL); in rping_run_server()
931 rdma_destroy_id(cb->child_cm_id); in rping_run_server()
933 rping_free_buffers(cb); in rping_run_server()
935 rping_free_qp(cb); in rping_run_server()
940 static int rping_test_client(struct rping_cb *cb) in rping_test_client() argument
947 for (ping = 0; !cb->count || ping < cb->count; ping++) { in rping_test_client()
948 cb->state = RDMA_READ_ADV; in rping_test_client()
951 cc = snprintf(cb->start_buf, cb->size, RPING_MSG_FMT, ping); in rping_test_client()
952 for (i = cc, c = start; i < cb->size; i++) { in rping_test_client()
953 cb->start_buf[i] = c; in rping_test_client()
961 cb->start_buf[cb->size - 1] = 0; in rping_test_client()
963 rping_format_send(cb, cb->start_buf, cb->start_mr); in rping_test_client()
964 ret = ibv_post_send(cb->qp, &cb->sq_wr, &bad_wr); in rping_test_client()
971 sem_wait(&cb->sem); in rping_test_client()
972 if (cb->state != RDMA_WRITE_ADV) { in rping_test_client()
974 cb->state); in rping_test_client()
979 rping_format_send(cb, cb->rdma_buf, cb->rdma_mr); in rping_test_client()
980 ret = ibv_post_send(cb->qp, &cb->sq_wr, &bad_wr); in rping_test_client()
987 sem_wait(&cb->sem); in rping_test_client()
988 if (cb->state != RDMA_WRITE_COMPLETE) { in rping_test_client()
990 cb->state); in rping_test_client()
995 if (cb->validate) in rping_test_client()
996 if (memcmp(cb->start_buf, cb->rdma_buf, cb->size)) { in rping_test_client()
1002 if (cb->verbose) in rping_test_client()
1003 printf("ping data: %s\n", cb->rdma_buf); in rping_test_client()
1006 return (cb->state == DISCONNECTED) ? 0 : ret; in rping_test_client()
1009 static int rping_connect_client(struct rping_cb *cb) in rping_connect_client() argument
1019 ret = rdma_connect(cb->cm_id, &conn_param); in rping_connect_client()
1025 sem_wait(&cb->sem); in rping_connect_client()
1026 if (cb->state != CONNECTED) { in rping_connect_client()
1027 fprintf(stderr, "wait for CONNECTED state %d\n", cb->state); in rping_connect_client()
1035 static int rping_bind_client(struct rping_cb *cb) in rping_bind_client() argument
1039 if (cb->sin.ss_family == AF_INET) in rping_bind_client()
1040 ((struct sockaddr_in *) &cb->sin)->sin_port = cb->port; in rping_bind_client()
1042 ((struct sockaddr_in6 *) &cb->sin)->sin6_port = cb->port; in rping_bind_client()
1044 if (cb->ssource.ss_family) in rping_bind_client()
1045 ret = rdma_resolve_addr(cb->cm_id, (struct sockaddr *) &cb->ssource, in rping_bind_client()
1046 (struct sockaddr *) &cb->sin, 2000); in rping_bind_client()
1048 ret = rdma_resolve_addr(cb->cm_id, NULL, (struct sockaddr *) &cb->sin, 2000); in rping_bind_client()
1055 sem_wait(&cb->sem); in rping_bind_client()
1056 if (cb->state != ROUTE_RESOLVED) { in rping_bind_client()
1058 cb->state); in rping_bind_client()
1066 static int rping_run_client(struct rping_cb *cb) in rping_run_client() argument
1071 ret = rping_bind_client(cb); in rping_run_client()
1075 ret = rping_setup_qp(cb, cb->cm_id); in rping_run_client()
1081 ret = rping_setup_buffers(cb); in rping_run_client()
1087 ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr); in rping_run_client()
1093 ret = pthread_create(&cb->cqthread, NULL, cq_thread, cb); in rping_run_client()
1099 ret = rping_connect_client(cb); in rping_run_client()
1105 ret = rping_test_client(cb); in rping_run_client()
1113 rdma_disconnect(cb->cm_id); in rping_run_client()
1115 pthread_join(cb->cqthread, NULL); in rping_run_client()
1117 rping_free_buffers(cb); in rping_run_client()
1119 rping_free_qp(cb); in rping_run_client()
1167 struct rping_cb *cb; in main() local
1172 cb = malloc(sizeof(*cb)); in main()
1173 if (!cb) in main()
1176 memset(cb, 0, sizeof(*cb)); in main()
1177 cb->server = -1; in main()
1178 cb->state = IDLE; in main()
1179 cb->size = 64; in main()
1180 cb->port = htobe16(7174); in main()
1181 sem_init(&cb->sem, 0, 0); in main()
1184 ret = get_addr("0.0.0.0", (struct sockaddr *) &cb->sin); in main()
1192 ret = get_addr(optarg, (struct sockaddr *) &cb->sin); in main()
1195 ret = get_addr(optarg, (struct sockaddr *) &cb->ssource); in main()
1201 cb->port = htobe16(atoi(optarg)); in main()
1205 cb->server = 1; in main()
1209 cb->server = 0; in main()
1213 cb->size = atoi(optarg); in main()
1214 if ((cb->size < RPING_MIN_BUFSIZE) || in main()
1215 (cb->size > (RPING_BUFSIZE - 1))) { in main()
1218 cb->size, RPING_MIN_BUFSIZE, RPING_BUFSIZE); in main()
1224 cb->count = atoi(optarg); in main()
1225 if (cb->count < 0) { in main()
1227 cb->count); in main()
1230 DEBUG_LOG("count %d\n", (int) cb->count); in main()
1233 cb->verbose++; in main()
1237 cb->validate++; in main()
1252 if (cb->server == -1) { in main()
1258 cb->cm_channel = rdma_create_event_channel(); in main()
1259 if (!cb->cm_channel) { in main()
1265 ret = rdma_create_id(cb->cm_channel, &cb->cm_id, cb, RDMA_PS_TCP); in main()
1270 DEBUG_LOG("created cm_id %p\n", cb->cm_id); in main()
1272 ret = pthread_create(&cb->cmthread, NULL, cm_thread, cb); in main()
1278 if (cb->server) { in main()
1280 ret = rping_run_persistent_server(cb); in main()
1282 ret = rping_run_server(cb); in main()
1284 ret = rping_run_client(cb); in main()
1287 DEBUG_LOG("destroy cm_id %p\n", cb->cm_id); in main()
1288 rdma_destroy_id(cb->cm_id); in main()
1290 rdma_destroy_event_channel(cb->cm_channel); in main()
1292 free(cb); in main()