]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
mcm: add MFO proxy commands, device, and CM support
authorAmir Hanania <amir.hanania@intel.com>
Wed, 5 Aug 2015 21:46:20 +0000 (14:46 -0700)
committerArlin Davis <arlin.r.davis@intel.com>
Wed, 5 Aug 2015 21:46:20 +0000 (14:46 -0700)
CM will support Proxy-in services on both MFO and MXS modes.
CM thread will not process ibv channels when in MFO mode.

Device open/close will export all verbs calls in MFO mode.

Add MIX (MIC to Proxy) functions for pz, device query, port query.

Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
Signed-off-by: Amir Hanania <amir.hanania@intel.com>
dapl/openib_mcm/cm.c
dapl/openib_mcm/device.c
dapl/openib_mcm/mix.c
dapl/openib_mcm/proxy.c

index 17dadd620c8ae8d11992c1cc41d9ac019175e8aa..56ed23a4071b860a0f08189f205f96072534a5bc 100644 (file)
@@ -772,7 +772,7 @@ dp_ib_cm_handle_t dapls_cm_create(DAPL_HCA *hca, DAPL_EP *ep)
 
                }
                /* QPr is on proxy when xsocket from device */
-               if (!MXS_EP(&hca->ib_trans.addr)) {
+               if (!MXF_EP(&hca->ib_trans.addr)) {
                        cm->msg.saddr1.qpn = htonl(ep->qp_handle->qp->qp_num); /* QPr local*/
                        cm->msg.saddr1.qp_type = ep->qp_handle->qp->qp_type;
                        cm->msg.saddr1.lid = hca->ib_trans.addr.lid;
@@ -1170,7 +1170,7 @@ void mcm_connect_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg)
        /* QP to RTR-RTS with remote QPt (daddr2) info */
        dapl_os_lock(&cm->ep->header.lock);
 
-       if (!MXS_EP(&cm->hca->ib_trans.addr)) {
+       if (!MXF_EP(&cm->hca->ib_trans.addr)) {
                ret = dapls_modify_qp_rtu(cm->ep->qp_handle->qp,
                                          cm->msg.daddr2.qpn,
                                          cm->msg.daddr2.lid,
@@ -1195,7 +1195,7 @@ void mcm_connect_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg)
                        goto bail;
                }
                /* MXS peer: setup PI WC and save peer WR queue info */
-               if (MXS_EP(&cm->msg.daddr1)) {
+               if (MXF_EP(&cm->msg.daddr1)) {
                        /* save PI WR info, create local WC_q, send back WC info */
                        mcm_ntoh_wrc(&ep->qp_handle->wrc_rem, (mcm_wrc_info_t*)cm->msg.p_proxy);
                        mcm_create_wc_q(ep->qp_handle, ep->qp_handle->wrc_rem.wr_end + 1);
@@ -1483,7 +1483,7 @@ dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
 
        /* modify QPr to RTR and then to RTS, QPr (qp) to remote QPt (daddr2), !xsocket */
        dapl_os_lock(&ep->header.lock);
-       if (!MXS_EP(&cm->hca->ib_trans.addr)) {
+       if (!MXF_EP(&cm->hca->ib_trans.addr)) {
                ret = dapls_modify_qp_rtu(ep->qp_handle->qp,
                                          cm->msg.daddr2.qpn,
                                          cm->msg.daddr2.lid,
@@ -1519,7 +1519,7 @@ dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
                               &cm->hca->ib_trans.addr.gid, 16);
 
                /* MXS peer: setup PI WC and save peer WR queue info */
-               if (MXS_EP(&cm->msg.daddr1)) {
+               if (MXF_EP(&cm->msg.daddr1)) {
                        /* save PI WR info, create local WC_q, send back WC info */
                        mcm_ntoh_wrc(&ep->qp_handle->wrc_rem, (mcm_wrc_info_t*)cm->msg.p_proxy);
                        mcm_create_wc_q(ep->qp_handle, ep->qp_handle->wrc_rem.wr_end + 1);
@@ -1552,7 +1552,7 @@ dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data)
        cm->msg.op = htons(MCM_REP);
        cm->msg.rd_in = ep->param.ep_attr.max_rdma_read_in;
 
-       if (!MXS_EP(&cm->hca->ib_trans.addr)) {
+       if (!MXF_EP(&cm->hca->ib_trans.addr)) {
                cm->msg.saddr1.qpn = htonl(ep->qp_handle->qp->qp_num);
                cm->msg.saddr1.qp_type = ep->qp_handle->qp->qp_type;
                cm->msg.saddr1.lid = cm->hca->ib_trans.addr.lid;
@@ -1654,7 +1654,7 @@ dapls_ib_connect(IN DAT_EP_HANDLE ep_handle,
        /* HST dev scif0, remote LID is host proxy, not MIC */
 
        /* validate port and ep_map range */
-       if ((mcm_ia->port > 2) || (mcm_ia->ep_map > 3))
+       if ((mcm_ia->port > 2) || (mcm_ia->ep_map > 4))
                cm->msg.daddr1.ep_map = 0;
 
        /* remote uCM information, comes from consumer provider r_addr */
@@ -2072,11 +2072,14 @@ void cm_thread(void *arg)
                time_ms = -1; /* reset to blocking */
                dapl_fd_zero(set);
                dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ);    
-               dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);
-               dapl_fd_set(hca->ib_trans.rch_fd, set, DAPL_FD_READ);
                dapl_fd_set(hca->ib_trans.scif_ev_ep, set, DAPL_FD_READ);
-               dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);
-               
+               if (!MFO_EP(&hca->ib_trans.addr) || !hca->ib_trans.self.node)
+               {
+                       dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ);
+                       dapl_fd_set(hca->ib_trans.rch_fd, set, DAPL_FD_READ);
+                       dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ);
+               }
+
                dapl_os_lock(&hca->ib_trans.cqlock); /* CQt for HST->MXS */
                if (!dapl_llist_is_empty(&hca->ib_trans.cqlist))
                        m_cq = dapl_llist_peek_head(&hca->ib_trans.cqlist);
@@ -2131,9 +2134,12 @@ void cm_thread(void *arg)
                dapl_os_unlock(&hca->ib_trans.lock);
                dapl_select(set, time_ms);
 
-               if (dapl_poll(hca->ib_trans.rch_fd,
-                                       DAPL_FD_READ) == DAPL_FD_READ) {
-                       mcm_recv(&hca->ib_trans);
+               if (!MFO_EP(&hca->ib_trans.addr) || !hca->ib_trans.self.node)
+               {
+                       if (dapl_poll(hca->ib_trans.rch_fd,
+                                     DAPL_FD_READ) == DAPL_FD_READ) {
+                               mcm_recv(&hca->ib_trans);
+                       }
                }
                ret = dapl_poll(hca->ib_trans.scif_ev_ep, DAPL_FD_READ);
                if (ret == DAPL_FD_READ)
@@ -2145,20 +2151,26 @@ void cm_thread(void *arg)
                                 hca->ib_trans.dev_id, hca->ib_trans.scif_ev_ep);
 
                        event.event_type = IBV_EVENT_DEVICE_FATAL;
-                       dapl_evd_un_async_error_callback(hca->ib_hca_handle,
-                                                        &event,
-                                                        hca->ib_trans.async_un_ctx);
+                       if (!MFO_EP(&hca->ib_trans.addr) || !hca->ib_trans.self.node)
+                       {
+                               dapl_evd_un_async_error_callback(hca->ib_hca_handle,
+                                                                &event,
+                                                                hca->ib_trans.async_un_ctx);
+                       }
                        dapl_os_lock(&hca->ib_trans.lock);
                        hca->ib_trans.cm_state = IB_THREAD_CANCEL;
                        continue;
                }
-               if (dapl_poll(hca->ib_hca_handle->async_fd, 
-                             DAPL_FD_READ) == DAPL_FD_READ) {
-                       dapli_async_event_cb(&hca->ib_trans);
-               }
-               if (dapl_poll(hca->ib_trans.ib_cq->fd, 
-                             DAPL_FD_READ) == DAPL_FD_READ) {
-                       dapli_cq_event_cb(&hca->ib_trans);
+               if (!MFO_EP(&hca->ib_trans.addr) || !hca->ib_trans.self.node)
+               {
+                       if (dapl_poll(hca->ib_hca_handle->async_fd,
+                                     DAPL_FD_READ) == DAPL_FD_READ) {
+                               dapli_async_event_cb(&hca->ib_trans);
+                       }
+                       if (dapl_poll(hca->ib_trans.ib_cq->fd,
+                                     DAPL_FD_READ) == DAPL_FD_READ) {
+                               dapli_cq_event_cb(&hca->ib_trans);
+                       }
                }
                while (dapl_poll(hca->ib_trans.signal.scm[0], 
                                 DAPL_FD_READ) == DAPL_FD_READ) {
@@ -2182,7 +2194,7 @@ out:
 static void mcm_log_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in)
 {
        if (in) {
-               if (MXS_EP(&msg->daddr1) && MXS_EP(&msg->saddr1)) {
+               if (MXF_EP(&msg->daddr1) && MXF_EP(&msg->saddr1)) {
                        dapl_log(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s <- QPt_r addr2: 0x%x %x 0x%x %s\n",
                                mcm_state_str(state), htons(msg->daddr2.lid),
                                htonl(msg->daddr2.qpn), htons(msg->dport),
@@ -2204,7 +2216,7 @@ static void mcm_log_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in)
                                htons(msg->sport), mcm_map_str(msg->saddr1.ep_map));
                }
        } else {
-               if (MXS_EP(&msg->saddr1) && MXS_EP(&msg->daddr1)) {
+               if (MXF_EP(&msg->saddr1) && MXF_EP(&msg->daddr1)) {
                        dapl_log(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s -> QPt_r addr2: 0x%x %x 0x%x %s\n",
                                mcm_state_str(state), htons(msg->saddr2.lid),
                                htonl(msg->saddr2.qpn), htons(msg->sport),
index bf3ef7d74235dabf61fe4d9e86526ec2ea67670a..92ab2018aabdd3aa293fc32df175413c2aed2ea4 100644 (file)
@@ -180,7 +180,7 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                             IN DAPL_HCA * hca_ptr,
                             IN DAPL_OPEN_FLAGS flags)
 {
-       struct ibv_device **dev_list;
+       struct ibv_device **dev_list = NULL;
        struct dat_mcm_addr *mcm_ia = (struct dat_mcm_addr *) &hca_ptr->hca_address;
        struct ibv_port_attr port_attr;
        int i, nd = 0;
@@ -190,13 +190,71 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                 PROVIDER_NAME, hca_name, hca_ptr,
                 flags & DAPL_OPEN_QUERY ? "QUERY MODE":"STD MODE");
 
+       /* set RC tunables via enviroment or default */
+       hca_ptr->ib_trans.ib_cm.max_inline =
+           dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_IB_DEFAULT);
+       hca_ptr->ib_trans.ib_cm.ack_retry =
+           dapl_os_get_env_val("DAPL_ACK_RETRY", DCM_ACK_RETRY);
+       hca_ptr->ib_trans.ib_cm.ack_timer =
+           dapl_os_get_env_val("DAPL_ACK_TIMER", DCM_ACK_TIMER);
+       hca_ptr->ib_trans.ib_cm.rnr_retry =
+           dapl_os_get_env_val("DAPL_RNR_RETRY", DCM_RNR_RETRY);
+       hca_ptr->ib_trans.ib_cm.rnr_timer =
+           dapl_os_get_env_val("DAPL_RNR_TIMER", DCM_RNR_TIMER);
+       hca_ptr->ib_trans.ib_cm.global =
+           dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", DCM_GLOBAL);
+       hca_ptr->ib_trans.ib_cm.hop_limit =
+           dapl_os_get_env_val("DAPL_HOP_LIMIT", DCM_HOP_LIMIT);
+       hca_ptr->ib_trans.ib_cm.tclass =
+           dapl_os_get_env_val("DAPL_TCLASS", DCM_TCLASS);
+       hca_ptr->ib_trans.ib_cm.mtu =
+           dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", DCM_IB_MTU));
+
+       /* initialize CM list, LISTEN, SND queue, PSP array, locks */
+       if ((dapl_os_lock_init(&hca_ptr->ib_trans.lock)) != DAT_SUCCESS)
+               goto err;
+
+       if ((dapl_os_lock_init(&hca_ptr->ib_trans.llock)) != DAT_SUCCESS)
+               goto err;
+
+       if ((dapl_os_lock_init(&hca_ptr->ib_trans.slock)) != DAT_SUCCESS)
+               goto err;
+
+       if ((dapl_os_lock_init(&hca_ptr->ib_trans.plock)) != DAT_SUCCESS)
+               goto err;
+
+       if ((dapl_os_lock_init(&hca_ptr->ib_trans.cqlock)) != DAT_SUCCESS)
+               goto err;
+
+       /* initialize CM and listen lists on this HCA uCM QP */
+       dapl_llist_init_head(&hca_ptr->ib_trans.list);
+       dapl_llist_init_head(&hca_ptr->ib_trans.llist);
+       dapl_llist_init_head(&hca_ptr->ib_trans.cqlist);
+
+       /* Get MIC mode and EP mappings */
+       if (dapli_mix_mode(&hca_ptr->ib_trans, hca_name))
+               goto err;
+
+       /* MIC EP with Full offload, no local verbs device */
+       if (MFO_EP(&hca_ptr->ib_trans.addr)) {
+               if (dapli_mix_open(&hca_ptr->ib_trans, hca_name,
+                                  hca_ptr->port_num,
+                                  flags & DAPL_OPEN_QUERY)) {
+                       dapl_log(DAPL_DBG_TYPE_ERR,
+                               " open_hca: SCIF init ERR on %s\n", hca_name);
+                       goto err;
+               }
+               hca_ptr->ib_hca_handle = hca_ptr->ib_trans.ib_ctx;
+               goto cm_init;
+       }
+
        /* Get list of all IB devices, find match, open */
        dev_list = ibv_get_device_list(&nd);
        if (!dev_list) {
                dapl_dbg_log(DAPL_DBG_TYPE_ERR,
                             " open_hca: ibv_get_device_list() failed\n",
                             hca_name);
-               return DAT_INTERNAL_ERROR;
+               goto err;
        }
        dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca %p: %d devices found\n", hca_ptr, nd);
        hca_ptr->ib_trans.ib_dev = NULL;
@@ -211,7 +269,7 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
        if (hca_ptr->ib_trans.ib_dev == NULL) {
                dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: device %s not found\n", hca_name);
                dat_status = DAT_PROVIDER_NOT_FOUND;
-               goto err;
+               goto err2;
        }
 
        hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev);
@@ -219,7 +277,7 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                dapl_log(DAPL_DBG_TYPE_ERR,
                         " open_hca: dev open failed for %s\n",
                         ibv_get_device_name(hca_ptr->ib_trans.ib_dev));
-               goto err;
+               goto err2;
        }
        hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle;
        dapls_config_verbs(hca_ptr->ib_hca_handle);
@@ -232,11 +290,11 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                         ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
                         strerror(errno));
                dat_status = DAT_INVALID_ADDRESS;
-               goto bail;
+               goto err2;
        } else {
                if (port_attr.state != IBV_PORT_ACTIVE) {
                        dat_status = DAT_INVALID_ADDRESS;
-                       goto bail;
+                       goto err2;
                }
                hca_ptr->ib_trans.addr.lid = htons(port_attr.lid);
                hca_ptr->ib_trans.lid = htons(port_attr.lid);
@@ -251,58 +309,20 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                         ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
                         strerror(errno));
                dat_status = DAT_INVALID_ADDRESS;
-               goto bail;
+               goto err2;
        }
 
-       /* set RC tunables via enviroment or default */
+       /* max inline value when running on MIC is returned from host */
        if (dapl_ib_inline_data(hca_ptr->ib_hca_handle)) {
                hca_ptr->ib_trans.ib_cm.max_inline =
                        dapl_os_get_env_val("DAPL_MAX_INLINE",
                                            INLINE_SEND_IB_DEFAULT);
        }
-       hca_ptr->ib_trans.ib_cm.ack_retry =
-           dapl_os_get_env_val("DAPL_ACK_RETRY", DCM_ACK_RETRY);
-       hca_ptr->ib_trans.ib_cm.ack_timer =
-           dapl_os_get_env_val("DAPL_ACK_TIMER", DCM_ACK_TIMER);
-       hca_ptr->ib_trans.ib_cm.rnr_retry =
-           dapl_os_get_env_val("DAPL_RNR_RETRY", DCM_RNR_RETRY);
-       hca_ptr->ib_trans.ib_cm.rnr_timer =
-           dapl_os_get_env_val("DAPL_RNR_TIMER", DCM_RNR_TIMER);
-       hca_ptr->ib_trans.ib_cm.global =
-           dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", DCM_GLOBAL);
-       hca_ptr->ib_trans.ib_cm.hop_limit =
-           dapl_os_get_env_val("DAPL_HOP_LIMIT", DCM_HOP_LIMIT);
-       hca_ptr->ib_trans.ib_cm.tclass =
-           dapl_os_get_env_val("DAPL_TCLASS", DCM_TCLASS);
-       hca_ptr->ib_trans.ib_cm.mtu =
-           dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", DCM_IB_MTU));
-
-       if (dapli_mix_open(&hca_ptr->ib_trans, hca_name,
-                          hca_ptr->port_num, flags & DAPL_OPEN_QUERY)) {
-               dapl_log(DAPL_DBG_TYPE_ERR,
-                        " open_hca: SCIF init ERR for %s\n",
-                        ibv_get_device_name(hca_ptr->ib_trans.ib_dev));
-               goto bail;
-       }
+       else
+               hca_ptr->ib_trans.ib_cm.max_inline = 0;
 
-       if (flags & DAPL_OPEN_QUERY)
-               goto done;
-
-       /* initialize CM list, LISTEN, SND queue, PSP array, locks */
-       if ((dapl_os_lock_init(&hca_ptr->ib_trans.lock)) != DAT_SUCCESS)
-               goto bail;
-       
-       if ((dapl_os_lock_init(&hca_ptr->ib_trans.llock)) != DAT_SUCCESS)
-               goto bail;
-       
-       if ((dapl_os_lock_init(&hca_ptr->ib_trans.slock)) != DAT_SUCCESS)
-               goto bail;
-
-       if ((dapl_os_lock_init(&hca_ptr->ib_trans.plock)) != DAT_SUCCESS)
-               goto bail;
-
-       if ((dapl_os_lock_init(&hca_ptr->ib_trans.cqlock)) != DAT_SUCCESS)
-               goto bail;
+       dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: max inline data set to %d\n",
+               hca_ptr->ib_trans.ib_cm.max_inline);
 
        /* EVD events without direct CQ channels, CNO support */
        hca_ptr->ib_trans.ib_cq =
@@ -311,7 +331,7 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                dapl_log(DAPL_DBG_TYPE_ERR,
                         " open_hca: ibv_create_comp_channel ERR %s\n",
                         strerror(errno));
-               goto bail;
+               goto err2;
        }
        dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq);
 
@@ -321,23 +341,29 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                dapl_log(DAPL_DBG_TYPE_ERR,
                         " open_hca: ERR: create_empty_cq = %s\n",
                         strerror(errno));
-               goto bail;
+               goto err2;
        }
 
-       /* initialize CM and listen lists on this HCA uCM QP */
-       dapl_llist_init_head(&hca_ptr->ib_trans.list);
-       dapl_llist_init_head(&hca_ptr->ib_trans.llist);
-       dapl_llist_init_head(&hca_ptr->ib_trans.cqlist);
+       if (dapli_mix_open(&hca_ptr->ib_trans, hca_name,
+                          hca_ptr->port_num, flags & DAPL_OPEN_QUERY)) {
+               dapl_log(DAPL_DBG_TYPE_ERR,
+                        " open_hca: SCIF init ERR for %s\n", hca_name);
+               goto err2;
+       }
+
+cm_init:
+       if (flags & DAPL_OPEN_QUERY)
+               goto done;
 
-       /* create uCM qp services */
+       /* create MCM qp services */
        if (mcm_service_create(hca_ptr))
-               goto bail;
+               goto err2;
 
        if (create_os_signal(hca_ptr)) {
                dapl_log(DAPL_DBG_TYPE_ERR,
                         " open_hca: failed to init cr pipe - %s\n",
                         strerror(errno));
-               goto bail;
+               goto err2;
        }
 
        /* create thread to process inbound connect request */
@@ -348,13 +374,12 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
        if (dat_status != DAT_SUCCESS) {
                dapl_log(DAPL_DBG_TYPE_ERR,
                         " open_hca: failed to create thread\n");
-               goto bail;
+               goto err2;
        }
 
        dapl_log(DAPL_DBG_TYPE_UTIL,
-                    " open_hca: MCM devname %s port %d, dev_IP %s ep_map %s\n",
-                    ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
-                    hca_ptr->port_num, 
+                    " open_hca: devname %s port %d, dev_IP %s ep_map %s\n",
+                    hca_name, hca_ptr->port_num,
                     inet_ntoa(((struct sockaddr_in *)
                               &hca_ptr->hca_address)->sin_addr),
                     mcm_map_str(hca_ptr->ib_trans.addr.ep_map));
@@ -364,13 +389,16 @@ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name,
                dapl_os_sleep_usec(1000);
 
 done:
+       if (dev_list)
+               ibv_free_device_list(dev_list);
+
        /* save LID, GID, QPN, PORT address information, for ia_queries */
        /* Set AF_INET6 to insure callee address storage of 28 bytes */
        hca_ptr->ib_trans.hca = hca_ptr;
        hca_ptr->ib_trans.addr.family = AF_INET6;
        hca_ptr->ib_trans.addr.qp_type = IBV_QPT_UD;
-       memcpy(&hca_ptr->hca_address, 
-              &hca_ptr->ib_trans.addr, 
+       memcpy(&hca_ptr->hca_address,
+              &hca_ptr->ib_trans.addr,
               sizeof(struct dat_mcm_addr));
 
        dapl_log(DAPL_DBG_TYPE_UTIL,
@@ -380,17 +408,20 @@ done:
                 ntohs(mcm_ia->lid), ntohl(mcm_ia->qpn),
                 mcm_ia->sl, mcm_map_str(mcm_ia->ep_map));
 
-       ibv_free_device_list(dev_list);
        return DAT_SUCCESS;
-bail:
+
+err2:
        mcm_service_destroy(hca_ptr);
-       ibv_close_device(hca_ptr->ib_hca_handle);
+       if (dev_list) {
+               if (hca_ptr->ib_hca_handle)
+                       ibv_close_device(hca_ptr->ib_hca_handle);
+               ibv_free_device_list(dev_list);
+       }
+err:
        hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
        hca_ptr->ib_trans.ib_ctx = NULL;
        hca_ptr->ib_trans.ib_dev = NULL;
-
-err:
-       ibv_free_device_list(dev_list);
+       hca_ptr->ib_trans.hca = NULL;
        return dat_status;
 }
 
@@ -447,8 +478,10 @@ done:
        }
 
        if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) {
-               if (ibv_close_device(hca_ptr->ib_hca_handle))
-                       return (dapl_convert_errno(errno, "ib_close_device"));
+               if (!MFO_EP(&hca_ptr->ib_trans.addr) || hca_ptr->ib_trans.self.node == 0) {
+                       if (ibv_close_device(hca_ptr->ib_hca_handle))
+                               return (dapl_convert_errno(errno, "ib_close_device"));
+               }
                hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
        }
 
@@ -506,10 +539,10 @@ static void mcm_service_destroy(IN DAPL_HCA *hca)
 
 static int mcm_service_create(IN DAPL_HCA *hca)
 {
-        struct ibv_qp_init_attr qp_create;
+       struct ibv_qp_init_attr qp_create;
        ib_hca_transport_t *tp = &hca->ib_trans;
        struct ibv_recv_wr recv_wr, *recv_err;
-        struct ibv_sge sge;
+       struct ibv_sge sge;
        int i, mlen = sizeof(dat_mcm_msg_t);
        int hlen = sizeof(struct ibv_grh); /* hdr included with UD recv */
        char *rbuf;
@@ -530,12 +563,12 @@ static int mcm_service_create(IN DAPL_HCA *hca)
                return 0;
 
        tp->pd = ibv_alloc_pd(hca->ib_hca_handle);
-        if (!tp->pd) 
-                goto bail;
-        
-        dapl_log(DAPL_DBG_TYPE_UTIL,
-                 " create_service: pd %p ctx %p handle 0x%x\n",
-                  tp->pd, tp->pd->context, tp->pd->handle);
+       if (!tp->pd) 
+               goto bail;
+       
+       dapl_log(DAPL_DBG_TYPE_UTIL,
+                " create_service: pd %p ctx %p handle 0x%x\n",
+                 tp->pd, tp->pd->context, tp->pd->handle);
 
        tp->rch = ibv_create_comp_channel(hca->ib_hca_handle);
        if (!tp->rch) 
@@ -546,7 +579,7 @@ static int mcm_service_create(IN DAPL_HCA *hca)
        tp->scq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, NULL, 0);
        if (!tp->scq) 
                goto bail;
-        
+       
        tp->rcq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, tp->rch, 0);
        if (!tp->rcq) 
                goto bail;
@@ -565,7 +598,7 @@ static int mcm_service_create(IN DAPL_HCA *hca)
 
        tp->qp = ibv_create_qp(tp->pd, &qp_create);
        if (!tp->qp) 
-                goto bail;
+               goto bail;
 
        tp->ah = (ib_ah_handle_t*) dapl_os_alloc(sizeof(ib_ah_handle_t) * 0xffff);
        tp->sid = (uint8_t*) dapl_os_alloc(sizeof(uint8_t) * 0xffff);
@@ -616,7 +649,7 @@ static int mcm_service_create(IN DAPL_HCA *hca)
 
        /* save qp_num as part of ia_address, network order */
        tp->addr.qpn = htonl(tp->qp->qp_num);
-        return 0;
+       return 0;
 bail:
        dapl_log(DAPL_DBG_TYPE_ERR,
                 " ucm_create_services: ERR %s\n", strerror(errno));
index 334c6c6cb5245381cb0032ed348c82b66b0edcd7..cf27cf3fe14e743f4a41f1e1a81d16fe82ebd0d1 100644 (file)
 #include "dapl_osd.h"
 
 /*
- * CM proxy services, MCM on MIC to MPXYD via SCIF
- *
+ * MCM Provider Proxy services, MIC to MPXYD via SCIF or HST with SCIF
+ */
+
+/*
+ * MIX_IA_MODE
+ */
+
+int dapli_mix_mode(ib_hca_transport_t *tp, char *name)
+{
+       int ret, mfo_dev, mfo_mode;
+
+       mfo_mode = dapl_os_get_env_val("DAPL_MCM_MFO", 0); /* Force MIC Full Offload */
+
+       ret = scif_get_nodeIDs(NULL, 0, &tp->self.node);
+       if (ret < 0) {
+               dapl_log(1, " scif_get_nodeIDs() failed with error %s\n", strerror(errno));
+               return -1;
+       }
+       dapl_log(DAPL_DBG_TYPE_EXTENSION,
+                " SCIF node_id: %d client req_id 0x%x, %s\n",
+                (uint16_t)tp->self.node, dapl_os_getpid(), name);
+
+       if (tp->self.node == 0) {
+               tp->addr.ep_map = HOST_SOCK_DEV;  /* non-MIC mapping */
+               return 0;
+       }
+
+       /*  MIC node: "qib" device requires full offload */
+       mfo_dev = !dapl_os_pstrcmp("qib", name);
+       if (mfo_mode || mfo_dev) {
+               tp->addr.ep_map = MIC_FULL_DEV; /* MIC with full proxy offload, no direct verbs */
+       }
+       return 0;
+}
+
+/*
  * MIX_IA_OPEN
  */
 int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query_only)
@@ -52,24 +86,14 @@ int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query_only)
        always_proxy = dapl_os_get_env_val("DAPL_MCM_ALWAYS_PROXY", 0);
        scif_port_id = dapl_os_get_env_val("DAPL_MCM_PORT_ID", SCIF_OFED_PORT_8);
 
-       ret = scif_get_nodeIDs(NULL, 0, &tp->self.node);
-       if (ret < 0) {
-               dapl_log(1, " scif_get_nodeIDs() failed with error %s\n", strerror(errno));
-               return -1;
-       }
-       dapl_log(DAPL_DBG_TYPE_EXTENSION,
-                " SCIF node_id: %d client req_id 0x%x\n",
-                (uint16_t)tp->self.node, dapl_os_getpid());
-
-       if (tp->self.node == 0)
-               tp->addr.ep_map = HOST_SOCK_DEV;  /* non-MIC mapping */
-
-       if (query_only || (tp->self.node == 0 && !always_proxy)){
+       if (query_only || (tp->self.node == 0 && !always_proxy)) {
                dapl_log(DAPL_DBG_TYPE_EXTENSION," Not running on MIC, no MPXY connect required\n");
                tp->scif_ep = 0;
                return 0;
        }
-       dapl_log(DAPL_DBG_TYPE_EXTENSION," Running on MIC, MPXY connect required\n");
+       dapl_log(DAPL_DBG_TYPE_EXTENSION,
+                " Running on MIC at %s ep_map, MPXY connect required\n",
+                mcm_map_str(tp->addr.ep_map));
 
        /* Create an endpoint for MPXYD to connect back */
        listen_ep = scif_open();
@@ -159,6 +183,7 @@ int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query_only)
        msg.dev_attr.pkey_idx = tp->ib_cm.pkey_idx;
        msg.dev_attr.pkey = tp->ib_cm.pkey;
        msg.dev_attr.max_inline = tp->ib_cm.max_inline;
+       msg.dev_addr.ep_map = tp->addr.ep_map;
 
        memcpy(&msg.dev_addr, &tp->addr, sizeof(dat_mcm_addr_t));
 
@@ -201,19 +226,22 @@ int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query_only)
        tp->ib_cm.hop_limit = msg.dev_attr.hop_limit;
        tp->ib_cm.tclass = msg.dev_attr.tclass;
        tp->ib_cm.sl = msg.dev_attr.sl;
-       tp->ib_cm.mtu = msg.dev_attr.mtu;
        tp->ib_cm.rd_atom_in = msg.dev_attr.rd_atom_in;
        tp->ib_cm.rd_atom_out = msg.dev_attr.rd_atom_out;
        tp->ib_cm.pkey_idx = msg.dev_attr.pkey_idx;
        tp->ib_cm.pkey = msg.dev_attr.pkey;
        tp->ib_cm.max_inline = msg.dev_attr.max_inline;
-
        tp->dev_id = msg.hdr.req_id;
 
+       if (MFO_EP(&tp->addr))
+               /* We do not use this var in MFO, but use it as a flag to signal success */
+               tp->ib_ctx = (struct ibv_context *)0xdeadbeef;
+
        dapl_log(DAPL_DBG_TYPE_EXTENSION,
                 " mix_open reply (msg %p, ln %d) EPs %d %d %d - dev_id %d lid 0x%x\n",
                 &msg, len, tp->scif_ep, tp->scif_ev_ep,
                 tp->scif_tx_ep, tp->dev_id, ntohs(tp->addr.lid));
+
        return 0;
 }
 
@@ -238,6 +266,96 @@ void dapli_mix_close(ib_hca_transport_t *tp)
        }
 }
 
+/* MIX device ATTR */
+int dapli_mix_query_device(ib_hca_transport_t *tp, struct ibv_device_attr *dev_attr)
+{
+       dat_mix_device_attr_t msg;
+       scif_epd_t mix_ep = tp->scif_ep;
+       int ret, len;
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_QUERY_DEVICE_ATTR tp = %p\n", tp);
+
+       /* get attr request */
+       msg.hdr.ver = DAT_MIX_VER;
+       msg.hdr.op = MIX_QUERY_DEVICE;
+       msg.hdr.status = 0;
+       msg.hdr.flags = MIX_OP_REQ;
+
+       len = sizeof(dat_mix_hdr_t);
+       ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: %s msg %p send on %d, ret %d, exp %d, error %s\n",
+                        mix_op_str(msg.hdr.op), &msg, mix_ep, ret, len, strerror(errno));
+               return -1;
+       }
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP %d\n", mix_op_str(msg.hdr.op), mix_ep);
+
+       /* get device attr response */
+       len = sizeof(dat_mix_device_attr_t);
+       ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno));
+               return -1;
+       }
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," Recv'd %s reply on SCIF EP %d for dev_id %d\n",
+                mix_op_str(msg.hdr.op), mix_ep, msg.hdr.req_id);
+
+       if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_QUERY_DEVICE ||
+           msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) {
+               dapl_log(1, " ERR: MIX_QUERY_DEVICE ver %d, op %s, flgs %d, st %d dev_id %d\n",
+                            msg.hdr.ver, mix_op_str(msg.hdr.op),
+                            msg.hdr.flags, msg.hdr.status, msg.hdr.req_id);
+               if (msg.hdr.status != MIX_SUCCESS)
+                       return msg.hdr.status;
+               else
+                       return -1;
+       }
+
+       strncpy(dev_attr->fw_ver, msg.fw_ver, sizeof(dev_attr->fw_ver));
+       dev_attr->node_guid = msg.node_guid;
+       dev_attr->sys_image_guid = msg.sys_image_guid;
+       dev_attr->max_mr_size = msg.max_mr_size;
+       dev_attr->page_size_cap = msg.page_size_cap;
+       dev_attr->vendor_id = msg.vendor_id;
+       dev_attr->vendor_part_id = msg.vendor_part_id;
+       dev_attr->hw_ver = msg.hw_ver;
+       dev_attr->max_qp = msg.max_qp;
+       dev_attr->max_qp_wr = msg.max_qp_wr;
+       dev_attr->device_cap_flags = msg.device_cap_flags;
+       dev_attr->max_sge = msg.max_sge;
+       dev_attr->max_sge_rd = msg.max_sge_rd;
+       dev_attr->max_cq = msg.max_cq;
+       dev_attr->max_cqe = msg.max_cqe;
+       dev_attr->max_mr = msg.max_mr;
+       dev_attr->max_pd = msg.max_pd;
+       dev_attr->max_qp_rd_atom = msg.max_qp_rd_atom;
+       dev_attr->max_ee_rd_atom = msg.max_ee_rd_atom;
+       dev_attr->max_res_rd_atom = msg.max_ee_rd_atom;
+       dev_attr->max_qp_init_rd_atom = msg.max_qp_init_rd_atom;
+       dev_attr->max_ee_init_rd_atom = msg.max_ee_init_rd_atom;
+       dev_attr->atomic_cap = msg.atomic_cap;
+       dev_attr->max_ee = msg.max_ee;
+       dev_attr->max_rdd = msg.max_rdd;
+       dev_attr->max_mw = msg.max_mw;
+       dev_attr->max_raw_ipv6_qp = msg.max_raw_ipv6_qp;
+       dev_attr->max_raw_ethy_qp = msg.max_raw_ethy_qp;
+       dev_attr->max_mcast_grp = msg.max_mcast_grp;
+       dev_attr->max_mcast_qp_attach = msg.max_mcast_qp_attach;
+       dev_attr->max_total_mcast_qp_attach = msg.max_total_mcast_qp_attach;
+       dev_attr->max_ah = msg.max_ah;
+       dev_attr->max_fmr = msg.max_fmr;
+       dev_attr->max_map_per_fmr = msg.max_map_per_fmr;
+       dev_attr->max_srq = msg.max_srq;
+       dev_attr->max_srq_wr = msg.max_srq_wr;
+       dev_attr->max_srq_sge = msg.max_srq_sge;
+       dev_attr->max_pkeys = msg.max_pkeys;
+       dev_attr->local_ca_ack_delay = msg.local_ca_ack_delay;
+       dev_attr->phys_port_cnt = msg.phys_port_cnt;
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," MIX_QUERY_DEVICE successful on SCIF EP %d\n", mix_ep);
+       return 0;
+}
+
 /* MIX_PROV_ATTR */
 int dapli_mix_get_attr(ib_hca_transport_t *tp, dat_mix_prov_attr_t *pr_attr)
 {
@@ -285,6 +403,12 @@ int dapli_mix_get_attr(ib_hca_transport_t *tp, dat_mix_prov_attr_t *pr_attr)
 
        memcpy(pr_attr, &msg.attr, sizeof(dat_mix_prov_attr_t));
 
+       /* update local TP CM attributes */
+       tp->retries = pr_attr->cm_retry;
+       tp->rep_time = pr_attr->cm_rep_time_ms;
+       tp->rtu_time = pr_attr->cm_rtu_time_ms;
+       tp->cm_timer = DAPL_MIN(tp->rep_time, tp->rtu_time);
+
        dapl_log(DAPL_DBG_TYPE_EXTENSION," MIX_PROV_ATTR successful on SCIF EP %d\n", mix_ep);
        return 0;
 }
@@ -392,9 +516,16 @@ int dapli_mix_mr_create(ib_hca_transport_t *tp, DAPL_LMR * lmr)
        scif_epd_t mix_ep = tp->scif_ep;
        int ret, len;
 
-       dapl_log(DAPL_DBG_TYPE_EXTENSION," lmr create %p, addr %p %p rmr_context %x mr->rkey %x\n",
-                lmr, lmr->mr_handle->addr, lmr->param.registered_address,
-                lmr->param.rmr_context, lmr->mr_handle->rkey );
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," lmr create %p, addr %p rmr_context %x\n",
+                lmr, lmr->param.registered_address, lmr->param.rmr_context);
+
+       if (MFO_EP(&tp->addr)) {
+               lmr->mr_handle = (ib_mr_handle_t) dapl_os_alloc (sizeof(struct ibv_mr));
+               if (NULL == lmr->mr_handle) {
+                       dapl_log(1, " ERR: Could not allocat mr_hadle\n");
+                       return -1;
+               }
+       }
 
        /* request: */
        msg.hdr.ver = DAT_MIX_VER;
@@ -406,7 +537,10 @@ int dapli_mix_mr_create(ib_hca_transport_t *tp, DAPL_LMR * lmr)
        msg.mr_len = lmr->param.registered_size;
        msg.sci_addr = lmr->sci_addr;
        msg.sci_off = lmr->sci_off;
-       msg.ib_addr = (uint64_t) lmr->mr_handle->addr;
+       if (MFO_EP(&tp->addr))
+               msg.ib_addr = (uint64_t) lmr->param.registered_address;
+       else
+               msg.ib_addr = (uint64_t) lmr->mr_handle->addr;
        msg.ib_rkey = lmr->param.rmr_context;
        msg.ctx = (uint64_t)lmr;
 
@@ -478,6 +612,10 @@ int dapli_mix_mr_free(ib_hca_transport_t *tp, DAPL_LMR * lmr)
                         msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status);
                return -1;
        }
+       if (MFO_EP(&tp->addr) && lmr->mr_handle) {
+               dapl_os_free(lmr->mr_handle, sizeof(struct ibv_mr));
+               lmr->mr_handle = IB_INVALID_HANDLE;
+       }
        dapl_log(DAPL_DBG_TYPE_EXTENSION," removed lmr %p, id %d\n", lmr, lmr->mr_id);
        return 0;
 }
@@ -707,6 +845,118 @@ int dapli_mix_cq_poll(ib_cq_handle_t m_cq, struct ibv_wc *wc)
        return 0;
 }
 
+/*  MIX_PZ_CREATE */
+int dapli_mix_pz_create(DAPL_IA * ia_ptr, DAPL_PZ *m_pz)
+{
+       dat_mix_pz_t msg;
+       scif_epd_t mix_ep = ia_ptr->hca_ptr->ib_trans.scif_ep;
+       int ret, len;
+
+       m_pz->pd_handle = IB_INVALID_HANDLE;
+
+       /* request: QP_r local, QP_t shadowed */
+       msg.hdr.ver = DAT_MIX_VER;
+       msg.hdr.op = MIX_PZ_CREATE;
+       msg.hdr.status = 0;
+       msg.hdr.flags = MIX_OP_REQ;
+       msg.ctx = (uint64_t)m_pz;
+       msg.ib_pd = 0;
+
+       len = sizeof(dat_mix_pz_t);
+       ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: %s snd on %d, ret %d, exp %d, err %s\n",
+                        mix_op_str(msg.hdr.op), mix_ep, ret, len,
+                        strerror(errno));
+               return -1;
+       }
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n",
+                mix_op_str(msg.hdr.op));
+
+       /* wait for response */
+       msg.ctx = 0;
+       ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: rcv on ep %d, ret %d, exp %d, err %s\n",
+                           mix_ep, ret, len, strerror(errno));
+               return -1;
+       }
+       if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_PZ_CREATE ||
+           msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) {
+               dapl_log(1, " ERR: %s %p ver %d, op %d, flags %d, stat %d\n",
+                           mix_op_str(msg.hdr.op), m_pz, msg.hdr.ver,
+                           msg.hdr.op, msg.hdr.flags, msg.hdr.status);
+               return -1;
+       }
+
+       if (msg.ctx != (uint64_t)m_pz) {
+               dapl_log(1, " ERR: response ctx (0x%x) != sent one (0x%x)\n",
+                               msg.ctx, (uint64_t)m_pz);
+               return -1;
+       }
+
+       /* save id from proxy PZ create */
+       m_pz->pd_handle = (ib_pd_handle_t)msg.ib_pd;
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION,
+                " MIX_PZ_CREATE: pz %p, reply, proxy IB_PD %p\n",
+                m_pz, m_pz->pd_handle);
+       return 0;
+}
+
+/* MIX_CQ_FREE, fits in header */
+int dapli_mix_pz_free(DAPL_PZ *m_pz)
+{
+       dat_mix_pz_t msg;
+       DAPL_IA * ia_ptr = m_pz->header.owner_ia;
+       scif_epd_t mix_ep = ia_ptr->hca_ptr->ib_trans.scif_ep;
+       int ret, len;
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION,
+                " MIX_PZ_FREE: pz %p, send, proxy IB_PD %p\n",
+                m_pz, m_pz->pd_handle);
+
+       /* request */
+       msg.hdr.ver = DAT_MIX_VER;
+       msg.hdr.op = MIX_PZ_FREE;
+       msg.hdr.status = 0;
+       msg.hdr.flags = MIX_OP_REQ;
+       msg.ctx = (uint64_t)m_pz;
+       msg.ib_pd = (uint64_t)m_pz->pd_handle;
+
+       len = sizeof(dat_mix_pz_t);
+       ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n",
+                        mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno));
+       }
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n",
+                mix_op_str(msg.hdr.op));
+
+       /* response */
+       ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n",
+                           mix_ep, ret, len, strerror(errno));
+               return -1;
+       }
+       if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_PZ_FREE ||
+           msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) {
+               dapl_log(1, " MIX_CQ_FREE ERR: ver %d, op %d, flags %d, or stat %d ln %d\n",
+                        msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status, ret);
+               return -1;
+       }
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION,
+                " MIX_PZ_FREE: reply, proxy IB_PD 0x%x\n", msg.ib_pd);
+
+       m_pz->pd_handle = 0;
+
+       return 0;
+}
+
+
 /* SCIF DMA outbound writes and inbound msg receives; translate to scif_off via LMR */
 /* TODO: faster translation for post_send? */
 static inline int mix_proxy_data(ib_qp_handle_t m_qp, dat_mix_sr_t *msg, struct ibv_sge *sglist, int txlen, int mix_ep)
@@ -1367,14 +1617,73 @@ int dapli_mix_recv(DAPL_HCA *hca, int scif_ep)
        return ret;
 }
 
+int dapli_mix_query_port(ib_hca_transport_t *tp, unsigned long port_num, struct ibv_port_attr *port_attr)
+{
+       dat_mix_port_attr_t msg;
+       scif_epd_t mix_ep = tp->scif_ep;
+       int ret, len;
 
+       ret = scif_get_nodeIDs(NULL, 0, &tp->self.node);
+       if (ret < 0) {
+               dapl_log(1, " scif_get_nodeIDs() failed with error %s\n", strerror(errno));
+               return -1;
+       }
 
+       /* request: QP_r local, QP_t shadowed */
+       msg.hdr.ver = DAT_MIX_VER;
+       msg.hdr.op = MIX_QUERY_PORT;
+       msg.hdr.status = 0;
+       msg.hdr.flags = MIX_OP_REQ;
+       msg.hdr.req_id = port_num;
 
+       len = sizeof(dat_mix_hdr_t);
+       ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: %s snd on %d, ret %d, exp %d, err %s\n",
+                        mix_op_str(msg.hdr.op), mix_ep, ret, len,
+                        strerror(errno));
+               return -1;
+       }
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n",
+                mix_op_str(msg.hdr.op));
 
+       /* wait for response */
+       len = sizeof(dat_mix_port_attr_t);
+       ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK);
+       if (ret != len) {
+               dapl_log(1, " ERR: rcv on ep %d, ret %d, exp %d, err %s\n",
+                           mix_ep, ret, len, strerror(errno));
+               return -1;
+       }
+       if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_QUERY_PORT ||
+           msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) {
+               dapl_log(1, " ERR: %s ver %d, op %d, flags %d, stat %d\n",
+                           mix_op_str(msg.hdr.op), msg.hdr.ver,
+                           msg.hdr.op, msg.hdr.flags, msg.hdr.status);
+               return -1;
+       }
 
-
-
-
-
-
-
+       port_attr->gid_tbl_len = msg.gid_tbl_len;
+       port_attr->port_cap_flags = msg.port_cap_flags;
+       port_attr->max_msg_sz = msg.max_msg_sz;
+       port_attr->bad_pkey_cntr = msg.bad_pkey_cntr;
+       port_attr->qkey_viol_cntr = msg.qkey_viol_cntr;
+       port_attr->pkey_tbl_len = msg.pkey_tbl_len;
+       port_attr->lid = msg.lid;
+       port_attr->sm_lid = msg.sm_lid;
+       port_attr->lmc = msg.lmc;
+       port_attr->max_vl_num = msg.max_vl_num;
+       port_attr->sm_sl = msg.sm_sl;
+       port_attr->subnet_timeout = msg.subnet_timeout;
+       port_attr->init_type_reply = msg.init_type_reply;
+       port_attr->active_width = msg.active_width;
+       port_attr->active_speed = msg.active_speed;
+       port_attr->phys_state = msg.phys_state;
+       port_attr->link_layer = msg.link_layer;
+       port_attr->state = msg.state;
+       port_attr->max_mtu = msg.max_mtu;
+       port_attr->active_mtu = msg.active_mtu;
+
+       dapl_log(DAPL_DBG_TYPE_EXTENSION," MIX_QUERY_PORT successful on SCIF EP %d\n", mix_ep);
+       return 0;
+}
index 3c79cadd4c3902d6536e9a968e00e7a52c8b16e3..824f5755dab20c48a613c390599a5e645d13b482 100644 (file)
@@ -214,7 +214,7 @@ static inline void mcm_dto_req(struct dcm_ib_cq *m_cq, struct ibv_wc *wc)
        cookie = (DAPL_COOKIE *)(uintptr_t)wc->wr_id;
        m_qp = cookie->ep->qp_handle;
 
-       if (!m_qp->tp->scif_ep && MXS_EP(m_qp) &&
+       if (!m_qp->tp->scif_ep && MXF_EP(m_qp) &&
            (wc->opcode == (uint32_t)IBV_WR_RDMA_WRITE_WITH_IMM)) {
                dapl_log(DAPL_DBG_TYPE_EP,
                         " mcm_dto_req: RW_imm -> WR, wr_id %Lx\n", wc->wr_id);