[ofw] [PATCH] IPoIB: Fill in service level in MAC_TO_PATH output

Fab Tillier ftillier at windows.microsoft.com
Mon Dec 8 22:16:31 PST 2008


This patch fixes a bug in the MAC_TO_PATH conversion in IPoIB wherein the service level in the output path wasn't set (or cleared).  This resulted in uninitialized memory being used for the SL, resulting in connection timeouts on some systems.

I also added some tracing to help track this kind of issue down.  The tracing as it stands isn't the most useful, as it only gives entry/exit information but not basic parameter information that would allow tracking individual objects.

Signed-off-by: Fab Tillier <ftillier at microsoft.com>

Index: ulp/ipoib/kernel/ipoib_port.c
===================================================================
--- ulp/ipoib/kernel/ipoib_port.c       (revision 1743)
+++ ulp/ipoib/kernel/ipoib_port.c       (working copy)
@@ -4722,6 +4722,7 @@ ipoib_mac_to_path(
        uint8_t                 sl;
        net32_t                 flow_lbl;
        uint8_t                 hop_limit;
+       uint8_t                 pkt_life;

        IPOIB_ENTER( IPOIB_DBG_ENDPT );

@@ -4768,20 +4769,29 @@ ipoib_mac_to_path(
                &flow_lbl,
                &hop_limit
                );
-       ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );

-       p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;
-       p_path->num_path = 1;
-       p_path->pkey = p_port->ib_mgr.bcast_rec.pkey;
-       p_path->mtu = p_port->ib_mgr.bcast_rec.mtu;
-       p_path->rate = p_port->ib_mgr.bcast_rec.rate;
        if( p_path->slid == p_path->dlid )
-               p_path->pkt_life = 0;
+               pkt_life = 0;
        else
-               p_path->pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;
-       p_path->preference = 0;
-       p_path->resv1 = 0;
-       p_path->resv2 = 0;
+               pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;
+
+       ib_path_rec_init_local(
+               p_path,
+               &p_endpt->dgid,
+               &p_port->p_local_endpt->dgid,
+               p_endpt->dlid,
+               p_port->p_local_endpt->dlid,
+               1,
+               p_port->ib_mgr.bcast_rec.pkey,
+               sl,
+               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,
+               IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,
+               IB_PATH_SELECTOR_EXACTLY, pkt_life,
+               0 );
+
+       /* Set global routing information. */
+       ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );
+       p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;

        cl_obj_unlock( &p_port->obj );

Index: core/al/al_mad.c
===================================================================
--- core/al/al_mad.c    (revision 1743)
+++ core/al/al_mad.c    (working copy)
@@ -1542,6 +1542,16 @@ __create_send_av(

        p_mad_element = h_send->p_send_mad;

+       AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_MAD_SVC,
+               ("class %d attr %d AV attr: port num %d, sl %d, dlid %d, path bits %d",
+               p_mad_element->p_mad_buf->mgmt_class,
+               p_mad_element->p_mad_buf->attr_id,
+               h_mad_svc->port_num,
+               p_mad_element->remote_sl,
+               p_mad_element->remote_lid,
+               p_mad_element->path_bits)
+               );
+
        av_attr.port_num = h_mad_svc->port_num;

        av_attr.sl = p_mad_element->remote_sl;
@@ -1549,7 +1559,18 @@ __create_send_av(

        av_attr.grh_valid = p_mad_element->grh_valid;
        if( av_attr.grh_valid )
+       {
                av_attr.grh = *p_mad_element->p_grh;
+               AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_MAD_SVC,
+                       ("ver_class_flow %08x, hop lmt %d, src gid %16I64x%16I64x, dest gid %16I64x%16I64x",
+                       av_attr.grh.ver_class_flow,
+                       av_attr.grh.hop_limit,
+                       cl_ntoh64( av_attr.grh.src_gid.unicast.prefix ),
+                       cl_ntoh64( av_attr.grh.src_gid.unicast.interface_id ),
+                       cl_ntoh64( av_attr.grh.dest_gid.unicast.prefix ),
+                       cl_ntoh64( av_attr.grh.dest_gid.unicast.interface_id ))
+                       );
+       }

        av_attr.static_rate = IB_PATH_RECORD_RATE_10_GBS;
        av_attr.path_bits = p_mad_element->path_bits;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ipoib_sl.patch
Type: application/octet-stream
Size: 3003 bytes
Desc: ipoib_sl.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20081208/a1ecb5ea/attachment.obj>


More information about the ofw mailing list