本文整理汇总了C++中ibv_post_send函数的典型用法代码示例。如果您正苦于以下问题:C++ ibv_post_send函数的具体用法?C++ ibv_post_send怎么用?C++ ibv_post_send使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ibv_post_send函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: kickoff_rdma_with_offset
static void
kickoff_rdma_with_offset(uintptr_t offset, IbvConnection *conn, int length)
{
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
memset(&wr, 0, sizeof(wr));
wr.wr_id = (uintptr_t)conn;
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)conn->peer_mr.addr + offset;
wr.wr.rdma.rkey = conn->peer_mr.rkey;
sge.addr = (uintptr_t)conn->rdma_local_region + offset;
sge.length = length;
sge.lkey = conn->rdma_local_mr->lkey;
if (RDMA_BUFFER_SIZE < (offset + length)) {
WARN(0, "kickoff_rdma_with_offset: offset + length (=%d) exceeds RDMA_BUFFER_SIZE (=%d).\n",
offset + length, RDMA_BUFFER_SIZE);
exit(1);
}
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
}
开发者ID:Daweek,项目名称:Original_DSCUDA,代码行数:28,代码来源:ibv_rdma.cpp
示例2: _rdma_write_offset
void _rdma_write_offset(void *context, void* buf, uint64_t offset)
{
struct connection *conn = (struct connection *)context;
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
//printf("7\n");
memset(&wr, 0, sizeof(wr));
wr.wr_id = (uintptr_t)conn;
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)conn->peer_mr.addr + offset;
wr.wr.rdma.rkey = conn->peer_mr.rkey;
sge.addr = (uintptr_t)conn->rdma_remote_region;
sge.length = RDMA_BUFFER_SIZE;
sge.lkey = conn->rdma_remote_mr->lkey;
time_stamp(2);
sem_wait(&write_ops);
memcpy(conn->rdma_remote_region, (char*)buf, RDMA_BUFFER_SIZE);
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
}
开发者ID:leeymcj,项目名称:RDMA_paging,代码行数:26,代码来源:rdma-common.c
示例3: post_sends
static int post_sends(struct cmatest_node *node, int signal_flag)
{
struct ibv_send_wr send_wr, *bad_send_wr;
struct ibv_sge sge;
int i, ret = 0;
if (!node->connected || !message_count)
return 0;
send_wr.next = NULL;
send_wr.sg_list = &sge;
send_wr.num_sge = 1;
send_wr.opcode = IBV_WR_SEND_WITH_IMM;
send_wr.send_flags = signal_flag;
send_wr.wr_id = (unsigned long)node;
send_wr.imm_data = htonl(node->cma_id->qp->qp_num);
send_wr.wr.ud.ah = node->ah;
send_wr.wr.ud.remote_qpn = node->remote_qpn;
send_wr.wr.ud.remote_qkey = node->remote_qkey;
sge.length = message_size;
sge.lkey = node->mr->lkey;
sge.addr = (uintptr_t) node->mem;
for (i = 0; i < message_count && !ret; i++) {
ret = ibv_post_send(node->cma_id->qp, &send_wr, &bad_send_wr);
if (ret)
printf("failed to post sends: %d\n", ret);
}
return ret;
}
开发者ID:lzyang1995,项目名称:DARE,代码行数:32,代码来源:mckey.c
示例4: post_sends
static int post_sends(struct cmatest_node *node)
{
struct ibv_send_wr send_wr, *bad_send_wr;
struct ibv_sge sge;
int i, ret = 0;
if (!node->connected || !message_count)
return 0;
send_wr.next = NULL;
send_wr.sg_list = &sge;
send_wr.num_sge = 1;
send_wr.opcode = IBV_WR_SEND;
send_wr.send_flags = 0;
send_wr.wr_id = (unsigned long)node;
sge.length = message_size;
sge.lkey = node->mr->lkey;
sge.addr = (uintptr_t) node->mem;
for (i = 0; i < message_count && !ret; i++) {
ret = ibv_post_send(node->cma_id->qp, &send_wr, &bad_send_wr);
if (ret)
printf("failed to post sends: %d\n", ret);
}
return ret;
}
开发者ID:jgunthorpe,项目名称:rdma-plumbing,代码行数:27,代码来源:cmatose.c
示例5: mca_btl_openib_get_internal
int mca_btl_openib_get_internal (mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *ep,
mca_btl_openib_get_frag_t *frag)
{
int qp = to_base_frag(frag)->base.order;
struct ibv_send_wr *bad_wr;
/* check for a send wqe */
if (qp_get_wqe(ep, qp) < 0) {
qp_put_wqe(ep, qp);
return OPAL_ERR_OUT_OF_RESOURCE;
}
/* check for a get token */
if (OPAL_THREAD_ADD32(&ep->get_tokens,-1) < 0) {
qp_put_wqe(ep, qp);
OPAL_THREAD_ADD32(&ep->get_tokens,1);
return OPAL_ERR_OUT_OF_RESOURCE;
}
qp_inflight_wqe_to_frag(ep, qp, to_com_frag(frag));
qp_reset_signal_count(ep, qp);
if (ibv_post_send(ep->qps[qp].qp->lcl_qp, &frag->sr_desc, &bad_wr)) {
qp_put_wqe(ep, qp);
OPAL_THREAD_ADD32(&ep->get_tokens,1);
return OPAL_ERROR;
}
return OPAL_SUCCESS;
}
开发者ID:ORNL,项目名称:ompi,代码行数:30,代码来源:btl_openib_get.c
示例6: write_remote
void write_remote(struct connection * conn, uint32_t len){
uint32_t size =len&(~(1U<<31));
snprintf(conn->send_region, send_buffer_size, "message from active/client side with pid %d", getpid());
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
memset(&wr,0,sizeof(wr));
wr.wr_id = (uintptr_t)conn;
wr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM;
wr.send_flags = IBV_SEND_SIGNALED;
wr.imm_data = htonl(len);
wr.wr.rdma.remote_addr = (uintptr_t)conn->peer_addr;
wr.wr.rdma.rkey = conn->peer_rkey;
if (size>0){
wr.sg_list = &sge;
wr.num_sge = 1;
sge.addr = (uintptr_t)conn->send_region;
sge.length = size;
sge.lkey = conn->send_region_mr->lkey;
}
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
}
开发者ID:xiansl,项目名称:mytests,代码行数:28,代码来源:client1.c
示例7: ibv_reg_mr
/**
* Sends a buffer's memory region so that it can be mapped to it's remote end.
*/
void RDMAChannel::SendMR(ibv_mr* mr, int id) {
// Map the memory region itself so that it can be sent
ibv_mr* init = ibv_reg_mr(adapter_.pd_, mr, sizeof(ibv_mr),
IBV_ACCESS_LOCAL_WRITE);
struct ibv_sge list;
list.addr = (uint64_t) mr;
list.length = sizeof(ibv_mr);
list.lkey = init->lkey;
struct ibv_send_wr wr;
caffe_memset(sizeof(wr), 0, &wr);
wr.wr_id = (uint64_t) init;
wr.sg_list = &list;
wr.num_sge = 1;
wr.opcode = IBV_WR_SEND_WITH_IMM;
wr.send_flags = IBV_SEND_SIGNALED;
wr.imm_data = id;
struct ibv_send_wr *bad_wr;
CHECK(!ibv_post_send(qp_, &wr, &bad_wr));
for (;;) {
ibv_wc wc;
int ne = ibv_poll_cq(write_cq_, 1, &wc);
CHECK_GE(ne, 0);
if (ne && wc.wr_id == (uint64_t) init) {
break;
}
}
CHECK(!ibv_dereg_mr(init));
}
开发者ID:Aravindreddy986,项目名称:CaffeOnSpark,代码行数:35,代码来源:rdma.cpp
示例8: assert
int Process::post_send(void *context){
Connection *conn = (Connection *) context;
std::cout<<"SEND LOCATION CONN -> ID"<<conn->identifier<<"\n";
std::cout<<"SEND POINTER ID"<<listener<<std::endl<<std::flush;
assert(conn != nullptr);
assert(conn->identifier != nullptr);
struct ibv_send_wr wr, *bad_wr = nullptr;
struct ibv_sge sge;
assert(&message != nullptr);
calc_message_numerical(&message);
assert(&message != nullptr);
assert(conn->send_region != nullptr);
memcpy(conn->send_region, message.x, message.size*sizeof(char));
printf("connected. posting send...\n");
memsetzero(&wr);
wr.wr_id = (uintptr_t)conn;
wr.opcode = IBV_WR_SEND;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
sge.addr = (uintptr_t)conn->send_region;
sge.length = message.size;
sge.lkey = conn->send_memory_region->lkey;
TEST_NZ(ibv_post_send(conn->queue_pair, &wr, &bad_wr));
return 0;
}
开发者ID:anandpratap,项目名称:ibverbs_hello_world,代码行数:34,代码来源:process_comm_send.cpp
示例9: send_ack
void send_ack() {
/* Send ack */
ack_buffer = client_pdata.index;
sge_send.addr = (uintptr_t)&ack_buffer;
sge_send.length = sizeof(ack_buffer);
sge_send.lkey = mr_ack_buffer->lkey;
send_wr.wr_id = 1;
send_wr.opcode = IBV_WR_SEND;
send_wr.send_flags = IBV_SEND_SIGNALED;
send_wr.sg_list = &sge_send;
send_wr.num_sge = 1;
err = ibv_post_send(cm_id->qp, &send_wr, &bad_send_wr);
assert(err == 0);
/* Wait send completion */
err = ibv_get_cq_event(comp_chan, &evt_cq, &cq_context);
assert(err == 0);
ibv_ack_cq_events(evt_cq, 1);
err = ibv_req_notify_cq(cq, 0);
assert(err == 0);
n = ibv_poll_cq(cq, 1, &wc);
assert(n >= 1);
if (wc.status != IBV_WC_SUCCESS)
printf("Warning: Client %d send ack failed\n", client_pdata.index);
}
开发者ID:JamisHoo,项目名称:Distributed-Cauchy-Reed-Solomon,代码行数:30,代码来源:encode_client.c
示例10: on_connection
int on_connection(void *context)
{
struct connection *conn = (struct connection *)context;
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
snprintf(conn->send_region, BUFFER_SIZE, "message from active/client side with pid %d", getpid());
printf("connected. posting send...\n");
memset(&wr, 0, sizeof(wr));
wr.wr_id = (uintptr_t)conn;
wr.opcode = IBV_WR_SEND;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
sge.addr = (uintptr_t)conn->send_region;
sge.length = BUFFER_SIZE;
sge.lkey = conn->send_mr->lkey;
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
return 0;
}
开发者ID:BenjaminBehringer,项目名称:the-geek-in-the-corner,代码行数:26,代码来源:client.c
示例11: cfio_rdma_client_write_data
void cfio_rdma_client_write_data(
int remote_offset,
int length,
int local_offset)
{
// rdma_debug("write data ...");
if (remote_offset < 0 || remote_offset + length > DATA_REGION_SIZE) {
die("RDMA out of region");
}
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
memset(&wr, 0, sizeof(wr));
rdma_conn_t *conn = rdma_conn;
wr.wr_id = (uintptr_t)(conn);
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)((char *)conn->peer_data_mr.addr + remote_offset);
wr.wr.rdma.rkey = conn->peer_data_mr.rkey;
sge.addr = (uintptr_t)(conn->data_region + local_offset);
sge.length = length;
sge.lkey = conn->data_mr->lkey;
++ request_stack_size;
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
}
开发者ID:hxmhuang,项目名称:CFIO2,代码行数:31,代码来源:rdma_client.c
示例12: _gaspi_event_send
static int
_gaspi_event_send(gaspi_cuda_event *event, int queue)
{
struct ibv_send_wr swr;
struct ibv_sge slist;
struct ibv_send_wr *bad_wr;
swr.wr.rdma.rkey = glb_gaspi_ctx.rrmd[event->segment_remote][event->rank].rkey;
swr.sg_list = &slist;
swr.num_sge = 1;
swr.wr_id = event->rank;
swr.opcode = IBV_WR_RDMA_WRITE;
swr.send_flags = IBV_SEND_SIGNALED;
swr.next = NULL;
slist.addr = (uintptr_t) (char*)(glb_gaspi_ctx.rrmd[event->segment_local][event->rank].host_ptr + NOTIFY_OFFSET + event->offset_local);
slist.length = event->size;
slist.lkey = ((struct ibv_mr *)glb_gaspi_ctx.rrmd[event->segment_local][glb_gaspi_ctx.rank].host_mr)->lkey;
if(glb_gaspi_ctx.rrmd[event->segment_remote][event->rank].cudaDevId >= 0)
swr.wr.rdma.remote_addr = (glb_gaspi_ctx.rrmd[event->segment_remote][event->rank].addr + event->offset_remote);
else
swr.wr.rdma.remote_addr = (glb_gaspi_ctx.rrmd[event->segment_remote][event->rank].addr + NOTIFY_OFFSET + event->offset_remote);
if(ibv_post_send(glb_gaspi_ctx_ib.qpC[queue][event->rank], &swr, &bad_wr))
{
glb_gaspi_ctx.qp_state_vec[queue][event->rank] = GASPI_STATE_CORRUPT;
return -1;
}
event->ib_use = 1;
return 0;
}
开发者ID:francois-wellenreiter,项目名称:GPI-2,代码行数:35,代码来源:GPI2_GPU.c
示例13: uct_rc_verbs_ep_post_send
static UCS_F_ALWAYS_INLINE void
uct_rc_verbs_ep_post_send(uct_rc_verbs_iface_t* iface, uct_rc_verbs_ep_t* ep,
struct ibv_send_wr *wr, int send_flags, int max_log_sge)
{
struct ibv_send_wr *bad_wr;
int ret;
uct_rc_txqp_check(&ep->super.txqp);
if (!(send_flags & IBV_SEND_SIGNALED)) {
send_flags |= uct_rc_iface_tx_moderation(&iface->super, &ep->super.txqp,
IBV_SEND_SIGNALED);
}
if (wr->opcode == IBV_WR_RDMA_READ) {
send_flags |= uct_rc_ep_atomic_fence(&iface->super, &ep->fi,
IBV_SEND_FENCE);
}
wr->send_flags = send_flags;
wr->wr_id = uct_rc_txqp_unsignaled(&ep->super.txqp);
uct_ib_log_post_send(&iface->super.super, ep->super.txqp.qp, wr, max_log_sge,
(wr->opcode == IBV_WR_SEND) ? uct_rc_ep_packet_dump : NULL);
ret = ibv_post_send(ep->super.txqp.qp, wr, &bad_wr);
if (ret != 0) {
ucs_fatal("ibv_post_send() returned %d (%m)", ret);
}
uct_rc_verbs_txqp_posted(&ep->super.txqp, &ep->txcnt, &iface->super, send_flags & IBV_SEND_SIGNALED);
}
开发者ID:openucx,项目名称:ucx,代码行数:31,代码来源:rc_verbs_ep.c
示例14: uct_rc_verbs_ep_post_send
static UCS_F_ALWAYS_INLINE void
uct_rc_verbs_ep_post_send(uct_rc_verbs_iface_t* iface, uct_rc_verbs_ep_t* ep,
struct ibv_send_wr *wr, int send_flags)
{
struct ibv_send_wr *bad_wr;
int ret;
uct_rc_txqp_check(&ep->super.txqp);
if (!(send_flags & IBV_SEND_SIGNALED)) {
send_flags |= uct_rc_iface_tx_moderation(&iface->super, &ep->super.txqp,
IBV_SEND_SIGNALED);
}
wr->send_flags = send_flags;
wr->wr_id = uct_rc_txqp_unsignaled(&ep->super.txqp);
uct_ib_log_post_send(&iface->super.super, ep->super.txqp.qp, wr,
(wr->opcode == IBV_WR_SEND) ? uct_rc_ep_am_packet_dump : NULL);
UCT_IB_INSTRUMENT_RECORD_SEND_WR_LEN("uct_rc_verbs_ep_post_send", wr);
ret = ibv_post_send(ep->super.txqp.qp, wr, &bad_wr);
if (ret != 0) {
ucs_fatal("ibv_post_send() returned %d (%m)", ret);
}
uct_rc_verbs_txqp_posted(&ep->super.txqp, &ep->txcnt, &iface->super, send_flags & IBV_SEND_SIGNALED);
}
开发者ID:francois-wellenreiter,项目名称:ucx,代码行数:28,代码来源:rc_verbs_ep.c
示例15: rdma_write_keys
static int rdma_write_keys(struct pingpong_dest *my_dest,
struct perftest_comm *comm)
{
struct ibv_send_wr wr;
struct ibv_send_wr *bad_wr;
struct ibv_sge list;
struct ibv_wc wc;
int ne;
#ifdef HAVE_ENDIAN
int i;
struct pingpong_dest m_my_dest;
m_my_dest.lid = htobe32(my_dest->lid);
m_my_dest.out_reads = htobe32(my_dest->out_reads);
m_my_dest.qpn = htobe32(my_dest->qpn);
m_my_dest.psn = htobe32(my_dest->psn);
m_my_dest.rkey = htobe32(my_dest->rkey);
m_my_dest.srqn = htobe32(my_dest->srqn);
m_my_dest.gid_index = htobe32(my_dest->gid_index);
m_my_dest.vaddr = htobe64(my_dest->vaddr);
for(i=0; i<16; i++) {
m_my_dest.gid.raw[i] = my_dest->gid.raw[i];
}
memcpy(comm->rdma_ctx->buf, &m_my_dest, sizeof(struct pingpong_dest));
#else
memcpy(comm->rdma_ctx->buf, &my_dest, sizeof(struct pingpong_dest));
#endif
list.addr = (uintptr_t)comm->rdma_ctx->buf;
list.length = sizeof(struct pingpong_dest);
list.lkey = comm->rdma_ctx->mr->lkey;
wr.wr_id = SYNC_SPEC_ID;
wr.sg_list = &list;
wr.num_sge = 1;
wr.opcode = IBV_WR_SEND;
wr.send_flags = IBV_SEND_SIGNALED;
wr.next = NULL;
if (ibv_post_send(comm->rdma_ctx->qp[0],&wr,&bad_wr)) {
fprintf(stderr, "Function ibv_post_send failed\n");
return 1;
}
do {
ne = ibv_poll_cq(comm->rdma_ctx->send_cq, 1,&wc);
} while (ne == 0);
if (wc.status || wc.opcode != IBV_WC_SEND || wc.wr_id != SYNC_SPEC_ID) {
fprintf(stderr, " Bad wc status %d\n",(int)wc.status);
return 1;
}
return 0;
}
开发者ID:ranjitgm,项目名称:perftest,代码行数:58,代码来源:perftest_communication.c
示例16: mca_btl_openib_get
int mca_btl_openib_get( mca_btl_base_module_t* btl,
mca_btl_base_endpoint_t* endpoint,
mca_btl_base_descriptor_t* descriptor)
{
int rc;
struct ibv_send_wr* bad_wr;
mca_btl_openib_frag_t* frag = (mca_btl_openib_frag_t*) descriptor;
mca_btl_openib_module_t* openib_btl = (mca_btl_openib_module_t*) btl;
frag->endpoint = endpoint;
frag->wr_desc.sr_desc.opcode = IBV_WR_RDMA_READ;
/* check for a send wqe */
if (OPAL_THREAD_ADD32(&endpoint->sd_wqe[BTL_OPENIB_LP_QP],-1) < 0) {
OPAL_THREAD_ADD32(&endpoint->sd_wqe[BTL_OPENIB_LP_QP],1);
OPAL_THREAD_LOCK(&endpoint->endpoint_lock);
opal_list_append(&endpoint->pending_get_frags, (opal_list_item_t*)frag);
OPAL_THREAD_UNLOCK(&endpoint->endpoint_lock);
return OMPI_SUCCESS;
/* check for a get token */
} else if(OPAL_THREAD_ADD32(&endpoint->get_tokens,-1) < 0) {
OPAL_THREAD_ADD32(&endpoint->sd_wqe[BTL_OPENIB_LP_QP],1);
OPAL_THREAD_ADD32(&endpoint->get_tokens,1);
OPAL_THREAD_LOCK(&endpoint->endpoint_lock);
opal_list_append(&endpoint->pending_get_frags, (opal_list_item_t*)frag);
OPAL_THREAD_UNLOCK(&endpoint->endpoint_lock);
return OMPI_SUCCESS;
} else {
frag->wr_desc.sr_desc.send_flags = IBV_SEND_SIGNALED;
frag->wr_desc.sr_desc.wr.rdma.remote_addr = frag->base.des_src->seg_addr.lval;
frag->wr_desc.sr_desc.wr.rdma.rkey = frag->base.des_src->seg_key.key32[0];
frag->sg_entry.addr = (unsigned long) frag->base.des_dst->seg_addr.pval;
frag->sg_entry.length = frag->base.des_dst->seg_len;
if(ibv_post_send(endpoint->lcl_qp[BTL_OPENIB_LP_QP],
&frag->wr_desc.sr_desc,
&bad_wr)){
BTL_ERROR(("error posting send request errno (%d) says %s", errno, strerror(errno)));
rc = ORTE_ERROR;
} else {
rc = ORTE_SUCCESS;
}
if(mca_btl_openib_component.use_srq) {
mca_btl_openib_post_srr(openib_btl, 1, BTL_OPENIB_HP_QP);
mca_btl_openib_post_srr(openib_btl, 1, BTL_OPENIB_LP_QP);
} else {
btl_openib_endpoint_post_rr(endpoint, 1, BTL_OPENIB_HP_QP);
btl_openib_endpoint_post_rr(endpoint, 1, BTL_OPENIB_LP_QP);
}
}
return rc;
}
开发者ID:meghnave,项目名称:SpherePacking,代码行数:57,代码来源:btl_openib.c
示例17: on_completion
void on_completion(struct ibv_wc *wc)
{
struct connection *conn = (struct connection *)(uintptr_t)wc->wr_id;
printf("== STATE: send=%d / recv=%d ==\n", conn->send_state, conn->recv_state);
if (wc->status != IBV_WC_SUCCESS)
die("on_completion: status is not IBV_WC_SUCCESS.");
if (wc->opcode & IBV_WC_RECV) {
conn->recv_state++;
printf("RECV: Recieved: TYPE=%d\n", conn->recv_msg->type);
if (conn->recv_msg->type == MSG_MR) {
memcpy(&conn->peer_mr, &conn->recv_msg->data.mr, sizeof(conn->peer_mr));
post_receives(conn); /* only rearm for MSG_MR */
if (conn->send_state == SS_INIT) /* received peer's MR before sending ours, so send ours back */
send_mr(conn);
}
} else {
conn->send_state++;
printf("SEND: Sent out: TYPE=%d\n", conn->send_msg->type);
}
if (conn->send_state == SS_MR_SENT && conn->recv_state == RS_MR_RECV) {
struct ibv_send_wr wr, *bad_wr = NULL;
struct ibv_sge sge;
if (s_mode == M_WRITE)
printf(" -> received MSG_MR. writing message to remote memory...\n");
else
printf(" -> received MSG_MR. reading message from remote memory...\n");
memset(&wr, 0, sizeof(wr));
wr.wr_id = (uintptr_t)conn;
wr.opcode = (s_mode == M_WRITE) ? IBV_WR_RDMA_WRITE : IBV_WR_RDMA_READ;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)conn->peer_mr.addr;
wr.wr.rdma.rkey = conn->peer_mr.rkey;
sge.addr = (uintptr_t)conn->rdma_local_region;
sge.length = RDMA_BUFFER_SIZE;
sge.lkey = conn->rdma_local_mr->lkey;
TEST_NZ(ibv_post_send(conn->qp, &wr, &bad_wr));
printf("PSEND: Posted send request: MSG=%s\n", conn->rdma_local_region);
conn->send_msg->type = MSG_DONE;
send_message(conn);
} else if (conn->send_state == SS_DONE_SENT && conn->recv_state == RS_DONE_RECV) {
printf(" -> remote buffer: %s\n", get_peer_message_region(conn));
rdma_disconnect(conn->id);
}
}
开发者ID:kento,项目名称:ibrdma,代码行数:56,代码来源:rdma-common.c
示例18: prepare_and_post_send_desc
// All data transfers must go through this function
void prepare_and_post_send_desc(void *src, void *dst,
int dest, int len, int lkey, int rkey, int type, int lock_or_unlock)
{
sr_desc.send_flags = IBV_SEND_SIGNALED;
sr_desc.next = NULL;
sr_desc.opcode = type;
sr_desc.wr_id = 0;
sr_desc.num_sge = 1;
if(IBV_WR_RDMA_WRITE == type) {
sr_desc.wr.rdma.remote_addr = (uintptr_t) (dst);
sr_sg_entry.addr = (uintptr_t) (src);
sr_sg_entry.length = len;
sr_desc.wr.rdma.rkey = rkey;
}
if (IBV_WR_RDMA_READ == type) {
sr_desc.wr.rdma.remote_addr = (uintptr_t) (src);
sr_sg_entry.addr = (uintptr_t) (dst);
sr_sg_entry.length = len;
sr_desc.wr.rdma.rkey = rkey;
}
if (IBV_WR_ATOMIC_CMP_AND_SWP == type) {
sr_desc.wr.atomic.remote_addr = (uintptr_t) (dst);
sr_desc.wr.atomic.rkey = rkey;
sr_sg_entry.addr = (uintptr_t) (src);
sr_sg_entry.length = sizeof(long);
if (lock_or_unlock == OPENIB_LOCK) {
sr_desc.wr.atomic.compare_add = 0;
sr_desc.wr.atomic.swap = l_state.rank + 1;
}
else if (lock_or_unlock == OPENIB_UNLOCK){
sr_desc.wr.atomic.compare_add = l_state.rank + 1;
sr_desc.wr.atomic.swap = 0;
}
else {
assert(0);
}
}
sr_sg_entry.lkey = lkey;
sr_desc.sg_list = &(sr_sg_entry);
struct ibv_send_wr *bad_wr;
if(ibv_post_send(conn.qp[dest], &sr_desc, &bad_wr)) {
fprintf(stderr,"[%d] Error posting send\n",
me);
fflush(stderr);
}
// Increment outstanding and check whether we need to make progress
increment_outstanding();
}
开发者ID:bcernohous,项目名称:ga,代码行数:56,代码来源:openib.c
示例19: fio_rdmaio_close_file
static int fio_rdmaio_close_file(struct thread_data *td, struct fio_file *f)
{
struct rdmaio_data *rd = td->io_ops->data;
struct ibv_send_wr *bad_wr;
/* unregister rdma buffer */
/*
* Client sends notification to the server side
*/
/* refer to: http://linux.die.net/man/7/rdma_cm */
if ((rd->is_client == 1) && ((rd->rdma_protocol == FIO_RDMA_MEM_WRITE)
|| (rd->rdma_protocol ==
FIO_RDMA_MEM_READ))) {
if (ibv_post_send(rd->qp, &rd->sq_wr, &bad_wr) != 0) {
log_err("fio: ibv_post_send fail");
return 1;
}
dprint(FD_IO, "fio: close information sent success\n");
rdma_poll_wait(td, IBV_WC_SEND);
}
if (rd->is_client == 1)
rdma_disconnect(rd->cm_id);
else {
rdma_disconnect(rd->child_cm_id);
#if 0
rdma_disconnect(rd->cm_id);
#endif
}
#if 0
if (get_next_channel_event(td, rd->cm_channel, RDMA_CM_EVENT_DISCONNECTED) != 0) {
log_err("fio: wait for RDMA_CM_EVENT_DISCONNECTED\n");
return 1;
}
#endif
ibv_destroy_cq(rd->cq);
ibv_destroy_qp(rd->qp);
if (rd->is_client == 1)
rdma_destroy_id(rd->cm_id);
else {
rdma_destroy_id(rd->child_cm_id);
rdma_destroy_id(rd->cm_id);
}
ibv_destroy_comp_channel(rd->channel);
ibv_dealloc_pd(rd->pd);
return 0;
}
开发者ID:DebashisGanguly,项目名称:FIOBenchmark,代码行数:54,代码来源:rdma.c
示例20: mvdev_ext_backlogq_send
void mvdev_ext_backlogq_send(mv_qp * qp)
{
mv_sdescriptor *d;
struct ibv_send_wr *sr;
struct ibv_send_wr *bad_wr;
int i;
while (qp->send_credits_remaining > 0 && qp->ext_backlogq_head) {
d = qp->ext_backlogq_head;
/* find how many desc are chained */
i = 1;
sr = &(d->sr);
while(sr->next) {
sr = sr->next;
i++;
}
assert(i == 1);
if(qp->send_credits_remaining >= i) {
qp->ext_backlogq_head = d->next_extsendq;
if (d == qp->ext_backlogq_tail) {
qp->ext_backlogq_tail = NULL;
}
d->next_extsendq = NULL;
mvdev.connections[((mv_sbuf *)d->parent)->rank].queued--;
/* reset the credit counter now -- so we don't lose credits in
* the backlogq */
if(MVDEV_RPUT_FLAG == ((mv_sbuf *)d->parent)->flag) {
D_PRINT("unqueing RPUT\n");
} else {
PACKET_SET_CREDITS(((mv_sbuf *)d->parent), (&(mvdev.connections[((mv_sbuf *) d->parent)->rank])));
}
D_PRINT("at %d, dropping to %d, queued: %d\n", qp->send_credits_remaining,
qp->send_credits_remaining - i, mvdev.connections[((mv_sbuf *)d->parent)->rank].queued);
qp->send_credits_remaining -= i;
if((qp->send_wqes_avail - i) < 0 || (NULL != qp->ext_sendq_head)) {
mvdev_ext_sendq_queue(qp, d);
} else {
if(ibv_post_send(qp->qp, &(d->sr), &bad_wr)) {
error_abort_all(IBV_RETURN_ERR,"Error posting to RC QP (%d)\n", qp->send_wqes_avail);
}
qp->send_wqes_avail -= i;
}
} else {
break;
}
}
}
开发者ID:grondo,项目名称:mvapich-cce,代码行数:53,代码来源:mv_priv.c
注:本文中的ibv_post_send函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论