/* Header files needed for DAT/uDAPL */
#include "dat2/udat.h"
+#include "dat2/dat_ib_extensions.h"
/* definitions */
#define SERVER_CONN_QUAL 45248
/* defaults */
static int failed = 0;
static int uni_direction = 0;
-static int align_data=0;
-static int performance_times = 1;
+static int align_data=1;
+static int performance_times = 0;
static int connected = 0;
static int burst = 100;
-static int signal_rate = 2;
+static int signal_rate = 10;
static int server = 1;
static int verbose = 0;
static int polling = 0;
signal_rate = burst;
rq_cnt = MSG_BUF_COUNT + (burst);
- sq_cnt = MSG_BUF_COUNT + (burst/signal_rate) + MAX_RDMA_RD;
+ sq_cnt = MSG_BUF_COUNT + MAX_RDMA_RD + signal_rate;
if (!server) {
printf("%d Running as client - %s\n", getpid(), provider);
}
}
memset(&ts, 0, sizeof(struct dt_time));
- LOGPRINTF("%d Allocated RDMA buffers (r:%p,s:%p) len %d \n",
- getpid(), rbuf, sbuf, buf_len);
+ printf("%d Allocated RDMA buffers (r:%p,s:%p) len %d burst %d sig_rate %d sq %d rq %d\n",
+ getpid(), rbuf, sbuf, buf_len, burst, signal_rate, sq_cnt, rq_cnt);
if (posix_memalign((void**)&p_rmr_rcv, 4096, 4096) ||
posix_memalign((void**)&p_rmr_snd, 4096, 4096)) {
} else
LOGPRINTF("%d do_rdma_read_with_msg complete\n", getpid());
+ }
+
+ if (!write_only) {
/*********** PING PING messages ************/
ret = do_ping_pong_msg();
if (ts.rtt)
printf("%d: Message RTT: Total=%6.2lf usec, %d bursts, itime=%6.2lf usec, pc=%d\n",
getpid(), ts.rtt, burst, ts.rtt / burst, poll_count);
- if (ts.rdma_wr) {
+ if (ts.rdma_wr && (!server || (server && !uni_direction))) {
int msgs = uni_direction ? burst : burst * 2;
printf("\n%d: RDMA write (%s): Total=%6.2lf usec, itime=%6.2lf us, poll=%d, %d x %d, %4.2lf MB/sec\n",
return (DAT_ABORT);
}
- if (event.event_data.dto_completion_event_data.status !=
- DAT_SUCCESS) {
+ if (event.event_data.dto_completion_event_data.status != (int)DAT_SUCCESS) {
fprintf(stderr, "%d: ERROR: DTO event status %s\n",
getpid(), DT_RetToStr(ret));
return (DAT_ABORT);
DAT_DTO_COOKIE cookie;
DAT_RETURN ret;
int i, flags = DAT_COMPLETION_SUPPRESS_FLAG;
+ DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data;
+ DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *)event.event_extension_data;
printf("\n %d RDMA WRITE DATA with SEND MSG\n\n", getpid());
l_iov[i].segment_length);
}
+
if (uni_direction && server)
goto done;
sprintf(&sbuf[25], "rdma writes completed == %d", i+1);
sbuf[buf_len-1] = i;
- if ((i == (burst - 1)) || (i % (burst/signal_rate) == 0))
+ if (!((i+1) % signal_rate))
flags = DAT_COMPLETION_DEFAULT_FLAG;
else
flags = DAT_COMPLETION_SUPPRESS_FLAG;
cookie.as_64 = i;
- ret = dat_ep_post_rdma_write(h_ep, // ep_handle
- MSG_IOV_COUNT, // num_segments
- l_iov, // LMR
- cookie, // user_cookie
- &r_iov, // RMR
- flags);
+
+ /* last message is write_immed with buf_len as immediate date */
+ if (i == (burst - 1)) {
+ ret = dat_ib_post_rdma_write_immed(
+ h_ep, MSG_IOV_COUNT, l_iov, cookie, &r_iov, 0x7777, flags);
+ } else {
+ ret = dat_ep_post_rdma_write(
+ h_ep, MSG_IOV_COUNT, l_iov, cookie, &r_iov, flags);
+ }
if (ret != DAT_SUCCESS) {
- fprintf(stderr,
- "%d: ERROR: dat_ep_post_rdma_write() %s\n",
- getpid(), DT_RetToStr(ret));
+ fprintf(stderr, "%d: ERROR: dat_rdma_write() %s\n", getpid(), DT_RetToStr(ret));
return (DAT_ABORT);
}
LOGPRINTF("%d rdma_write # %d completed\n", getpid(), i + 1);
DTO_TIMEOUT,
&rdma_wr_poll_count) != DAT_SUCCESS)
return (DAT_ABORT);
- if (event.event_data.dto_completion_event_data.user_cookie.as_64 != i) {
- fprintf(stderr, "ERROR rdma_write: cookie=" F64x" exp 0x%x\n",
- event.event_data.dto_completion_event_data.user_cookie.as_64,i);
+ if (dto_event->user_cookie.as_64 != i) {
+ fprintf(stderr, "ERROR rdma_write: cookie= "F64x " exp 0x%x\n",
+ dto_event->user_cookie.as_64, i);
return (DAT_ABORT);
}
}
}
- stop = get_time();
- ts.rdma_wr = ((stop - start) * 1.0e6);
+
done:
- /*
- * Send RMR information a 2nd time to indicate completion
- * NOTE: already swapped to network order in connect_ep
- */
- printf("%d Sending RDMA WRITE completion message\n", getpid());
+ if ((!uni_direction) || (uni_direction && server)) {
+ /* Wait to RECEIVE the LAST message, immediate data expected */
+ if (collect_event(h_dto_rcv_evd,
+ &event,
+ DTO_TIMEOUT,
+ &rdma_wr_poll_count) != DAT_SUCCESS)
+ return (DAT_ABORT);
- ret = send_msg(p_rmr_snd,
- sizeof(DAT_RMR_TRIPLET),
- lmr_context_send_msg,
- cookie, DAT_COMPLETION_DEFAULT_FLAG);
+ if (event.event_number != (int)DAT_IB_DTO_EVENT ||
+ ext_event->type != DAT_IB_RDMA_WRITE_IMMED_DATA ||
+ ext_event->val.immed.data != 0x7777) {
+ printf("unexpected event 0x%x, type 0x%x or idata 0x%x, waiting for WR-IMMED #0x%x\n",
+ event.event_number, ext_event->type,
+ ext_event->val.immed.data, DAT_IB_DTO_EVENT);
+ return (DAT_ABORT);
+ }
+ recv_msg_index++;
- if (ret != DAT_SUCCESS) {
- fprintf(stderr, "%d Error send_msg: %s\n",
- getpid(), DT_RetToStr(ret));
- return (ret);
- } else {
- LOGPRINTF("%d send_msg completed\n", getpid());
- }
+ /* Send last message received ACK message back */
+ cookie.as_64 = 0x9999;
+ ret = send_msg(p_rmr_snd,
+ sizeof(DAT_RMR_TRIPLET),
+ lmr_context_send_msg,
+ cookie, DAT_COMPLETION_SUPPRESS_FLAG);
+
+ if (ret != DAT_SUCCESS) {
+ fprintf(stderr, "%d Error send_msg: %s\n",
+ getpid(), DT_RetToStr(ret));
+ return (ret);
+ } else {
+ LOGPRINTF("%d send_msg completed\n", getpid());
+ }
- /* inbound recv event, send completion's suppressed */
- if (collect_event(h_dto_rcv_evd,
- &event,
- DTO_TIMEOUT,
- &rdma_wr_poll_count) != DAT_SUCCESS)
- return (DAT_ABORT);
-
- /* validate event number and status */
- printf("%d inbound rdma_write; send message arrived!\n", getpid());
- if (event.event_number != DAT_DTO_COMPLETION_EVENT) {
- fprintf(stderr, "%d Error unexpected DTO event : %s\n",
- getpid(), DT_EventToStr(event.event_number));
- return (DAT_ABORT);
}
- if ((event.event_data.dto_completion_event_data.transfered_length !=
- sizeof(DAT_RMR_TRIPLET))
- || (event.event_data.dto_completion_event_data.user_cookie.as_64 !=
- recv_msg_index)) {
- fprintf(stderr,
- "unexpected event data for receive: len=%d cookie=" F64x
- " exp %d/%d\n",
- (int)event.event_data.dto_completion_event_data.
- transfered_length,
- event.event_data.dto_completion_event_data.user_cookie.
- as_64, (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index);
+ if (!uni_direction || !server) {
+ /* Wait for my LAST message ACK from remote side */
+ printf("%d waiting for my LAST message ACK from remote side\n", getpid());
+ if (collect_event(h_dto_rcv_evd,
+ &event,
+ DTO_TIMEOUT,
+ &rdma_wr_poll_count) != DAT_SUCCESS)
+ return (DAT_ABORT);
- return (DAT_ABORT);
- }
+ printf("%d LAST rdma write ACK message arrived!\n", getpid());
+ if (event.event_number != DAT_DTO_COMPLETION_EVENT) {
+ fprintf(stderr, "%d Error unexpected DTO event : %s\n",
+ getpid(), DT_EventToStr(event.event_number));
+ return (DAT_ABORT);
+ }
- /* swap received RMR msg: network order to host order */
- r_iov = p_rmr_rcv[recv_msg_index];
- p_rmr_rcv[recv_msg_index].virtual_address =
- ntohll(p_rmr_rcv[recv_msg_index].virtual_address);
- p_rmr_rcv[recv_msg_index].segment_length =
- ntohl(p_rmr_rcv[recv_msg_index].segment_length);
- p_rmr_rcv[recv_msg_index].rmr_context =
- ntohl(p_rmr_rcv[recv_msg_index].rmr_context);
+ if ((dto_event->transfered_length != sizeof(DAT_RMR_TRIPLET))
+ || (dto_event->user_cookie.as_64 != recv_msg_index)) {
+ fprintf(stderr,
+ "unexpected event data for receive: len=%d cookie=" F64x" exp %d/%d\n",
+ (int)dto_event->transfered_length, dto_event->user_cookie.as_64,
+ (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index);
+ return (DAT_ABORT);
+ }
+ printf("%d LAST rdma_write message ACK received from remote \n", getpid());
+ }
- printf("%d Received RMR from remote: "
- "r_iov: r_key_ctx=%x,va=" F64x ",len=0x%x\n",
- getpid(), p_rmr_rcv[recv_msg_index].rmr_context,
- p_rmr_rcv[recv_msg_index].virtual_address,
- p_rmr_rcv[recv_msg_index].segment_length);
+ stop = get_time();
+ ts.rdma_wr = ((stop - start) * 1.0e6);
- LOGPRINTF("%d inbound rdma_write; send msg event SUCCESS!!\n",
- getpid());
+ LOGPRINTF("%d last rdma_write ACK'ed SUCCESS!!\n", getpid());
if (server || (!server && !uni_direction))
printf("%d %s RDMA write buffer contains: %s last byte=%d\n",
getpid(), server ? "SERVER:" : "CLIENT:", rbuf, rbuf[buf_len-1]);
- recv_msg_index++;
+ if (server && uni_direction)
+ sleep(1);
+ recv_msg_index++;
return (DAT_SUCCESS);
}
user_cookie.as_64);
return (DAT_ABORT);
}
- if (event.event_data.dto_completion_event_data.status !=
- DAT_SUCCESS) {
+ if (event.event_data.dto_completion_event_data.status != (int)DAT_SUCCESS) {
fprintf(stderr, "%d: ERROR: DTO event status %s\n",
getpid(), DT_RetToStr(ret));
return (DAT_ABORT);
printf("P: provider name (default = OpenIB-cma)\n");
printf("l: server lid (required ucm provider)\n");
printf("q: server qpn (required ucm provider)\n");
- printf("S: burst/signal_rate (default 100/2 = completion every 50 iterations\n");
+ printf("S: signal_rate (default=10, completion every 10 iterations\n");
printf("\n");
}