diff --git a/transport/rdma.c b/transport/rdma.c index dad4cf5e6d5deefadc06516d7a8fd6b8ece7a668..353473ba6228abc7330208a83b1c95f72c53ae7f 100644 --- a/transport/rdma.c +++ b/transport/rdma.c @@ -395,7 +395,7 @@ mstro_transport_rdma__read(const struct mstro_pm_app_registry_entry *app_entry, mstro_cdo cdo_dst, void *mr_desc, uint64_t mr_addr, uint64_t mr_key, - size_t offset, size_t len, + size_t offset, size_t len, size_t dst_offset, struct mstro_transport_rdma_cb_args *closure) { mstro_status status; @@ -432,7 +432,7 @@ mstro_transport_rdma__read(const struct mstro_pm_app_registry_entry *app_entry, size_t num_retries = NUM_READ_RETRIES; RETRY_RDMA_TRANSPORT_READ: ; int ret = fi_read(app_entry->ep->ep, - (uint8_t*)cdo_dst->raw_ptr+offset, len, + (uint8_t*)cdo_dst->raw_ptr+offset+dst_offset, len, mr_desc, app_entry->addr, mr_addr+offset, mr_key, ctx); if(ret==-FI_EAGAIN) { @@ -521,7 +521,7 @@ mstro_transport_rdma_dst_execute(mstro_cdo cdo_dst, Mstro__Pool__TransferTicket* } uint64_t requested_key = app_entry->ep->fi->domain_attr->mr_mode & FI_MR_PROV_KEY ? 0 : mstro_memory_new_key(); - int err = fi_mr_reg(app_entry->ep->domain, cdo_dst->raw_ptr, len, + int err = fi_mr_reg(app_entry->ep->domain, cdo_dst->raw_ptr+ticket->dst_offset, len, FI_READ, 0, requested_key, 0, &mr, NULL); if (err) { ERR("Couldn't register memory region for RDMA transport (err: %d, %s)\n", @@ -601,14 +601,14 @@ mstro_transport_rdma_dst_execute(mstro_cdo cdo_dst, Mstro__Pool__TransferTicket* } /* read full-fragment blocks */ - size_t offset=ticket->dst_offset; // write dst cdos at the correct position + size_t offset=0; size_t num_retries; for(size_t i=closure->num_fragments; i-->1; ) { status = mstro_transport_rdma__read(app_entry, cdo_dst, local_buf_mr_desc, mr_addr, mr_key, - offset, fragment_size, - closure); + offset, fragment_size, ticket->dst_offset, + closure); //add dst_offset for dist_cdos if(status!=MSTRO_OK) { ERR("Failed to read fragment %zu\n", closure->num_fragments - i); goto BAILOUT; @@ -619,8 +619,8 @@ mstro_transport_rdma_dst_execute(mstro_cdo cdo_dst, Mstro__Pool__TransferTicket* /* final (partial) read */ status = mstro_transport_rdma__read(app_entry, cdo_dst, local_buf_mr_desc, mr_addr, mr_key, - offset, len-offset, - closure); + offset, len-offset, ticket->dst_offset, + closure); if(status!=MSTRO_OK) { ERR("Failed to read last fragment\n"); goto BAILOUT;