[ofw] RE: patch: [WSD] Add basic support for APM to WSD.
Tzachi Dar
tzachid at mellanox.co.il
Thu Sep 24 02:12:42 PDT 2009
Applied on 2465.
Thanks
Tzachi
________________________________
From: Tzachi Dar
Sent: Wednesday, September 16, 2009 7:06 PM
To: ofw at lists.openfabrics.org
Cc: Windows Design
Subject: patch: [WSD] Add basic support for APM to WSD.
This patch allows WSD to use basic support for APM. (no fail
back support)
The patch assumes that the two machines that are talking can
reach other on both ports.
In order to activate APM one has to set the following
environment variable on both sides:
set IBWSD_USE_APM=1
Thanks
Tzachi
Index:
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.h
===================================================================
--- Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.h
(revision 4824)
+++ Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.h
(revision 4825)
@@ -66,7 +66,9 @@
/* Allow users to control SA timeouts behavior - fall back on
IPoIB or fail. */
extern int g_connect_err;
extern uint8_t g_max_cm_retries;
-extern uint8_t g_pkt_life_modifier;
+extern int8_t g_pkt_life_modifier;
extern uint8_t g_qp_retries;
+extern uint8_t g_use_APM;
+
#endif /* IBSPDLL_H */
Index: Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ib_cm.c
===================================================================
--- Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ib_cm.c
(revision 4824)
+++ Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ib_cm.c
(revision 4825)
@@ -745,7 +745,9 @@
int
ib_connect(
IN struct ibsp_socket_info *socket_info,
- IN ib_path_rec_t *path_rec )
+ IN ib_path_rec_t *path_rec,
+ IN ib_path_rec_t *alt_path_rec )
+
{
ib_cm_req_t cm_req;
ib_api_status_t status;
@@ -773,6 +775,7 @@
cm_req.svc_id = get_service_id_for_port(
socket_info->peer_addr.sin_port );
cm_req.max_cm_retries = g_max_cm_retries;
cm_req.p_primary_path = path_rec;
+ cm_req.p_alt_path = alt_path_rec;
cm_req.pfn_cm_rep_cb = cm_rep_callback;
cm_req.p_req_pdata = (uint8_t *) & params;
@@ -814,7 +817,6 @@
cm_req.rnr_nak_timeout = QP_ATTRIB_RNR_NAK_TIMEOUT;
cm_req.rnr_retry_cnt = QP_ATTRIB_RNR_RETRY;
cm_req.retry_cnt = g_qp_retries;
- cm_req.p_alt_path = NULL;
cm_req.pfn_cm_mra_cb = cm_mra_callback;
cm_req.pfn_cm_rej_cb = cm_rej_callback;
@@ -884,7 +886,7 @@
#endif
cm_rep.init_depth = QP_ATTRIB_INITIATOR_DEPTH;
cm_rep.target_ack_delay = 10;
- cm_rep.failover_accepted = IB_FAILOVER_ACCEPT_UNSUPPORTED;
+ cm_rep.failover_accepted = g_use_APM ?
IB_FAILOVER_ACCEPT_SUCCESS : IB_FAILOVER_ACCEPT_UNSUPPORTED;
cm_rep.flow_ctrl = cm_req_received->flow_ctrl;
cm_rep.rnr_nak_timeout = QP_ATTRIB_RNR_NAK_TIMEOUT;
cm_rep.rnr_retry_cnt = cm_req_received->rnr_retry_cnt;
Index:
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_ip.c
===================================================================
--- Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_ip.c
(revision 4824)
+++ Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_ip.c
(revision 4825)
@@ -347,8 +347,9 @@
/* Synchronously query the SA for a GUID. Return 0 on success.
*/
int
query_pr(
- IN struct ibsp_port *port,
+ IN ib_net64_t guid,
IN ib_net64_t dest_port_guid,
+ IN uint16_t dev_id,
OUT ib_path_rec_t *path_rec )
{
ib_gid_pair_t user_query;
@@ -362,14 +363,14 @@
query_req.query_type = IB_QUERY_PATH_REC_BY_GIDS;
query_req.p_query_input = &user_query;
- query_req.port_guid = port->guid;
+ query_req.port_guid = guid;
query_req.timeout_ms = g_sa_timeout;
query_req.retry_cnt = g_sa_retries;
query_req.flags = IB_FLAGS_SYNC;
query_req.query_context = &query_context;
query_req.pfn_query_cb = query_pr_callback;
- ib_gid_set_default( &user_query.src_gid, port->guid );
+ ib_gid_set_default( &user_query.src_gid, guid );
ib_gid_set_default( &user_query.dest_gid, dest_port_guid );
query_context.path_rec = path_rec;
@@ -379,7 +380,7 @@
IBSP_PRINT(TRACE_LEVEL_INFORMATION, IBSP_DBG_HW,
("Query for path from %I64x to %I64x\n",
- port->guid, dest_port_guid) );
+ guid , dest_port_guid) );
status = ib_query( g_ibsp.al_handle, &query_req, &query_handle
);
@@ -398,7 +399,7 @@
goto error;
}
- if( (port->hca->dev_id == 0x5A44) &&
+ if( (dev_id == 0x5A44) &&
(ib_path_rec_mtu( path_rec ) > IB_MTU_LEN_1024) )
{
/* Local endpoint is Tavor - cap MTU to 1K for extra
bandwidth. */
@@ -406,7 +407,7 @@
path_rec->mtu |= IB_MTU_LEN_1024;
}
- pkt_life = ib_path_rec_pkt_life( path_rec ) +
g_pkt_life_modifier;
+ pkt_life = ib_path_rec_pkt_life( path_rec ) +
g_pkt_life_modifier;
if( pkt_life > 0x1F )
pkt_life = 0x1F;
Index:
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspproto.h
===================================================================
---
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspproto.h (revision
4824)
+++
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspproto.h (revision
4825)
@@ -165,9 +165,10 @@
int
query_pr(
- IN struct ibsp_port *port,
+ IN ib_net64_t guid,
IN ib_net64_t dest_port_guid,
- OUT ib_path_rec_t *path_rec );
+ IN uint16_t dev_id,
+ OUT ib_path_rec_t *path_rec );
int
build_ip_list(
@@ -201,7 +202,8 @@
int
ib_connect(
IN struct ibsp_socket_info *socket_info,
- IN ib_path_rec_t *path_rec );
+ IN ib_path_rec_t *path_rec,
+ IN ib_path_rec_t *alt_path_rec );
void
ib_disconnect(
@@ -296,3 +298,10 @@
extern void
release_globals( void );
+
+inline ib_net64_t GetOtherPortGuid(ib_net64_t DestPortGuid)
+{
+ return DestPortGuid ^ 0x300000000000000;
+
+}
+
Index:
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_duplicate.c
===================================================================
---
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_duplicate.c
(revision 4824)
+++
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibsp_duplicate.c
(revision 4825)
@@ -75,6 +75,7 @@
struct ibsp_duplicate_info *dup_info;
ib_net64_t dest_port_guid;
ib_path_rec_t path_rec;
+ ib_path_rec_t alt_path_rec, *palt_path_rec = NULL;
IBSP_ENTER( IBSP_DBG_DUP );
@@ -118,7 +119,7 @@
}
/* Get the path record */
- ret = query_pr( socket_info->port, dest_port_guid, &path_rec
);
+ ret = query_pr( socket_info->port->guid, dest_port_guid,
socket_info->port->hca->dev_id, &path_rec );
if( ret )
{
IBSP_ERROR( ("query_pr failed for IP %08x\n",
@@ -126,7 +127,22 @@
ret = WSAENETDOWN;
goto err1;
}
+ /* Get the alternate path record */
+ if (g_use_APM)
+ {
+ ret = query_pr(GetOtherPortGuid(socket_info->port->guid),
GetOtherPortGuid(dest_port_guid), socket_info->port->hca->dev_id,
&alt_path_rec );
+ if( ret )
+ {
+ // We can ignore a failure here, since APM is not a MUST
+ IBSP_ERROR( ("QPR for alternate path failed (error
ignored)\n") );
+ }
+ else
+ {
+ palt_path_rec = &alt_path_rec;
+ }
+ }
+
IBSP_CHANGE_SOCKET_STATE( socket_info, IBSP_DUPLICATING_NEW );
socket_info->h_event = CreateEvent( NULL, FALSE, FALSE, NULL
);
if( !socket_info->h_event )
@@ -143,7 +159,7 @@
}
/* Connects the QP. */
- ret = ib_connect( socket_info, &path_rec );
+ ret = ib_connect( socket_info, &path_rec, palt_path_rec );
if( ret != WSAEWOULDBLOCK )
{
IBSP_ERROR( ("ib_connect failed (%d)\n", ret) );
Index:
Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.c
===================================================================
--- Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.c
(revision 4824)
+++ Q:/projMLNX_WinOF_2.0/MLNX_WinOF_2-0/ulp/wsd/user/ibspdll.c
(revision 4825)
@@ -65,8 +65,9 @@
uint32_t g_sa_retries = 4;
int g_connect_err = WSAEADDRNOTAVAIL;
uint8_t g_max_cm_retries = CM_RETRIES;
-uint8_t g_pkt_life_modifier = 0;
+int8_t g_pkt_life_modifier = 0;
uint8_t g_qp_retries = QP_ATTRIB_RETRY_COUNT;
+uint8_t g_use_APM = 0;
DWORD_PTR g_dwPollThreadAffinityMask = 0;
uint32_t g_ibsp_dbg_level = TRACE_LEVEL_ERROR;
@@ -205,7 +206,7 @@
i = GetEnvironmentVariable( "IBWSD_PKT_LIFE", env_var,
sizeof(env_var) );
if( i && i <= 16 )
{
- g_pkt_life_modifier = (uint8_t)_tcstoul( env_var, NULL, 0 );
+ g_pkt_life_modifier = (int8_t)_tcstoul( env_var, NULL, 0 );
if( g_pkt_life_modifier > 0x1F )
g_pkt_life_modifier = 0x1F;
}
@@ -218,6 +219,12 @@
g_qp_retries = 7;
}
+ i = GetEnvironmentVariable( "IBWSD_USE_APM", env_var,
sizeof(env_var) );
+ if( i && i <= 16 )
+ {
+ g_use_APM = (uint8_t)_tcstoul( env_var, NULL, 0 );
+ }
+
if( init_globals() )
return FALSE;
@@ -804,7 +811,9 @@
int ret;
ib_net64_t dest_port_guid;
ib_path_rec_t path_rec;
+ ib_path_rec_t alt_path_rec, *palt_path_rec = NULL;
+
IBSP_ENTER( IBSP_DBG_CONN );
UNUSED_PARAM( lpCalleeData );
@@ -875,7 +884,7 @@
}
/* Get the path record */
- ret = query_pr( socket_info->port, dest_port_guid, &path_rec
);
+ ret = query_pr( socket_info->port->guid,
dest_port_guid,socket_info->port->hca->dev_id, &path_rec );
if( ret )
{
IBSP_ERROR_EXIT( (
@@ -883,6 +892,21 @@
*lpErrno = g_connect_err;
return SOCKET_ERROR;
}
+ /* Get the alternate path record */
+ if (g_use_APM)
+ {
+ ret = query_pr(GetOtherPortGuid(socket_info->port->guid),
GetOtherPortGuid(dest_port_guid), socket_info->port->hca->dev_id,
&alt_path_rec );
+ if( ret )
+ {
+ // We can ignore a failure here, since APM is not a MUST
+ IBSP_ERROR( ("QPR for alternate path failed (error
ignored)\n") );
+ }
+ else
+ {
+ palt_path_rec = &alt_path_rec;
+ }
+ }
+
cl_spinlock_acquire( &socket_info->mutex1 );
@@ -924,7 +948,7 @@
IBSP_CHANGE_SOCKET_STATE( socket_info, IBSP_CONNECT );
/* Connect */
- *lpErrno = ib_connect( socket_info, &path_rec );
+ *lpErrno = ib_connect( socket_info, &path_rec, palt_path_rec
);
if( *lpErrno != WSAEWOULDBLOCK )
{
/* We must be sure none destroyed our socket */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090924/d5b13d5a/attachment.html>
More information about the ofw
mailing list