Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/* 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;
}