[ofa-general] [PATCH 1/1] uDAPL: scm provider, remove query gid/lid from connection setup phase to the open

Arlin Davis arlin.r.davis at intel.com
Fri Mar 13 15:30:11 PDT 2009


move lid/gid queries from the connection setup phase
and put them in the open call to avoid overhead
of more fd's during connections. No need
to query during connection setup since uDAPL
binds to specific hca/ports via dat_ia_open.

Signed-off-by: Arlin Davis <ardavis at ichips.intel.com>
---
 dapl/openib_scm/dapl_ib_cm.c   |   60 +++------------------------------------
 dapl/openib_scm/dapl_ib_util.c |   32 +++++++++++++++++++++
 dapl/openib_scm/dapl_ib_util.h |    4 ++-
 3 files changed, 40 insertions(+), 56 deletions(-)

diff --git a/dapl/openib_scm/dapl_ib_cm.c b/dapl/openib_scm/dapl_ib_cm.c
index 9a15e42..9defc42 100644
--- a/dapl/openib_scm/dapl_ib_cm.c
+++ b/dapl/openib_scm/dapl_ib_cm.c
@@ -285,16 +285,6 @@ static void dapli_cm_queue(struct ib_cm_handle *cm_ptr)
 			 strerror(errno));
 }
 
-static uint16_t dapli_get_lid(IN struct ibv_context *ctx, IN uint8_t port)
-{
-	struct ibv_port_attr port_attr;
-
-	if(ibv_query_port(ctx, port,&port_attr))
-		return(0xffff);
-	else
-		return(port_attr.lid);
-}
-
 /*
  * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect
  */
@@ -468,28 +458,9 @@ dapli_socket_connect(DAPL_EP		*ep_ptr,
 	cm_ptr->dst.qp_type = htons(ep_ptr->qp_handle->qp_type);
 #endif
 	cm_ptr->dst.port = htons(ia_ptr->hca_ptr->port_num);
-	cm_ptr->dst.lid = 
-		htons(dapli_get_lid(ia_ptr->hca_ptr->ib_hca_handle, 
-				    (uint8_t)ia_ptr->hca_ptr->port_num));
-	if (cm_ptr->dst.lid == 0xffff) {
-		dapl_log(DAPL_DBG_TYPE_ERR, 
-			 " CONNECT: query LID ERR %s -> %s\n",
-			 strerror(errno), 
-			 inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr));
-		goto bail;
-	}
-
-        /* in network order */
-        if (ibv_query_gid(ia_ptr->hca_ptr->ib_hca_handle,
-				    (uint8_t)ia_ptr->hca_ptr->port_num,
-				    0, &cm_ptr->dst.gid)) {
-		dapl_log(DAPL_DBG_TYPE_ERR, 
-			 " CONNECT: query GID ERR %s -> %s\n",
-			 strerror(errno), 
-			 inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr));
-		goto bail;
-	}
-
+	cm_ptr->dst.lid = ia_ptr->hca_ptr->ib_trans.lid;
+	cm_ptr->dst.gid = ia_ptr->hca_ptr->ib_trans.gid;
+        
 	/* save references */
 	cm_ptr->hca = ia_ptr->hca_ptr;
 	cm_ptr->ep = ep_ptr;
@@ -958,29 +929,8 @@ dapli_socket_accept_usr(DAPL_EP		*ep_ptr,
 	local.qpn = htonl(ep_ptr->qp_handle->qp_num);
 	local.qp_type = htons(ep_ptr->qp_handle->qp_type);
 	local.port = htons(ia_ptr->hca_ptr->port_num);
-	local.lid = htons(dapli_get_lid(ia_ptr->hca_ptr->ib_hca_handle, 
-				        (uint8_t)ia_ptr->hca_ptr->port_num));
-	if (local.lid == 0xffff) {
-		dapl_log(DAPL_DBG_TYPE_ERR, 
-			 " ACCEPT_USR: query LID ERR %s -> %s\n",
-			 strerror(errno), 
-			 inet_ntoa(((struct sockaddr_in *)
-				&cm_ptr->dst.ia_address)->sin_addr)); 
-		goto bail;
-	}
-
-        /* in network order */
-	if (ibv_query_gid(ia_ptr->hca_ptr->ib_hca_handle,
-			  (uint8_t)ia_ptr->hca_ptr->port_num,
-			  0, &local.gid)) {
-		dapl_log(DAPL_DBG_TYPE_ERR, 
-			 " ACCEPT_USR: query GID ERR %s -> %s\n",
-			 strerror(errno), 
-			 inet_ntoa(((struct sockaddr_in *)
-				&cm_ptr->dst.ia_address)->sin_addr)); 
-		goto bail;
-	}
-
+	local.lid = ia_ptr->hca_ptr->ib_trans.lid; 
+	local.gid = ia_ptr->hca_ptr->ib_trans.gid; 
 	local.ia_address = ia_ptr->hca_ptr->hca_address;
 	local.p_size = htonl(p_size);
 	iov[0].iov_base = (void *) &local;
diff --git a/dapl/openib_scm/dapl_ib_util.c b/dapl/openib_scm/dapl_ib_util.c
index fdbae3c..391a0e5 100644
--- a/dapl/openib_scm/dapl_ib_util.c
+++ b/dapl/openib_scm/dapl_ib_util.c
@@ -196,6 +196,7 @@ DAT_RETURN dapls_ib_open_hca (
         IN   DAPL_HCA		*hca_ptr)
 {
 	struct ibv_device **dev_list;
+	struct ibv_port_attr port_attr;
 	int		i;
 	DAT_RETURN	dat_status = DAT_SUCCESS;
 
@@ -238,6 +239,30 @@ found:
 		 goto err;
 	}
 
+	/* get lid for this hca-port, network order */
+	if(ibv_query_port(hca_ptr->ib_hca_handle, 
+			  (uint8_t)hca_ptr->port_num, 
+			  &port_attr)) {
+		dapl_log(DAPL_DBG_TYPE_ERR, 
+			  " open_hca: get lid ERR for %s, err=%s\n", 
+			  ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
+			  strerror(errno));
+		 goto err;
+	} else {
+		hca_ptr->ib_trans.lid = htons(port_attr.lid);
+	}
+
+	/* get gid for this hca-port, network order */
+        if (ibv_query_gid(hca_ptr->ib_hca_handle,
+			  (uint8_t)hca_ptr->port_num,
+			   0, &hca_ptr->ib_trans.gid)) {
+		dapl_log(DAPL_DBG_TYPE_ERR, 
+			 " open_hca: query GID ERR for %s, err=%s\n",
+			 ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
+			 strerror(errno));
+		goto err;
+	}
+
 	/* set RC tunables via enviroment or default */
 	hca_ptr->ib_trans.max_inline_send = 
 		dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT);
@@ -325,6 +350,13 @@ found:
 		     hca_ptr->port_num,
 		     inet_ntoa(((struct sockaddr_in *)
 				&hca_ptr->hca_address)->sin_addr));
+	dapl_dbg_log(DAPL_DBG_TYPE_UTIL, 
+		     " open_hca: LID 0x%x GID Subnet 0x"F64x" ID 0x"F64x"\n",  
+		     ntohs(hca_ptr->ib_trans.lid), 
+		     (unsigned long long) 
+			htonll(hca_ptr->ib_trans.gid.global.subnet_prefix),
+                     (unsigned long long) 
+			htonll(hca_ptr->ib_trans.gid.global.interface_id));
 		
 	ibv_free_device_list(dev_list);
 	return dat_status;
diff --git a/dapl/openib_scm/dapl_ib_util.h b/dapl/openib_scm/dapl_ib_util.h
index fd1c24e..7c3251a 100644
--- a/dapl/openib_scm/dapl_ib_util.h
+++ b/dapl/openib_scm/dapl_ib_util.h
@@ -277,12 +277,13 @@ typedef enum
 /* ib_hca_transport_t, specific to this implementation */
 typedef struct _ib_hca_transport
 { 
+	union ibv_gid		gid;
 	struct	ibv_device	*ib_dev;
 	ib_cq_handle_t		ib_cq_empty;
 	DAPL_OS_LOCK		cq_lock;	
 	int			max_inline_send;
 	ib_thread_state_t       cq_state;
-	DAPL_OS_THREAD			cq_thread;
+	DAPL_OS_THREAD		cq_thread;
 	struct ibv_comp_channel *ib_cq;
 	int			cr_state;
 	DAPL_OS_THREAD		thread;
@@ -293,6 +294,7 @@ typedef struct _ib_hca_transport
 	ib_async_cq_handler_t	async_cq_error;
 	ib_async_dto_handler_t	async_cq;
 	ib_async_qp_handler_t	async_qp_error;
+	uint16_t		lid;
 	uint8_t			ack_timer;
 	uint8_t			ack_retry;
 	uint8_t			rnr_timer;
-- 
1.5.2.5





More information about the general mailing list