int mca_btl_vader_put (struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct mca_btl_base_descriptor_t *des) { mca_btl_vader_frag_t *frag = (mca_btl_vader_frag_t *) des; mca_btl_base_segment_t *src = des->des_local; mca_btl_base_segment_t *dst = des->des_remote; const size_t size = min(dst->seg_len, src->seg_len); mca_mpool_base_registration_t *reg; void *rem_ptr; reg = vader_get_registation (endpoint, dst->seg_addr.pval, dst->seg_len, 0, &rem_ptr); if (OPAL_UNLIKELY(NULL == reg)) { return OPAL_ERROR; } vader_memmove (rem_ptr, src->seg_addr.pval, size); vader_return_registration (reg, endpoint); /* always call the callback function */ frag->base.des_flags |= MCA_BTL_DES_SEND_ALWAYS_CALLBACK; mca_btl_vader_frag_complete (frag); return OPAL_SUCCESS; }
int mca_btl_vader_get_xpmem (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpoint, void *local_address, uint64_t remote_address, mca_btl_base_registration_handle_t *local_handle, mca_btl_base_registration_handle_t *remote_handle, size_t size, int flags, int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbcontext, void *cbdata) { mca_rcache_base_registration_t *reg; void *rem_ptr; /* silence warning about unused arguments */ (void) local_handle; (void) remote_handle; reg = vader_get_registation (endpoint, (void *)(intptr_t) remote_address, size, 0, &rem_ptr); if (OPAL_UNLIKELY(NULL == rem_ptr)) { return OPAL_ERROR; } vader_memmove (local_address, rem_ptr, size); vader_return_registration (reg, endpoint); /* always call the callback function */ cbfunc (btl, endpoint, local_address, local_handle, cbcontext, cbdata, OPAL_SUCCESS); return OPAL_SUCCESS; }
static int mca_btl_vader_component_progress (void) { int my_smp_rank = mca_btl_vader_component.my_smp_rank; vader_fifo_t *fifo = mca_btl_vader_component.fifo[my_smp_rank]; mca_btl_active_message_callback_t *reg; mca_btl_vader_frag_t frag; mca_btl_vader_hdr_t *hdr; mca_mpool_base_registration_t *xpmem_reg = NULL; /* check active sends for completion */ mca_btl_vader_progress_sends (); /* check for messages in fast boxes */ mca_btl_vader_check_fboxes (); /* poll the fifo once */ hdr = vader_fifo_read (fifo); if (NULL == hdr) { return 0; } reg = mca_btl_base_active_message_trigger + hdr->tag; frag.base.des_dst = frag.segments; frag.segments[0].seg_addr.pval = (void *) (hdr + 1); frag.segments[0].seg_len = hdr->len; if (OPAL_UNLIKELY(hdr->flags & MCA_BTL_VADER_FLAG_SINGLE_COPY)) { xpmem_reg = vader_get_registation (hdr->my_smp_rank, hdr->sc_iov.iov_base, hdr->sc_iov.iov_len, 0); frag.segments[1].seg_addr.pval = vader_reg_to_ptr (xpmem_reg, hdr->sc_iov.iov_base); frag.segments[1].seg_len = hdr->sc_iov.iov_len; /* recv upcall */ frag.base.des_dst_cnt = 2; reg->cbfunc(&mca_btl_vader.super, hdr->tag, &(frag.base), reg->cbdata); vader_return_registration (xpmem_reg, hdr->my_smp_rank); } else { frag.base.des_dst_cnt = 1; reg->cbfunc(&mca_btl_vader.super, hdr->tag, &(frag.base), reg->cbdata); } /* return the fragment */ hdr->complete = true; return 1; }
/** * Initiate an synchronous get. * * @param btl (IN) BTL module * @param endpoint (IN) BTL addressing information * @param descriptor (IN) Description of the data to be transferred */ int mca_btl_vader_get (struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct mca_btl_base_descriptor_t *des) { mca_btl_vader_frag_t *frag = (mca_btl_vader_frag_t *) des; mca_btl_base_segment_t *src = des->des_src; mca_btl_base_segment_t *dst = des->des_dst; const size_t size = min(dst->seg_len, src->seg_len); mca_mpool_base_registration_t *reg; void *rem_ptr; reg = vader_get_registation (endpoint, src->seg_addr.pval, src->seg_len, 0, &rem_ptr); if (OPAL_UNLIKELY(NULL == rem_ptr)) { return OMPI_ERROR; } vader_memmove (dst->seg_addr.pval, rem_ptr, size); vader_return_registration (reg, endpoint); mca_btl_vader_frag_complete (frag); return OMPI_SUCCESS; }