1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

Fixed event channel bug, added pingpong (RC) with user params working, added final bm results and plots.

This commit is contained in:
Annika Wierichs 2018-02-19 10:39:43 +01:00
parent 717f922df2
commit f7b14f39ed
53 changed files with 1127 additions and 1000 deletions

View file

@ -987,7 +987,7 @@ typedef struct {
void ibv_free_device_list(struct ibv_device ** list) {
uhyve_ibv_free_device_list_t uhyve_args;
// TODO: Take care of ** parameter.
uhyve_args.list = list;
uhyve_send(UHYVE_PORT_IBV_FREE_DEVICE_LIST, (unsigned) virt_to_phys((size_t) &uhyve_args));
}
@ -1560,10 +1560,10 @@ typedef struct {
struct ibv_cq * ibv_create_cq(struct ibv_context * context, int cqe, void * cq_context, struct ibv_comp_channel * channel, int comp_vector) {
uhyve_ibv_create_cq_t uhyve_args;
uhyve_args.context = context;
uhyve_args.cqe = cqe;
uhyve_args.cq_context = cq_context;
uhyve_args.channel = channel;
uhyve_args.context = context;
uhyve_args.cqe = cqe;
uhyve_args.cq_context = cq_context;
uhyve_args.channel = channel;
uhyve_args.comp_vector = comp_vector;
uhyve_send(UHYVE_PORT_IBV_CREATE_CQ, (unsigned) virt_to_phys((size_t) &uhyve_args));
@ -1654,9 +1654,9 @@ typedef struct {
int ibv_get_cq_event(struct ibv_comp_channel * channel, struct ibv_cq ** cq, void ** cq_context) {
uhyve_ibv_get_cq_event_t uhyve_args;
uhyve_args.channel = channel;
// TODO: Take care of ** parameter.
// TODO: Take care of ** parameter.
uhyve_args.channel = channel;
uhyve_args.cq = (struct ibv_cq **) guest_to_host((size_t) cq); // created in user space
uhyve_args.cq_context = (void **) guest_to_host((size_t) cq_context); // created in user space
uhyve_send(UHYVE_PORT_IBV_GET_CQ_EVENT, (unsigned) virt_to_phys((size_t) &uhyve_args));

View file

@ -879,7 +879,7 @@ void call_ibv_destroy_cq(struct kvm_run * run, uint8_t * guest_mem) {
*/
void call_ibv_get_cq_event(struct kvm_run * run, uint8_t * guest_mem) {
printf("LOG: UHYVE - call_ibv_get_cq_event\n");
printf("get_cq_event ");
unsigned data = *((unsigned*) ((size_t) run + run->io.data_offset));
uhyve_ibv_get_cq_event_t * args = (uhyve_ibv_get_cq_event_t *) (guest_mem + data);
@ -925,7 +925,7 @@ void call_ibv_poll_cq(struct kvm_run * run, uint8_t * guest_mem) {
*/
void call_ibv_req_notify_cq(struct kvm_run * run, uint8_t * guest_mem) {
printf("LOG: UHYVE - call_ibv_req_notify_cq\n");
printf("req_notify_cq ");
unsigned data = *((unsigned*) ((size_t) run + run->io.data_offset));
uhyve_ibv_req_notify_cq_t * args = (uhyve_ibv_req_notify_cq_t *) (guest_mem + data);

View file

@ -4,16 +4,16 @@ BENCHMARKS = ['ib_write_bw',
'ib_write_lat',
'ib_read_bw',
'ib_read_lat']
OPTIONS = ['-a --post_list 1']
# BENCHMARKS = ['ib_write_lat',
# 'ib_read_bw',
# 'ib_read_lat']
OPTIONS = ['-a --post_list 1']
# BENCHMARKS = ['ib_write_bw']
# OPTIONS = ['-a --post_list 4',
# '-a --post_list 16']
# BENCHMARKS = ['ib_write_bw']
# OPTIONS = ['-a --post_list 1',
# '-a --post_list 4',
# '-a --post_list 16']

View file

@ -9,8 +9,9 @@ from matplotlib import pyplot as plt
from config import BENCHMARKS, TIMESTAMP, OPTIONS
matplotlib.rcParams['font.family'] = 'serif'
matplotlib.rcParams['font.size'] = 15
matplotlib.rcParams['mathtext.default'] = 'regular'
matplotlib.rcParams['xtick.major.pad'] = '8' # TODO: do this separately
matplotlib.rcParams['xtick.major.pad'] = '12' # TODO: do this separately
# matplotlib.rcParams['font.sans-serif'] = ['Tahoma']
# matplotlib.rcParams['figure.figsize'] = 30, 10
@ -112,7 +113,7 @@ def plot_results(results, directory):
for bm in BENCHMARKS:
for metric in (bw_metrics[2:] if 'bw' in bm else lat_metrics[2:]):
file_name = bm + '-' + metric + ('-MULTI' if len(num_wrs_list) > 1 else '') + '.pdf'
file_name = 'plot_' + bm + '-' + metric + ('-MULTI' if len(num_wrs_list) > 1 else '') + '.pdf'
file_path = os.path.join(directory, file_name)
fig, ax = plt.subplots(figsize=(10, 5))
@ -125,18 +126,21 @@ def plot_results(results, directory):
# Axis ticks and scale (x: log2 / y: log2 for latency)
ax.set_xscale('log', basex=2)
ax.set_xticks(np.power(2, range(
1, len(results['native'][bm][num_wrs_list[0]]['num_bytes']) + 1)))
num_data_points = len(results['hermit'][bm][num_wrs_list[0]]['num_bytes'])
ax.set_xticks(np.power(2, range(1, num_data_points + 1)))
if 'lat' in bm:
ax.set_ylim(bottom = 0.5, top = 256)
# y_ticks = np.power(2, range(-1, 8))
# ax.set_yticks(y_ticks, [(str(int(tick)) if tick >= 1 else str(tick)) for tick in y_ticks])
ax.set_yscale('log', basey=2)
ax.get_yaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
# Plot, save and then clear figure
for num_wrs in num_wrs_list:
label_end = ' (' + num_wrs + ' work request' + \
label_end = ' (' + num_wrs + ' WR' + \
(')' if num_wrs is '1' else 's)') if len(num_wrs_list) > 1 else ""
ax.plot(results['native'][bm][num_wrs]['num_bytes'],
results['native'][bm][num_wrs][metric],
ax.plot(results['native'][bm][num_wrs]['num_bytes'][:20],
results['native'][bm][num_wrs][metric][:20],
'o-', color = line_color['native'][num_wrs], label = 'Native' + label_end,
linewidth = 2, markersize = 6)
label = 'HermitCore (' + num_wrs + ' work requests)'
@ -145,7 +149,7 @@ def plot_results(results, directory):
'o-', color = line_color['hermit'][num_wrs], label = 'HermitCore' + label_end,
linewidth = 2, markersize = 6)
plt.legend(fontsize = 10, ncol = 3, loc = 'lower right',
plt.legend(fontsize = 12, ncol = 3, loc = 'lower right',
bbox_to_anchor = [1, 1.05])
plt.savefig(file_path, bbox_inches = 'tight')

View file

@ -10,10 +10,8 @@ add_executable(hello++ hello++.cpp)
add_executable(hellof hellof.f90)
add_executable(pi pi.go)
add_executable(ib-test ib-test.c)
#add_executable(ib-pingpong ib/pingpong.c ib/pingpong.h ib/pingpong-ud.c)
add_executable(ib-pingpong ib/pingpong.c ib/pingpong-ud.c)
#target_link_libraries(ib-test ibverbs)
add_executable(ib-rc-pingpong ib/pingpong.c ib/rc_pingpong.c)
add_executable(test-malloc test-malloc.c)
add_executable(test-malloc-mt test-malloc-mt.c)

View file

@ -1,64 +0,0 @@
/*
* Copyright (c) 2017, Annika Wierichs, RWTH Aachen University
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <hermit/ibv.h> // Geht per cmake copy workaround
int main(int argc, char** argv)
{
int i, random;
int num_devices;
printf("\t\tib-test.c: before get dev list.\n");
struct ibv_device ** dev_list = ibv_get_device_list(&num_devices);
printf("\t\tib-test.c: after get device list -- ib-test.c: num devices: %d \n", num_devices);
printf("\t\tib-test.c: dev_list ptr: %p\n", dev_list);
/* printf("after get device list -- ib-test.c: ptr 1: %p\n", dev_list[0]); */
/* printf("after get device list -- ib-test.c: ptr 2: %p\n", dev_list[1]); */
/* printf("\t\tafter get device list -- ib-test.c: name 1: %s\n", dev_list[0]->name); */
/* printf("\t\tafter get device list -- ib-test.c: name 2: %s\n", dev_list[1]->name); */
printf("\t\tib-test.c: before get device name loop.\n");
for (int i=0; i < num_devices; i++) {
const char* dev_name = ibv_get_device_name(dev_list[i]);
printf("\t\tib-test.c: after get device name -- Device name %d: %s\n", i, dev_name);
}
printf("\t\tib-test.c: before open_device\n");
struct ibv_context * context = ibv_open_device(dev_list[0]);
printf("\t\tib-test.c: after open device\n");
return 0;
}

View file

@ -1,885 +0,0 @@
/*
* Copyright (c) 2005 Topspin Communications. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
* General Public License (GPL) Version 2, available from the file
* COPYING in the main directory of this source tree, or the
* OpenIB.org BSD license below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#define _GNU_SOURCE
/*#include <config.h>*/
// #include <stdio.h>
// #include <stdlib.h>
/* #include <unistd.h> */
// #include <string.h>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <sys/time.h>
// #include <netdb.h>
// #include <malloc.h>
// #include <getopt.h>
// #include <arpa/inet.h>
// #include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netdb.h>
#include <malloc.h>
#include <getopt.h>
/*#include <arpa/inet.h>*/
#include <netinet/in.h>
#include <time.h>
#include "pingpong.h"
enum {
PINGPONG_RECV_WRID = 1,
PINGPONG_SEND_WRID = 2,
};
static int page_size;
struct pingpong_context {
struct ibv_context *context;
struct ibv_comp_channel *channel;
struct ibv_pd *pd;
struct ibv_mr *mr;
struct ibv_cq *cq;
struct ibv_qp *qp;
struct ibv_ah *ah;
void *buf;
int size;
int send_flags;
int rx_depth;
int pending;
struct ibv_port_attr portinfo;
};
struct pingpong_dest {
int lid;
int qpn;
int psn;
union ibv_gid gid;
};
/*static int pp_connect_ctx(struct pingpong_context *ctx, int port, int my_psn,*/
/*int sl, struct pingpong_dest *dest, int sgid_idx)*/
/*{*/
/*struct ibv_ah_attr ah_attr = {*/
/*.is_global = 0,*/
/*.dlid = dest->lid,*/
/*.sl = sl,*/
/*.src_path_bits = 0,*/
/*.port_num = port*/
/*};*/
/*struct ibv_qp_attr attr = {*/
/*.qp_state = IBV_QPS_RTR*/
/*};*/
/*if (ibv_modify_qp(ctx->qp, &attr, IBV_QP_STATE)) {*/
/*fprintf(stderr, "Failed to modify QP to RTR\n");*/
/*return 1;*/
/*}*/
/*attr.qp_state = IBV_QPS_RTS;*/
/*attr.sq_psn = my_psn;*/
/*if (ibv_modify_qp(ctx->qp, &attr,*/
/*IBV_QP_STATE |*/
/*IBV_QP_SQ_PSN)) {*/
/*fprintf(stderr, "Failed to modify QP to RTS\n");*/
/*return 1;*/
/*}*/
/*if (dest->gid.global.interface_id) {*/
/*ah_attr.is_global = 1;*/
/*ah_attr.grh.hop_limit = 1;*/
/*ah_attr.grh.dgid = dest->gid;*/
/*ah_attr.grh.sgid_index = sgid_idx;*/
/*}*/
/*ctx->ah = ibv_create_ah(ctx->pd, &ah_attr);*/
/*if (!ctx->ah) {*/
/*fprintf(stderr, "Failed to create AH\n");*/
/*return 1;*/
/*}*/
/*return 0;*/
/*}*/
/*static struct pingpong_dest *pp_client_exch_dest(const char *servername, int port,*/
/*const struct pingpong_dest *my_dest)*/
/*{*/
/*struct addrinfo *res, *t;*/
/*struct addrinfo hints = {*/
/*.ai_family = AF_UNSPEC,*/
/*.ai_socktype = SOCK_STREAM*/
/*};*/
/*char *service;*/
/*char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];*/
/*int n;*/
/*int sockfd = -1;*/
/*struct pingpong_dest *rem_dest = NULL;*/
/*char gid[33];*/
/*if (asprintf(&service, "%d", port) < 0)*/
/*return NULL;*/
/*n = getaddrinfo(servername, service, &hints, &res);*/
/*if (n < 0) {*/
/*fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);*/
/*free(service);*/
/*return NULL;*/
/*}*/
/*for (t = res; t; t = t->ai_next) {*/
/*sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);*/
/*if (sockfd >= 0) {*/
/*if (!connect(sockfd, t->ai_addr, t->ai_addrlen))*/
/*break;*/
/*close(sockfd);*/
/*sockfd = -1;*/
/*}*/
/*}*/
/*freeaddrinfo(res);*/
/*free(service);*/
/*if (sockfd < 0) {*/
/*fprintf(stderr, "Couldn't connect to %s:%d\n", servername, port);*/
/*return NULL;*/
/*}*/
/*gid_to_wire_gid(&my_dest->gid, gid);*/
/*sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn,*/
/*my_dest->psn, gid);*/
/*if (write(sockfd, msg, sizeof msg) != sizeof msg) {*/
/*fprintf(stderr, "Couldn't send local address\n");*/
/*goto out;*/
/*}*/
/*if (read(sockfd, msg, sizeof msg) != sizeof msg ||*/
/*write(sockfd, "done", sizeof "done") != sizeof "done") {*/
/*perror("client read/write");*/
/*fprintf(stderr, "Couldn't read/write remote address\n");*/
/*goto out;*/
/*}*/
/*rem_dest = malloc(sizeof *rem_dest);*/
/*if (!rem_dest)*/
/*goto out;*/
/*sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn,*/
/*&rem_dest->psn, gid);*/
/*wire_gid_to_gid(gid, &rem_dest->gid);*/
/*out:*/
/*close(sockfd);*/
/*return rem_dest;*/
/*}*/
/*static struct pingpong_dest *pp_server_exch_dest(struct pingpong_context *ctx,*/
/*int ib_port, int port, int sl,*/
/*const struct pingpong_dest *my_dest,*/
/*int sgid_idx)*/
/*{*/
/*struct addrinfo *res, *t;*/
/*struct addrinfo hints = {*/
/*.ai_flags = AI_PASSIVE,*/
/*.ai_family = AF_UNSPEC,*/
/*.ai_socktype = SOCK_STREAM*/
/*};*/
/*char *service;*/
/*char msg[sizeof "0000:000000:000000:00000000000000000000000000000000"];*/
/*int n;*/
/*int sockfd = -1, connfd;*/
/*struct pingpong_dest *rem_dest = NULL;*/
/*char gid[33];*/
/*if (asprintf(&service, "%d", port) < 0)*/
/*return NULL;*/
/*n = getaddrinfo(NULL, service, &hints, &res);*/
/*if (n < 0) {*/
/*fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);*/
/*free(service);*/
/*return NULL;*/
/*}*/
/*for (t = res; t; t = t->ai_next) {*/
/*sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);*/
/*if (sockfd >= 0) {*/
/*n = 1;*/
/*setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n);*/
/*if (!bind(sockfd, t->ai_addr, t->ai_addrlen))*/
/*break;*/
/*close(sockfd);*/
/*sockfd = -1;*/
/*}*/
/*}*/
/*freeaddrinfo(res);*/
/*free(service);*/
/*if (sockfd < 0) {*/
/*fprintf(stderr, "Couldn't listen to port %d\n", port);*/
/*return NULL;*/
/*}*/
/*listen(sockfd, 1);*/
/*connfd = accept(sockfd, NULL, NULL);*/
/*close(sockfd);*/
/*if (connfd < 0) {*/
/*fprintf(stderr, "accept() failed\n");*/
/*return NULL;*/
/*}*/
/*n = read(connfd, msg, sizeof msg);*/
/*if (n != sizeof msg) {*/
/*perror("server read");*/
/*fprintf(stderr, "%d/%d: Couldn't read remote address\n", n, (int) sizeof msg);*/
/*goto out;*/
/*}*/
/*rem_dest = malloc(sizeof *rem_dest);*/
/*if (!rem_dest)*/
/*goto out;*/
/*sscanf(msg, "%x:%x:%x:%s", &rem_dest->lid, &rem_dest->qpn,*/
/*&rem_dest->psn, gid);*/
/*wire_gid_to_gid(gid, &rem_dest->gid);*/
/*if (pp_connect_ctx(ctx, ib_port, my_dest->psn, sl, rem_dest,*/
/*sgid_idx)) {*/
/*fprintf(stderr, "Couldn't connect to remote QP\n");*/
/*free(rem_dest);*/
/*rem_dest = NULL;*/
/*goto out;*/
/*}*/
/*gid_to_wire_gid(&my_dest->gid, gid);*/
/*sprintf(msg, "%04x:%06x:%06x:%s", my_dest->lid, my_dest->qpn,*/
/*my_dest->psn, gid);*/
/*if (write(connfd, msg, sizeof msg) != sizeof msg ||*/
/*read(connfd, msg, sizeof msg) != sizeof "done") {*/
/*fprintf(stderr, "Couldn't send/recv local address\n");*/
/*free(rem_dest);*/
/*rem_dest = NULL;*/
/*goto out;*/
/*}*/
/*out:*/
/*close(connfd);*/
/*return rem_dest;*/
/*}*/
static struct pingpong_context *pp_init_ctx(struct ibv_device *ib_dev, int size,
int rx_depth, int port,
int use_event)
{
printf("LOG: PINGPONG - pp_init_ctx\n");
struct pingpong_context *ctx;
printf("LOG: PINGPONG - pp_init_ctx\n");
ctx = malloc(sizeof *ctx);
if (!ctx)
return NULL;
ctx->size = size;
ctx->send_flags = IBV_SEND_SIGNALED;
ctx->rx_depth = rx_depth;
printf("LOG: PINGPONG - pp_init_ctx\n");
ctx->buf = memalign(page_size, size + 40);
if (!ctx->buf) {
fprintf(stderr, "Couldn't allocate work buf.\n");
goto clean_ctx;
}
/* FIXME memset(ctx->buf, 0, size + 40); */
memset(ctx->buf, 0x7b, size + 40);
printf("LOG: PINGPONG - pp_init_ctx\n");
ctx->context = ibv_open_device(ib_dev);
if (!ctx->context) {
fprintf(stderr, "Couldn't get context for %s\n",
ibv_get_device_name(ib_dev));
goto clean_buffer;
}
printf("LOG: PINGPONG - pp_init_ctx\n");
{
struct ibv_port_attr port_info = {};
int mtu;
if (ibv_query_port(ctx->context, port, &port_info)) {
fprintf(stderr, "Unable to query port info for port %d\n", port);
goto clean_device;
}
mtu = 1 << (port_info.active_mtu + 7);
if (size > mtu) {
fprintf(stderr, "Requested size larger than port MTU (%d)\n", mtu);
goto clean_device;
}
}
printf("LOG: PINGPONG - pp_init_ctx\n");
if (use_event) {
ctx->channel = ibv_create_comp_channel(ctx->context);
if (!ctx->channel) {
fprintf(stderr, "Couldn't create completion channel\n");
goto clean_device;
}
} else
ctx->channel = NULL;
/*ctx->pd = ibv_alloc_pd(ctx->context);*/
/*if (!ctx->pd) {*/
/*fprintf(stderr, "Couldn't allocate PD\n");*/
/*goto clean_comp_channel;*/
/*}*/
/*ctx->mr = ibv_reg_mr(ctx->pd, ctx->buf, size + 40, IBV_ACCESS_LOCAL_WRITE);*/
/*if (!ctx->mr) {*/
/*fprintf(stderr, "Couldn't register MR\n");*/
/*goto clean_pd;*/
/*}*/
/*ctx->cq = ibv_create_cq(ctx->context, rx_depth + 1, NULL,*/
/*ctx->channel, 0);*/
/*if (!ctx->cq) {*/
/*fprintf(stderr, "Couldn't create CQ\n");*/
/*goto clean_mr;*/
/*}*/
/*{*/
/*struct ibv_qp_attr attr;*/
/*struct ibv_qp_init_attr init_attr = {*/
/*.send_cq = ctx->cq,*/
/*.recv_cq = ctx->cq,*/
/*.cap = {*/
/*.max_send_wr = 1,*/
/*.max_recv_wr = rx_depth,*/
/*.max_send_sge = 1,*/
/*.max_recv_sge = 1*/
/*},*/
/*.qp_type = IBV_QPT_UD,*/
/*};*/
/*ctx->qp = ibv_create_qp(ctx->pd, &init_attr);*/
/*if (!ctx->qp) {*/
/*fprintf(stderr, "Couldn't create QP\n");*/
/*goto clean_cq;*/
/*}*/
/*ibv_query_qp(ctx->qp, &attr, IBV_QP_CAP, &init_attr);*/
/*if (init_attr.cap.max_inline_data >= size) {*/
/*ctx->send_flags |= IBV_SEND_INLINE;*/
/*}*/
/*}*/
/*{*/
/*struct ibv_qp_attr attr = {*/
/*.qp_state = IBV_QPS_INIT,*/
/*.pkey_index = 0,*/
/*.port_num = port,*/
/*.qkey = 0x11111111*/
/*};*/
/*if (ibv_modify_qp(ctx->qp, &attr,*/
/*IBV_QP_STATE |*/
/*IBV_QP_PKEY_INDEX |*/
/*IBV_QP_PORT |*/
/*IBV_QP_QKEY)) {*/
/*fprintf(stderr, "Failed to modify QP to INIT\n");*/
/*goto clean_qp;*/
/*}*/
/*}*/
/*return ctx;*/
clean_qp:
/*ibv_destroy_qp(ctx->qp);*/
clean_cq:
/*ibv_destroy_cq(ctx->cq);*/
clean_mr:
/*ibv_dereg_mr(ctx->mr);*/
clean_pd:
/*ibv_dealloc_pd(ctx->pd);*/
clean_comp_channel:
/*if (ctx->channel)*/
/*ibv_destroy_comp_channel(ctx->channel);*/
clean_device:
/*ibv_close_device(ctx->context);*/
clean_buffer:
/*free(ctx->buf);*/
clean_ctx:
/*free(ctx);*/
return NULL;
}
/*static int pp_close_ctx(struct pingpong_context *ctx)*/
/*{*/
/*if (ibv_destroy_qp(ctx->qp)) {*/
/*fprintf(stderr, "Couldn't destroy QP\n");*/
/*return 1;*/
/*}*/
/*if (ibv_destroy_cq(ctx->cq)) {*/
/*fprintf(stderr, "Couldn't destroy CQ\n");*/
/*return 1;*/
/*}*/
/*if (ibv_dereg_mr(ctx->mr)) {*/
/*fprintf(stderr, "Couldn't deregister MR\n");*/
/*return 1;*/
/*}*/
/*if (ibv_destroy_ah(ctx->ah)) {*/
/*fprintf(stderr, "Couldn't destroy AH\n");*/
/*return 1;*/
/*}*/
/*if (ibv_dealloc_pd(ctx->pd)) {*/
/*fprintf(stderr, "Couldn't deallocate PD\n");*/
/*return 1;*/
/*}*/
/*if (ctx->channel) {*/
/*if (ibv_destroy_comp_channel(ctx->channel)) {*/
/*fprintf(stderr, "Couldn't destroy completion channel\n");*/
/*return 1;*/
/*}*/
/*}*/
/*if (ibv_close_device(ctx->context)) {*/
/*fprintf(stderr, "Couldn't release context\n");*/
/*return 1;*/
/*}*/
/*free(ctx->buf);*/
/*free(ctx);*/
/*return 0;*/
/*}*/
/*static int pp_post_recv(struct pingpong_context *ctx, int n)*/
/*{*/
/*struct ibv_sge list = {*/
/*.addr = (uintptr_t) ctx->buf,*/
/*.length = ctx->size + 40,*/
/*.lkey = ctx->mr->lkey*/
/*};*/
/*struct ibv_recv_wr wr = {*/
/*.wr_id = PINGPONG_RECV_WRID,*/
/*.sg_list = &list,*/
/*.num_sge = 1,*/
/*};*/
/*struct ibv_recv_wr *bad_wr;*/
/*int i;*/
/*for (i = 0; i < n; ++i)*/
/*if (ibv_post_recv(ctx->qp, &wr, &bad_wr))*/
/*break;*/
/*return i;*/
/*}*/
/*static int pp_post_send(struct pingpong_context *ctx, uint32_t qpn)*/
/*{*/
/*struct ibv_sge list = {*/
/*.addr = (uintptr_t) ctx->buf + 40,*/
/*.length = ctx->size,*/
/*.lkey = ctx->mr->lkey*/
/*};*/
/*struct ibv_send_wr wr = {*/
/*.wr_id = PINGPONG_SEND_WRID,*/
/*.sg_list = &list,*/
/*.num_sge = 1,*/
/*.opcode = IBV_WR_SEND,*/
/*.send_flags = ctx->send_flags,*/
/*.wr = {*/
/*.ud = {*/
/*.ah = ctx->ah,*/
/*.remote_qpn = qpn,*/
/*.remote_qkey = 0x11111111*/
/*}*/
/*}*/
/*};*/
/*struct ibv_send_wr *bad_wr;*/
/*return ibv_post_send(ctx->qp, &wr, &bad_wr);*/
/*}*/
static void usage(const char *argv0)
{
printf("Usage:\n");
printf(" %s start a server and wait for connection\n", argv0);
printf(" %s <host> connect to server at <host>\n", argv0);
printf("\n");
printf("Options:\n");
printf(" -p, --port=<port> listen on/connect to port <port> (default 18515)\n");
printf(" -d, --ib-dev=<dev> use IB device <dev> (default first device found)\n");
printf(" -i, --ib-port=<port> use port <port> of IB device (default 1)\n");
printf(" -s, --size=<size> size of message to exchange (default 2048)\n");
printf(" -r, --rx-depth=<dep> number of receives to post at a time (default 500)\n");
printf(" -n, --iters=<iters> number of exchanges (default 1000)\n");
printf(" -l, --sl=<SL> send messages with service level <SL> (default 0)\n");
printf(" -e, --events sleep on CQ events (default poll)\n");
printf(" -g, --gid-idx=<gid index> local port gid index\n");
}
int main(int argc, char *argv[])
{
printf("LOG: PINGPONG - main\n");
struct ibv_device **dev_list;
struct ibv_device *ib_dev;
struct pingpong_context *ctx;
struct pingpong_dest my_dest;
struct pingpong_dest *rem_dest;
struct timeval start, end;
char *ib_devname = NULL;
char *servername = NULL;
unsigned int port = 18515;
int ib_port = 1;
unsigned int size = 2048;
unsigned int rx_depth = 500;
unsigned int iters = 1000;
int use_event = 0;
int routs;
int rcnt, scnt;
int num_cq_events = 0;
int sl = 0;
int gidx = -1;
char gid[33];
printf("LOG: PINGPONG - main\n");
srand48(getpid() * time(NULL));
printf("LOG: PINGPONG - main\n");
while (1) {
int c;
printf("LOG: PINGPONG - main\n");
static struct option long_options[] = {
{ .name = "port", .has_arg = 1, .val = 'p' },
{ .name = "ib-dev", .has_arg = 1, .val = 'd' },
{ .name = "ib-port", .has_arg = 1, .val = 'i' },
{ .name = "size", .has_arg = 1, .val = 's' },
{ .name = "rx-depth", .has_arg = 1, .val = 'r' },
{ .name = "iters", .has_arg = 1, .val = 'n' },
{ .name = "sl", .has_arg = 1, .val = 'l' },
{ .name = "events", .has_arg = 0, .val = 'e' },
{ .name = "gid-idx", .has_arg = 1, .val = 'g' },
{}
};
c = getopt_long(argc, argv, "p:d:i:s:r:n:l:eg:",
long_options, NULL);
if (c == -1)
break;
switch (c) {
case 'p':
port = strtol(optarg, NULL, 0);
if (port > 65535) {
usage(argv[0]);
return 1;
}
break;
case 'd':
ib_devname = strdupa(optarg);
break;
case 'i':
ib_port = strtol(optarg, NULL, 0);
if (ib_port < 1) {
usage(argv[0]);
return 1;
}
break;
case 's':
size = strtoul(optarg, NULL, 0);
break;
case 'r':
rx_depth = strtoul(optarg, NULL, 0);
break;
case 'n':
iters = strtoul(optarg, NULL, 0);
break;
case 'l':
sl = strtol(optarg, NULL, 0);
break;
case 'e':
++use_event;
break;
case 'g':
gidx = strtol(optarg, NULL, 0);
break;
default:
usage(argv[0]);
return 1;
}
}
if (optind == argc - 1)
servername = strdupa(argv[optind]);
else if (optind < argc) {
usage(argv[0]);
return 1;
}
page_size = 4092; // TODO
dev_list = ibv_get_device_list(NULL);
if (!dev_list) {
perror("Failed to get IB devices list");
return 1;
}
if (!ib_devname) {
ib_dev = *dev_list;
if (!ib_dev) {
fprintf(stderr, "No IB devices found\n");
return 1;
}
} else {
int i;
for (i = 0; dev_list[i]; ++i)
if (!strcmp(ibv_get_device_name(dev_list[i]), ib_devname))
break;
ib_dev = dev_list[i];
if (!ib_dev) {
fprintf(stderr, "IB device %s not found\n", ib_devname);
return 1;
}
}
ctx = pp_init_ctx(ib_dev, size, rx_depth, ib_port, use_event);
if (!ctx)
return 1;
/*routs = pp_post_recv(ctx, ctx->rx_depth);*/
/*if (routs < ctx->rx_depth) {*/
/*fprintf(stderr, "Couldn't post receive (%d)\n", routs);*/
/*return 1;*/
/*}*/
/*if (use_event)*/
/*if (ibv_req_notify_cq(ctx->cq, 0)) {*/
/*fprintf(stderr, "Couldn't request CQ notification\n");*/
/*return 1;*/
/*}*/
/*if (pp_get_port_info(ctx->context, ib_port, &ctx->portinfo)) {*/
/*fprintf(stderr, "Couldn't get port info\n");*/
/*return 1;*/
/*}*/
/*my_dest.lid = ctx->portinfo.lid;*/
/*my_dest.qpn = ctx->qp->qp_num;*/
/*my_dest.psn = lrand48() & 0xffffff;*/
/*if (gidx >= 0) {*/
/*if (ibv_query_gid(ctx->context, ib_port, gidx, &my_dest.gid)) {*/
/*fprintf(stderr, "Could not get local gid for gid index "*/
/*"%d\n", gidx);*/
/*return 1;*/
/*}*/
/*} else*/
/*memset(&my_dest.gid, 0, sizeof my_dest.gid);*/
/*inet_ntop(AF_INET6, &my_dest.gid, gid, sizeof gid);*/
/*printf(" local address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x: GID %s\n",*/
/*my_dest.lid, my_dest.qpn, my_dest.psn, gid);*/
/*if (servername)*/
/*rem_dest = pp_client_exch_dest(servername, port, &my_dest);*/
/*else*/
/*rem_dest = pp_server_exch_dest(ctx, ib_port, port, sl,*/
/*&my_dest, gidx);*/
/*if (!rem_dest)*/
/*return 1;*/
/*inet_ntop(AF_INET6, &rem_dest->gid, gid, sizeof gid);*/
/*printf(" remote address: LID 0x%04x, QPN 0x%06x, PSN 0x%06x, GID %s\n",*/
/*rem_dest->lid, rem_dest->qpn, rem_dest->psn, gid);*/
/*if (servername)*/
/*if (pp_connect_ctx(ctx, ib_port, my_dest.psn, sl, rem_dest,*/
/*gidx))*/
/*return 1;*/
/*ctx->pending = PINGPONG_RECV_WRID;*/
/*if (servername) {*/
/*if (pp_post_send(ctx, rem_dest->qpn)) {*/
/*fprintf(stderr, "Couldn't post send\n");*/
/*return 1;*/
/*}*/
/*ctx->pending |= PINGPONG_SEND_WRID;*/
/*}*/
/*if (gettimeofday(&start, NULL)) {*/
/*perror("gettimeofday");*/
/*return 1;*/
/*}*/
/*rcnt = scnt = 0;*/
/*while (rcnt < iters || scnt < iters) {*/
/*if (use_event) {*/
/*struct ibv_cq *ev_cq;*/
/*void *ev_ctx;*/
/*if (ibv_get_cq_event(ctx->channel, &ev_cq, &ev_ctx)) {*/
/*fprintf(stderr, "Failed to get cq_event\n");*/
/*return 1;*/
/*}*/
/*++num_cq_events;*/
/*if (ev_cq != ctx->cq) {*/
/*fprintf(stderr, "CQ event for unknown CQ %p\n", ev_cq);*/
/*return 1;*/
/*}*/
/*if (ibv_req_notify_cq(ctx->cq, 0)) {*/
/*fprintf(stderr, "Couldn't request CQ notification\n");*/
/*return 1;*/
/*}*/
/*}*/
/*{*/
/*struct ibv_wc wc[2];*/
/*int ne, i;*/
/*do {*/
/*ne = ibv_poll_cq(ctx->cq, 2, wc);*/
/*if (ne < 0) {*/
/*fprintf(stderr, "poll CQ failed %d\n", ne);*/
/*return 1;*/
/*}*/
/*} while (!use_event && ne < 1);*/
/*for (i = 0; i < ne; ++i) {*/
/*if (wc[i].status != IBV_WC_SUCCESS) {*/
/*fprintf(stderr, "Failed status %s (%d) for wr_id %d\n",*/
/*ibv_wc_status_str(wc[i].status),*/
/*wc[i].status, (int) wc[i].wr_id);*/
/*return 1;*/
/*}*/
/*switch ((int) wc[i].wr_id) {*/
/*case PINGPONG_SEND_WRID:*/
/*++scnt;*/
/*break;*/
/*case PINGPONG_RECV_WRID:*/
/*if (--routs <= 1) {*/
/*routs += pp_post_recv(ctx, ctx->rx_depth - routs);*/
/*if (routs < ctx->rx_depth) {*/
/*fprintf(stderr,*/
/*"Couldn't post receive (%d)\n",*/
/*routs);*/
/*return 1;*/
/*}*/
/*}*/
/*++rcnt;*/
/*break;*/
/*default:*/
/*fprintf(stderr, "Completion for unknown wr_id %d\n",*/
/*(int) wc[i].wr_id);*/
/*return 1;*/
/*}*/
/*ctx->pending &= ~(int) wc[i].wr_id;*/
/*if (scnt < iters && !ctx->pending) {*/
/*if (pp_post_send(ctx, rem_dest->qpn)) {*/
/*fprintf(stderr, "Couldn't post send\n");*/
/*return 1;*/
/*}*/
/*ctx->pending = PINGPONG_RECV_WRID |*/
/*PINGPONG_SEND_WRID;*/
/*}*/
/*}*/
/*}*/
/*}*/
/*if (gettimeofday(&end, NULL)) {*/
/*perror("gettimeofday");*/
/*return 1;*/
/*}*/
/*{*/
/*float usec = (end.tv_sec - start.tv_sec) * 1000000 +*/
/*(end.tv_usec - start.tv_usec);*/
/*long long bytes = (long long) size * iters * 2;*/
/*printf("%lld bytes in %.2f seconds = %.2f Mbit/sec\n",*/
/*bytes, usec / 1000000., bytes * 8. / usec);*/
/*printf("%d iters in %.2f seconds = %.2f usec/iter\n",*/
/*iters, usec / 1000000., usec / iters);*/
/*}*/
/*ibv_ack_cq_events(ctx->cq, num_cq_events);*/
/*if (pp_close_ctx(ctx))*/
/*return 1;*/
/*ibv_free_device_list(dev_list);*/
/*free(rem_dest);*/
return 0;
}

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2006 Cisco Systems. All rights reserved.
* Copyright (c) 2006 Cisco Systems. All rights reserved.
* 2018 Annika Wierichs, RWTH Aachen. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
@ -32,11 +33,24 @@
#include "pingpong.h"
/*#include <endian.h> // TODO*/
/* #include <endian.h> */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
uint32_t htonl(uint32_t x) {
#if BYTE_ORDER == BIG_ENDIAN
return x;
#else
return __bswap_32 (x);
#endif
}
uint32_t ntohl(uint32_t x) {
return htonl(x);
}
enum ibv_mtu pp_mtu_to_enum(int mtu)
{
switch (mtu) {
@ -55,27 +69,28 @@ int pp_get_port_info(struct ibv_context *context, int port,
return ibv_query_port(context, port, attr);
}
/* void wire_gid_to_gid(const char *wgid, union ibv_gid *gid) */
/* { */
/* char tmp[9]; */
/* __be32 v32; */
/* int i; */
/* uint32_t tmp_gid[4]; */
void wire_gid_to_gid(const char *wgid, union ibv_gid *gid)
{
char tmp[9];
__be32 v32;
int i;
uint32_t tmp_gid[4];
/* for (tmp[8] = 0, i = 0; i < 4; ++i) { */
/* memcpy(tmp, wgid + i * 8, 8); */
/* sscanf(tmp, "%x", &v32); */
/* tmp_gid[i] = be32toh(v32); */
/* } */
/* memcpy(gid, tmp_gid, sizeof(*gid)); */
/* } */
for (tmp[8] = 0, i = 0; i < 4; ++i) {
memcpy(tmp, wgid + i * 8, 8);
sscanf(tmp, "%x", &v32);
tmp_gid[i] = ntohl(v32); // TODO: check if this works in every case.
}
memcpy(gid, tmp_gid, sizeof(*gid));
}
/* void gid_to_wire_gid(const union ibv_gid *gid, char wgid[]) */
/* { */
/* uint32_t tmp_gid[4]; */
/* int i; */
void gid_to_wire_gid(const union ibv_gid *gid, char wgid[])
{
uint32_t tmp_gid[4];
int i;
memcpy(tmp_gid, gid, sizeof(tmp_gid));
for (i = 0; i < 4; ++i)
sprintf(&wgid[i * 8], "%08x", htonl(tmp_gid[i])); // TODO: check if this works in every case.
}
/* memcpy(tmp_gid, gid, sizeof(tmp_gid)); */
/* for (i = 0; i < 4; ++i) */
/* sprintf(&wgid[i * 8], "%08x", htobe32(tmp_gid[i])); */
/* } */

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2006 Cisco Systems. All rights reserved.
* Copyright (c) 2006 Cisco Systems. All rights reserved.
* 2018 Annika Wierichs, RWTH Aachen. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
@ -30,10 +31,17 @@
* SOFTWARE.
*/
#include <hermit/ibv.h>
#ifndef IBV_PINGPONG_H
#define IBV_PINGPONG_H
#define PAGE_SIZE 4092
#include <hermit/verbs.h>
enum ibv_mtu pp_mtu_to_enum(int mtu);
int pp_get_port_info(struct ibv_context *context, int port, struct ibv_port_attr *attr);
// void wire_gid_to_gid(const char *wgid, union ibv_gid *gid);
// void gid_to_wire_gid(const union ibv_gid *gid, char wgid[]);
int pp_get_port_info(struct ibv_context *context, int port,
struct ibv_port_attr *attr);
void wire_gid_to_gid(const char *wgid, union ibv_gid *gid);
void gid_to_wire_gid(const union ibv_gid *gid, char wgid[]);
#endif /* IBV_PINGPONG_H */

1051
usr/tests/ib/rc_pingpong.c Normal file

File diff suppressed because it is too large Load diff