[ofw] Using ib_local_mad instead of SM query
Slava Strebkov
slavas at voltaire.com
Sun Oct 12 07:24:34 PDT 2008
The following patch is intended to reduce workload from SM .
SM query in ipoib_port_up is replaced to ib_local_mad, but
__endpt_mgr_add_local is called only once and only after
__port_get_bcast succeeded. This is done to prevent assertion in
__endpt_mgr_reset_all.
Index: ulp/ipoib/kernel/ipoib_port.c
===================================================================
--- ulp/ipoib/kernel/ipoib_port.c (revision 1648)
+++ ulp/ipoib/kernel/ipoib_port.c (working copy)
@@ -451,11 +451,6 @@
IN ipoib_port_t*
const p_port );
static void
-__port_info_cb(
- IN
ib_query_rec_t *p_query_rec );
-
-
-static void
__bcast_get_cb(
IN
ib_query_rec_t *p_query_rec );
@@ -5074,12 +5069,13 @@
IN const ib_pnp_port_rec_t* const
p_pnp_rec )
{
ib_api_status_t status;
- ib_query_req_t query;
- ib_user_query_t info;
- ib_portinfo_record_t port_rec;
+ ib_port_info_t *p_port_info;
+ ib_mad_t *mad_in = NULL;
+ ib_mad_t *mad_out = NULL;
IPOIB_ENTER( IPOIB_DBG_INIT );
+ UNREFERENCED_PARAMETER(p_pnp_rec);
/* Wait for all work requests to get flushed. */
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )
cl_thread_suspend( 0 );
@@ -5089,41 +5085,82 @@
KeResetEvent( &p_port->sa_event );
cl_obj_unlock( &p_port->obj );
- info.method = IB_MAD_METHOD_GETTABLE;
- info.attr_id = IB_MAD_ATTR_PORTINFO_RECORD;
- info.attr_size = sizeof(ib_portinfo_record_t);
- info.comp_mask = IB_PIR_COMPMASK_BASELID;
- info.p_attr = &port_rec;
+ mad_out = (ib_mad_t*)cl_zalloc(256);
+ if(! mad_out)
+ {
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ERROR,
+ ("failed to allocate mad
mad_out\n"));
+ return;
+ }
+ mad_in = (ib_mad_t*)cl_zalloc(256);
+ if(! mad_in)
+ {
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ERROR,
+ ("failed to allocate mad mad_in\n"));
+ return;
+ }
- /* Query requires only the base LID. */
- cl_memclr( &port_rec, sizeof(ib_portinfo_record_t) );
- port_rec.port_info.base_lid = p_pnp_rec->p_port_attr->lid;
+ mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;
+ mad_in->method = IB_MAD_METHOD_GET;
+ mad_in->base_ver = 1;
+ mad_in->class_ver =1;
+ mad_in->mgmt_class = IB_MCLASS_SUBN_LID;
+
+ status = p_port->p_adapter->p_ifc->local_mad(
+ p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in
,mad_out);
- cl_memclr( &query, sizeof(ib_query_req_t) );
- query.query_type = IB_QUERY_USER_DEFINED;
- query.p_query_input = &info;
- query.port_guid = p_port->p_adapter->guids.port_guid.guid;
- query.timeout_ms = p_port->p_adapter->params.sa_timeout;
- query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;
- query.query_context = p_port;
- query.pfn_query_cb = __port_info_cb;
-
- /* reference the object for the multicast query. */
- ipoib_port_ref( p_port, ref_port_up );
-
- status = p_port->p_adapter->p_ifc->query(
- p_port->p_adapter->h_al, &query,
&p_port->ib_mgr.h_query );
if( status != IB_SUCCESS )
{
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT,
FALSE );
ipoib_set_inactive( p_port->p_adapter );
- ipoib_port_deref( p_port, ref_port_up );
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,
- ("ib_query returned %s\n",
+ ("ib_local_mad returned %s\n",
p_port->p_adapter->p_ifc->get_err_str( status )) );
- return;
+ goto up_done;
}
+ p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);
+
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,
+ ("Received port info: link width =
%d.\n",
+ p_port_info->link_width_active) );
+ p_port->ib_mgr.rate =
+ ib_port_info_compute_rate( p_port_info );
+
+ ipoib_set_rate( p_port->p_adapter,
+ p_port_info->link_width_active,
+ ib_port_info_get_link_speed_active( p_port_info ) );
+
+ status = __port_get_bcast( p_port );
+ if (status != IB_SUCCESS)
+ {
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
+ (" __port_get_bcast returned
%s\n",p_port->p_adapter->p_ifc->get_err_str( status )));
+ }
+ else
+ {
+ if(! p_port->p_local_endpt)
+ {
+ status = __endpt_mgr_add_local(
p_port, p_port_info );
+ }
+ }
+
+up_done:
+ if( status != IB_SUCCESS )
+ {
+ if( status != IB_CANCELED )
+ {
+ ipoib_set_inactive( p_port->p_adapter
);
+ __endpt_mgr_reset_all( p_port );
+ }
+ KeSetEvent( &p_port->sa_event, EVENT_INCREMENT,
FALSE );
+ }
+
+ if(mad_out)
+ cl_free(mad_out);
+ if(mad_in)
+ cl_free(mad_in);
+
IPOIB_EXIT( IPOIB_DBG_INIT );
}
@@ -5187,111 +5224,7 @@
}
-static void
-__port_info_cb(
- IN
ib_query_rec_t *p_query_rec )
-{
- ib_api_status_t status;
- ipoib_port_t *p_port;
- ib_portinfo_record_t *p_port_rec;
- IPOIB_ENTER( IPOIB_DBG_INIT );
-
- p_port = (ipoib_port_t*)p_query_rec->query_context;
-
- cl_obj_lock( &p_port->obj );
- p_port->ib_mgr.h_query = NULL;
-
- if( p_port->state != IB_QPS_INIT )
- {
- status = IB_CANCELED;
- goto done;
- }
-
- status = p_query_rec->status;
-
- switch( status )
- {
- case IB_SUCCESS:
- /* Note that the we report the rate from the
port info. */
- p_port_rec = (ib_portinfo_record_t*)
- ib_get_query_result(
p_query_rec->p_result_mad, 0 );
-
- status = __endpt_mgr_add_local( p_port,
&p_port_rec->port_info );
- if( status == IB_SUCCESS )
- {
- IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,
- ("Received port info:
link width = %d.\n",
-
p_port_rec->port_info.link_width_active) );
-
- p_port->ib_mgr.rate =
-
ib_port_info_compute_rate( &p_port_rec->port_info );
-
- ipoib_set_rate( p_port->p_adapter,
-
p_port_rec->port_info.link_width_active,
-
ib_port_info_get_link_speed_active( &p_port_rec->port_info ) );
-
- status = __port_get_bcast( p_port );
- }
- else
- {
- IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,
- ("__endpt_mgr_add_local
returned %s\n",
-
p_port->p_adapter->p_ifc->get_err_str( status )) );
- }
- break;
-
- case IB_CANCELED:
- IPOIB_PRINT(TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,
- ("Instance destroying -
Aborting.\n") );
- break;
-
- case IB_TIMEOUT:
- NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,
- EVENT_IPOIB_PORT_INFO_TIMEOUT, 0 );
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,
- ("Port info query timed out.\n") );
- break;
-
- case IB_REMOTE_ERROR:
- NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,
- EVENT_IPOIB_PORT_INFO_REJECT, 0 );
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,
- ("Port info query rejected by
SA.\n") );
- break;
-
- default:
- NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,
- EVENT_IPOIB_QUERY_PORT_INFO, 1,
p_query_rec->status );
- /* Hopefully we'll get an SM change event that
will restart things. */
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,
- ("Port info query failed.\n") );
- }
-
-done:
- cl_obj_unlock( &p_port->obj );
-
- if( status != IB_SUCCESS )
- {
- if( status != IB_CANCELED )
- {
- ipoib_set_inactive(
p_port->p_adapter );
- __endpt_mgr_reset_all( p_port );
- }
- KeSetEvent( &p_port->sa_event, EVENT_INCREMENT,
FALSE );
- }
-
- /* Return the response MAD to AL. */
- if( p_query_rec->p_result_mad )
- p_port->p_adapter->p_ifc->put_mad(
p_query_rec->p_result_mad );
-
- /* Release the reference taken when issuing the port info
query. */
- ipoib_port_deref( p_port, ref_port_info_cb );
-
- IPOIB_EXIT( IPOIB_DBG_INIT );
-}
-
-
static ib_api_status_t
__port_get_bcast(
IN ipoib_port_t*
const p_port )
Slava
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20081012/ccf27078/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: local_mad.diff
Type: application/octet-stream
Size: 7275 bytes
Desc: local_mad.diff
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20081012/ccf27078/attachment.obj>
More information about the ofw
mailing list