Mmapmem::Mmapmem(scif_epd_t epd, off_t off, std::size_t len, int prot_flags) { if ((addr_ = scif_mmap(nullptr, len, prot_flags, 0, epd, off)) == SCIF_MMAP_FAILED) throw std::system_error(errno, std::system_category(), __FILE__LINE__); len_ = len; off_ = off; }
/* must be called with the endpoint lock held */ static int mca_btl_scif_ep_connect_finish (mca_btl_base_endpoint_t *ep, bool passive) { int rc; rc = mca_btl_scif_ep_get_buffer (ep); if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) { BTL_VERBOSE(("error allocating buffer for scif peer")); return rc; } if (passive) { rc = scif_recv (ep->scif_epd, &ep->send_buffer.scif_offset, sizeof (ep->send_buffer.scif_offset), SCIF_RECV_BLOCK); if (OPAL_LIKELY(-1 != rc)) { rc = scif_send (ep->scif_epd, &ep->recv_buffer.scif_offset, sizeof (ep->recv_buffer.scif_offset), SCIF_SEND_BLOCK); } } else { rc = scif_send (ep->scif_epd, &ep->recv_buffer.scif_offset, sizeof (ep->recv_buffer.scif_offset), SCIF_SEND_BLOCK); if (OPAL_LIKELY(-1 != rc)) { rc = scif_recv (ep->scif_epd, &ep->send_buffer.scif_offset, sizeof (ep->send_buffer.scif_offset), SCIF_RECV_BLOCK); } } if (OPAL_UNLIKELY(-1 == rc)) { BTL_VERBOSE(("error exchanging connection data with peer %d", ep->peer_proc->proc_name.vpid)); mca_btl_scif_ep_free_buffer (ep); return OPAL_ERROR; } BTL_VERBOSE(("remote peer %d has scif offset %lu", ep->peer_proc->proc_name.vpid, (unsigned long) ep->send_buffer.scif_offset)); ep->send_buffer.buffer = scif_mmap (0, mca_btl_scif_component.segment_size, SCIF_PROT_READ | SCIF_PROT_WRITE, 0, ep->scif_epd, ep->send_buffer.scif_offset); if (OPAL_UNLIKELY(NULL == ep->send_buffer.buffer)) { BTL_VERBOSE(("error in scif_mmap")); mca_btl_scif_ep_free_buffer (ep); return OPAL_ERROR; } opal_memchecker_base_mem_defined (ep->send_buffer.buffer, mca_btl_scif_component.segment_size); BTL_VERBOSE(("remote peer %d buffer mapped to local pointer %p", ep->peer_proc->proc_name.vpid, ep->send_buffer.buffer)); /* setup the circular send buffers */ ep->send_buffer.start = ep->send_buffer.end = 64; ep->send_buffer.startp = (uint32_t *) ep->send_buffer.buffer; ep->send_buffer.endp = ep->send_buffer.startp + 1; ep->recv_buffer.start = 64; /* connection complete */ ep->state = MCA_BTL_SCIF_EP_STATE_CONNECTED; BTL_VERBOSE(("btl/scif connection to remote peer %d established", ep->peer_proc->proc_name.vpid)); return OPAL_SUCCESS; }