/*---------------------------------------------------------------------------*/ static int on_session_event(struct xio_session *session, struct xio_session_event_data *event_data, void *cb_user_context) { pr_info("session event: %s. reason: %s\n", xio_session_event_str(event_data->event), xio_strerror(event_data->reason)); switch (event_data->event) { case XIO_SESSION_CONNECTION_ESTABLISHED_EVENT: on_connection_established(event_data->conn); break; case XIO_SESSION_CONNECTION_TEARDOWN_EVENT: xio_connection_destroy(event_data->conn); break; case XIO_SESSION_REJECT_EVENT: case XIO_SESSION_TEARDOWN_EVENT: g_session = NULL; xio_session_destroy(session); xio_context_stop_loop(ctx); /* exit */ if (pool) { msg_pool_free(pool); pool = NULL; } break; default: break; }; return 0; }
/*---------------------------------------------------------------------------*/ static int on_session_event(struct xio_session *session, struct xio_session_event_data *event_data, void *cb_user_context) { printf("session event: %s. reason: %s\n", xio_session_event_str(event_data->event), xio_strerror(event_data->reason)); switch (event_data->event) { case XIO_SESSION_REJECT_EVENT: case XIO_SESSION_CONNECTION_DISCONNECTED_EVENT: xio_disconnect(event_data->conn); break; case XIO_SESSION_TEARDOWN_EVENT: xio_ev_loop_stop(loop); /* exit */ break; default: break; }; if (pool) { msg_pool_free(pool); pool = NULL; } return 0; }
/*---------------------------------------------------------------------------*/ static void *portal_server_cb(void *data) { struct thread_data *tdata = (struct thread_data *)data; cpu_set_t cpuset; struct xio_server *server; int retval = 0; /* set affinity to thread */ CPU_ZERO(&cpuset); CPU_SET(tdata->affinity, &cpuset); pthread_setaffinity_np(tdata->thread_id, sizeof(cpu_set_t), &cpuset); /* prepare data for the cuurent thread */ tdata->pool = msg_pool_alloc(MAX_POOL_SIZE, 0, 1); if (tdata->pool == NULL) { retval = -1; goto exit; } /* create thread context for the client */ tdata->ctx = xio_context_create(NULL, test_config.poll_timeout, tdata->affinity); /* bind a listener server to a portal/url */ printf("thread [%d] - listen:%s\n", tdata->affinity, tdata->portal); server = xio_bind(tdata->ctx, &portal_server_ops, tdata->portal, NULL, 0, tdata); if (server == NULL) { printf("**** Error - xio_bind failed. %s\n", xio_strerror(xio_errno())); retval = -1; goto cleanup; } /* the default xio supplied main loop */ xio_context_run_loop(tdata->ctx, XIO_INFINITE); /* normal exit phase */ fprintf(stdout, "thread [%d] - exit signaled\n", tdata->affinity); /* detach the server */ xio_unbind(server); if (tdata->pool) msg_pool_free(tdata->pool); if (tdata->reg_mem.addr) xio_mem_free(&tdata->reg_mem); cleanup: /* free the context */ xio_context_destroy(tdata->ctx); exit: pthread_exit((void *)(unsigned long)retval); }
/*---------------------------------------------------------------------------*/ static void *portal_server_cb(void *data) { struct thread_data *tdata = data; cpu_set_t cpuset; struct xio_server *server; int retval = 0; /* set affinity to thread */ CPU_ZERO(&cpuset); CPU_SET(tdata->affinity, &cpuset); pthread_setaffinity_np(tdata->thread_id, sizeof(cpu_set_t), &cpuset); /* prepare data for the cuurent thread */ tdata->pool = msg_pool_alloc(tdata->user_param->queue_depth + 64); /* create thread context for the client */ tdata->ctx = xio_context_create(NULL, tdata->user_param->poll_timeout, tdata->affinity); /* bind a listener server to a portal/url */ server = xio_bind(tdata->ctx, &portal_server_ops, tdata->user_param->portals_arr[tdata->portal_index], NULL, 0, tdata); if (server == NULL) goto cleanup; /* the default xio supplied main loop */ xio_context_run_loop(tdata->ctx, XIO_INFINITE); /* detach the server */ xio_unbind(server); if (tdata->pool) msg_pool_free(tdata->pool); if (tdata->mr) xio_dereg_mr(&tdata->mr); if (tdata->buf) free(tdata->buf); if (tdata->out_xbuf) xio_free(&tdata->out_xbuf); if (tdata->in_xbuf) xio_free(&tdata->in_xbuf); cleanup: /* free the context */ xio_context_destroy(tdata->ctx); pthread_exit(&retval); }
/*---------------------------------------------------------------------------*/ static void *portal_server_cb(void *data) { struct thread_data *tdata = data; cpu_set_t cpuset; struct xio_server *server; int retval = 0; /* set affinity to thread */ CPU_ZERO(&cpuset); CPU_SET(tdata->affinity, &cpuset); pthread_setaffinity_np(tdata->thread_id, sizeof(cpu_set_t), &cpuset); /* prepare data for the cuurent thread */ tdata->pool = msg_pool_alloc(MAX_POOL_SIZE, test_config.hdr_len, test_config.data_len, 0, 0); /* create thread context for the client */ tdata->ctx = xio_context_create(NULL, test_config.poll_timeout); /* bind a listener server to a portal/url */ printf("thread [%d] - listen:%s\n", tdata->affinity, tdata->portal); server = xio_bind(tdata->ctx, &portal_server_ops, tdata->portal, NULL, 0, tdata); if (server == NULL) goto cleanup; /* the default xio supplied main loop */ xio_context_run_loop(tdata->ctx, XIO_INFINITE); /* normal exit phase */ fprintf(stdout, "thread [%d] - exit signaled\n", tdata->affinity); /* detach the server */ xio_unbind(server); if (tdata->pool) msg_pool_free(tdata->pool); if (tdata->mr) xio_dereg_mr(&tdata->mr); if (tdata->buf) free(tdata->buf); cleanup: /* free the context */ xio_context_destroy(tdata->ctx); pthread_exit(&retval); }
/*---------------------------------------------------------------------------*/ static void *worker_thread(void *data) { struct thread_data *tdata = data; cpu_set_t cpuset; struct xio_msg *msg; int i; /* set affinity to thread */ CPU_ZERO(&cpuset); CPU_SET(tdata->affinity, &cpuset); pthread_setaffinity_np(tdata->thread_id, sizeof(cpu_set_t), &cpuset); /* prepare data for the cuurent thread */ tdata->pool = msg_pool_alloc(tdata->user_param->queue_depth); /* create thread context for the client */ tdata->ctx = xio_context_create(NULL, tdata->user_param->poll_timeout, tdata->affinity); /* connect the session */ tdata->conn = xio_connect(tdata->session, tdata->ctx, tdata->cid, NULL, tdata); if (tdata->data_len) tdata->xbuf = xio_alloc(tdata->data_len); for (i = 0; i < tdata->user_param->queue_depth; i++) { /* create transaction */ msg = msg_pool_get(tdata->pool); if (msg == NULL) break; /* get pointers to internal buffers */ msg->in.header.iov_len = 0; msg->in.data_iovlen = 0; msg->out.header.iov_len = 0; if (tdata->data_len) { msg->out.data_iovlen = 1; msg->out.data_iov[0].iov_base = tdata->xbuf->addr; msg->out.data_iov[0].iov_len = tdata->xbuf->length; msg->out.data_iov[0].mr = tdata->xbuf->mr; } else { msg->out.data_iovlen = 0; } msg->user_context = (void *)get_cycles(); /* send first message */ if (xio_send_request(tdata->conn, msg) == -1) { if (xio_errno() != EAGAIN) printf("**** [%p] Error - xio_send_request " \ "failed. %s\n", tdata->session, xio_strerror(xio_errno())); msg_pool_put(tdata->pool, msg); return 0; } if (tdata->do_stat) tdata->stat.scnt++; tdata->tx_nr++; } /* the default xio supplied main loop */ xio_context_run_loop(tdata->ctx, XIO_INFINITE); /* normal exit phase */ if (tdata->pool) msg_pool_free(tdata->pool); if (tdata->xbuf) xio_free(&tdata->xbuf); /* free the context */ xio_context_destroy(tdata->ctx); return NULL; }
/*---------------------------------------------------------------------------*/ static int xio_client_main(void *data) { char url[256]; struct xio_session_params params; struct xio_context_params ctx_params; struct xio_connection_params cparams; int error; int retval = 0; atomic_add(2, &module_state); print_counter = PRINT_COUNTER; print_test_config(&test_config); memset(¶ms, 0, sizeof(params)); memset(&cparams, 0, sizeof(cparams)); /* prepare buffers for this test */ if (msg_api_init(&msg_params, test_config.hdr_len, test_config.data_len, 0) != 0) { pr_err("msg_api_init failed\n"); return -1; } pool = msg_pool_alloc(MAX_POOL_SIZE, 1, 1); if (!pool) { pr_err("msg_pool_alloc failed\n"); goto cleanup; } /* create thread context for the server */ memset(&ctx_params, 0, sizeof(ctx_params)); ctx_params.flags = XIO_LOOP_GIVEN_THREAD; ctx_params.worker = current; ctx = xio_context_create(&ctx_params, POLLING_TIMEOUT, cpu); if (!ctx) { pr_err("context open failed\n"); goto cleanup; } sprintf(url, "%s://%s:%d", test_config.transport, test_config.server_addr, test_config.server_port); params.type = XIO_SESSION_CLIENT; params.ses_ops = &ses_ops; params.uri = url; g_session = xio_session_create(¶ms); if (!g_session) pr_err("session creation failed\n"); cparams.session = g_session; cparams.ctx = ctx; cparams.conn_idx = test_config.conn_idx; /* connect the session */ g_connection = xio_connect(&cparams); /* the default xio supplied main loop */ if (atomic_add_unless(&module_state, 4, 0x83)) retval = xio_context_run_loop(ctx); atomic_sub(4, &module_state); if (retval != 0) { error = xio_errno(); pr_err("running event loop failed. reason %d - (%s)\n", error, xio_strerror(error)); xio_assert(retval == 0); } /* normal exit phase */ pr_info("exit signaled\n"); xio_context_destroy(ctx); msg_pool_free(pool); cleanup: msg_api_free(&msg_params); pr_info("exit complete\n"); complete_and_exit(&cleanup_complete, 0); return 0; }