DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz)
{
/* get a protection domain */
- pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle);
+#ifdef _OPENIB_MCM_
+ if(MFO_EP(&ia_ptr->hca_ptr->ib_trans.addr) && ia_ptr->hca_ptr->ib_trans.scif_tx_ep)
+ dapli_mix_pz_create(ia_ptr, pz);
+ else
+#endif
+ pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle);
+
if (!pz->pd_handle)
return (dapl_convert_errno(ENOMEM, "alloc_pd"));
*/
DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ * pz)
{
+ int ret = DAT_INVALID_STATE;
+
if (pz->pd_handle != IB_INVALID_HANDLE) {
- ibv_dealloc_pd(pz->pd_handle);
+#ifdef _OPENIB_MCM_
+ DAPL_IA * ia_ptr = pz->header.owner_ia;
+ if (MFO_EP(&ia_ptr->hca_ptr->ib_trans.addr) && ia_ptr->hca_ptr->ib_trans.scif_tx_ep)
+ ret = dapli_mix_pz_free(pz);
+ else
+#endif
+ ret = ibv_dealloc_pd(pz->pd_handle);
+
pz->pd_handle = IB_INVALID_HANDLE;
}
- return DAT_SUCCESS;
+ if (!ret)
+ return DAT_SUCCESS;
+
+ return DAT_INVALID_STATE;
}
/*
* DAT_INSUFFICIENT_RESOURCES
*
*/
-
DAT_RETURN
dapls_ib_mr_register(IN DAPL_IA * ia_ptr,
IN DAPL_LMR * lmr,
IN DAT_PVOID virt_addr,
IN DAT_VLEN length,
IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type)
+#ifdef _OPENIB_MCM_
{
- struct ibv_device *ibv_dev = ia_ptr->hca_ptr->ib_hca_handle->device;
+ struct ibv_device *ibv_dev;
int ib_access = dapls_convert_privileges(privileges);
dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
}
- /* iWARP only support */
- if ((va_type == DAT_VA_TYPE_ZB) &&
- (ibv_dev->transport_type != IBV_TRANSPORT_IWARP)) {
+ if (va_type == DAT_VA_TYPE_ZB) {
dapl_dbg_log(DAPL_DBG_TYPE_ERR,
" va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n");
return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
}
-#ifdef _OPENIB_MCM_
ib_access |= IBV_ACCESS_REMOTE_READ; /* HST->MXS, peer PI RR */
-#endif
/* local read is default on IB */
- lmr->mr_handle =
- ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle,
- virt_addr, length, ib_access);
+ if (!MFO_EP(&ia_ptr->hca_ptr->ib_trans.addr) || !ia_ptr->hca_ptr->ib_trans.scif_tx_ep) {
+ lmr->mr_handle =
+ ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle,
+ virt_addr, length, ib_access);
- if (!lmr->mr_handle)
- return (dapl_convert_errno(ENOMEM, "reg_mr"));
+ if (!lmr->mr_handle)
+ return (dapl_convert_errno(ENOMEM, "reg_mr"));
- lmr->param.lmr_context = lmr->mr_handle->lkey;
- lmr->param.rmr_context = lmr->mr_handle->rkey;
+ lmr->param.lmr_context = lmr->mr_handle->lkey;
+ lmr->param.rmr_context = lmr->mr_handle->rkey;
+
+ dapl_log(DAPL_DBG_TYPE_UTIL,
+ " mr_register: mr=%p addr=%p pd %p ctx %p "
+ "lkey=0x%x rkey=0x%x priv=%x\n",
+ lmr->mr_handle, lmr->mr_handle->addr,
+ lmr->mr_handle->pd, lmr->mr_handle->context,
+ lmr->mr_handle->lkey, lmr->mr_handle->rkey,
+ length, dapls_convert_privileges(privileges));
+ }
lmr->param.registered_size = length;
lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr;
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " mr_register: mr=%p addr=%p pd %p ctx %p "
- "lkey=0x%x rkey=0x%x priv=%x\n",
- lmr->mr_handle, lmr->mr_handle->addr,
- lmr->mr_handle->pd, lmr->mr_handle->context,
- lmr->mr_handle->lkey, lmr->mr_handle->rkey,
- length, dapls_convert_privileges(privileges));
-
-#ifdef _OPENIB_MCM_
/* RDMA proxy with MPXYD register with SCIF */
if (ia_ptr->hca_ptr->ib_trans.scif_tx_ep) {
DAT_VLEN offset = (DAT_VLEN)(virt_addr - ALIGN_DOWN_PPAGE(virt_addr));
mcm_map_str(ia_ptr->hca_ptr->ib_trans.addr.ep_map));
/* plus cross socket proxy-in; send registration info to MPXYD */
- if (MXS_EP(&ia_ptr->hca_ptr->ib_trans.addr)) {
+ if (MXF_EP(&ia_ptr->hca_ptr->ib_trans.addr)) {
+ /* MFO - Mic in Mic Full Offload */
if (dapli_mix_mr_create(&ia_ptr->hca_ptr->ib_trans, lmr)) {
dapls_ib_mr_deregister(lmr);
return (dapl_convert_errno(ENOMEM, "reg_mr"));
}
+ if (MFO_EP(&ia_ptr->hca_ptr->ib_trans.addr)) {
+ lmr->param.lmr_context = lmr->mr_id;
+ lmr->param.rmr_context = lmr->mr_id;
+ lmr->mr_handle->lkey = lmr->param.lmr_context;
+ lmr->mr_handle->rkey = lmr->param.rmr_context;
+ }
}
}
-#endif
dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
" mr_register: ia=%p, lmr=%p va=%p ln=%d priv=%d return\n",
ia_ptr, lmr, virt_addr, length, privileges);
return DAT_SUCCESS;
}
+#else
+{
+ struct ibv_device *ibv_dev;
+ int ib_access = dapls_convert_privileges(privileges);
+
+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
+ " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n",
+ ia_ptr, lmr, virt_addr, length, privileges);
+
+ if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) {
+ dapl_dbg_log(DAPL_DBG_TYPE_ERR,
+ " mr_register_shared: NOT IMPLEMENTED\n");
+ return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
+ }
+
+ /* iWARP only support */
+ ibv_dev = ia_ptr->hca_ptr->ib_hca_handle->device;
+ if ((va_type == DAT_VA_TYPE_ZB) && (ibv_dev->transport_type != IBV_TRANSPORT_IWARP)) {
+ dapl_dbg_log(DAPL_DBG_TYPE_ERR,
+ " va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n");
+ return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
+ }
+
+ /* local read is default on IB */
+ lmr->mr_handle = ibv_reg_mr(((DAPL_PZ *)lmr->param.pz_handle)->pd_handle,
+ virt_addr, length, ib_access);
+ if (!lmr->mr_handle)
+ return (dapl_convert_errno(ENOMEM, "reg_mr"));
+
+ lmr->param.lmr_context = lmr->mr_handle->lkey;
+ lmr->param.rmr_context = lmr->mr_handle->rkey;
+
+ dapl_log(DAPL_DBG_TYPE_UTIL,
+ " mr_register: mr=%p addr=%p pd %p ctx %p "
+ "lkey=0x%x rkey=0x%x priv=%x\n",
+ lmr->mr_handle, lmr->mr_handle->addr,
+ lmr->mr_handle->pd, lmr->mr_handle->context,
+ lmr->mr_handle->lkey, lmr->mr_handle->rkey,
+ length, dapls_convert_privileges(privileges));
+
+ lmr->param.registered_size = length;
+ lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr;
+
+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
+ " mr_register: ia=%p, lmr=%p va=%p ln=%d priv=%d return\n",
+ ia_ptr, lmr, virt_addr, length, privileges);
+
+ return DAT_SUCCESS;
+}
+#endif
/*
* dapl_ib_mr_deregister
*
*/
DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR * lmr)
-{
#ifdef _OPENIB_MCM_
- if (lmr->header.owner_ia->hca_ptr->ib_trans.scif_ep) {
+{
+ DAPL_IA * ia_ptr = (DAPL_IA *)lmr->param.ia_handle;
+ if (ia_ptr->hca_ptr->ib_trans.scif_ep) {
int ret;
- if (lmr->header.owner_ia->hca_ptr->ib_trans.addr.ep_map == MIC_XSOCK_DEV) {
- if (dapli_mix_mr_free(&lmr->header.owner_ia->hca_ptr->ib_trans, lmr)) {
+ if (MXF_EP(&ia_ptr->hca_ptr->ib_trans.addr)) {
+ if (dapli_mix_mr_free(&ia_ptr->hca_ptr->ib_trans, lmr)) {
dapl_log(DAPL_DBG_TYPE_ERR,
" mr_deregister: ERR: lmr_remove; id %d sci_addr %p, off 0x%llx, len %d ret=%s\n",
lmr->mr_id, lmr->param.registered_address, lmr->sci_addr,
ALIGN_PAGE(lmr->param.registered_size+lmr->sci_off), strerror(errno));
+ return DAT_INVALID_STATE;
}
}
- ret = scif_unregister(lmr->header.owner_ia->hca_ptr->ib_trans.scif_tx_ep,
+ ret = scif_unregister(ia_ptr->hca_ptr->ib_trans.scif_tx_ep,
lmr->sci_addr, ALIGN_PAGE(lmr->param.registered_size+lmr->sci_off));
if (ret)
dapl_log(DAPL_DBG_TYPE_ERR,
lmr->sci_off = 0;
lmr->mr_id = 0;
}
-#endif
if (lmr->mr_handle != IB_INVALID_HANDLE) {
if (ibv_dereg_mr(lmr->mr_handle))
return (dapl_convert_errno(errno, "dereg_mr"));
lmr->mr_handle = IB_INVALID_HANDLE;
}
+ return DAT_SUCCESS;
+}
+#else
+{
+ if (lmr->mr_handle != IB_INVALID_HANDLE) {
+ if (ibv_dereg_mr(lmr->mr_handle))
+ return (dapl_convert_errno(errno, "dereg_mr"));
+ lmr->mr_handle = IB_INVALID_HANDLE;
+ }
return DAT_SUCCESS;
}
+#endif
/*
* dapl_ib_mr_register_shared
tp->na.mode = "DIRECT";
tp->na.read = "TRUE";
#endif
-
- /* query verbs for this device and port attributes */
- if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
- ibv_query_port(hca_ptr->ib_hca_handle,
- hca_ptr->port_num, &port_attr))
- return (dapl_convert_errno(errno, "ib_query_hca"));
+#ifdef _OPENIB_MCM_
+ if (MFO_EP(&hca_ptr->ib_trans.addr) && tp->self.node) {
+ if (dapli_mix_query_device(tp, &dev_attr) ||
+ dapli_mix_query_port(tp, hca_ptr->port_num, &port_attr))
+ return (dapl_convert_errno(errno, "mix_query_hca"));
+ }
+ else
+#endif
+ /* query verbs for this device and port attributes */
+ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) ||
+ ibv_query_port(hca_ptr->ib_hca_handle,
+ hca_ptr->port_num, &port_attr))
+ return (dapl_convert_errno(errno, "ib_query_hca"));
dev_attr.max_qp_wr = DAPL_MIN(dev_attr.max_qp_wr,
dapl_os_get_env_val("DAPL_WR_MAX", dev_attr.max_qp_wr));
if (ia_attr != NULL) {
(void)dapl_os_memzero(ia_attr, sizeof(*ia_attr));
- strncpy(ia_attr->adapter_name,
- ibv_get_device_name(tp->ib_dev),
- DAT_NAME_MAX_LENGTH - 1);
+#ifdef _OPENIB_MCM_
+ /* MIC at MFO mode - Initialized at Open */
+ if (MFO_EP(&hca_ptr->ib_trans.addr) && tp->self.node) {
+ strncpy(ia_attr->adapter_name, hca_ptr->name, DAT_NAME_MAX_LENGTH);
+ }
+ else
+#endif
+ strncpy(ia_attr->adapter_name, ibv_get_device_name(tp->ib_dev),
+ DAT_NAME_MAX_LENGTH - 1);
+
ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0';
ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR) &hca_ptr->hca_address;
ia_attr->max_message_size = port_attr.max_msg_sz;
ia_attr->max_rdma_size = port_attr.max_msg_sz;
/* iWARP spec. - 1 sge for RDMA reads */
- if (hca_ptr->ib_hca_handle->device->transport_type == IBV_TRANSPORT_IWARP)
- ia_attr->max_iov_segments_per_rdma_read = 1;
- else
- ia_attr->max_iov_segments_per_rdma_read = dev_attr.max_sge;
+ ia_attr->max_iov_segments_per_rdma_read = dev_attr.max_sge;
+#ifdef _OPENIB_MCM_
+ if (!MFO_EP(&hca_ptr->ib_trans.addr))
+#endif
+ if (hca_ptr->ib_hca_handle->device->transport_type == IBV_TRANSPORT_IWARP)
+ ia_attr->max_iov_segments_per_rdma_read = 1;
ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge;
ia_attr->num_transport_attr = 0;
ia_attr->transport_attr = NULL;
tp->na.mtu = dapl_ib_mtu_str(tp->ib_cm.mtu);
tp->na.port = dapl_ib_port_str(port_attr.state);
tp->na.port_num = dapl_ib_port_num_str(hca_ptr->port_num);
- if (!tp->guid)
- tp->guid = ntohll(ibv_get_device_guid(tp->ib_dev));
+ if (!tp->guid) {
+#ifdef _OPENIB_MCM_
+ if (MFO_EP(&hca_ptr->ib_trans.addr) && tp->self.node)
+ tp->guid = ntohll(dev_attr.node_guid);
+ else
+#endif
+ tp->guid = ntohll(ibv_get_device_guid(tp->ib_dev));
+ }
sprintf(tp->guid_str, "%04x:%04x:%04x:%04x",
(unsigned) (tp->guid >> 48) & 0xffff,
(unsigned) (tp->guid >> 16) & 0xffff,
(unsigned) (tp->guid >> 0) & 0xffff);
+#ifdef _OPENIB_MCM_
+ /* initialized at open */
+ if (MFO_EP(&hca_ptr->ib_trans.addr) && tp->self.node)
+ goto skip_ib;
+#endif
+
if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB)
goto skip_ib;