When routing fails, mpr_rcv_get_apm_port_pair_paths returns NULL
and this is not handled in mpr_rcv_get_apm_paths

Signed-off-by: Hal Rosenstock <[email protected]>
---
diff --git a/opensm/osm_sa_multipath_record.c b/opensm/osm_sa_multipath_record.c
index 03ffd47..9153a58 100644
--- a/opensm/osm_sa_multipath_record.c
+++ b/opensm/osm_sa_multipath_record.c
@@ -1415,26 +1415,46 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,
        OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "APM matrix:\n"
                "\t{0,0} 0x%X->0x%X (%d)\t| {0,1} 0x%X->0x%X (%d)\n"
                "\t{1,0} 0x%X->0x%X (%d)\t| {1,1} 0x%X->0x%X (%d)\n",
-               matrix[0][0]->resp.mpr_rec.path_rec.slid,
-               matrix[0][0]->resp.mpr_rec.path_rec.dlid,
-               matrix[0][0]->resp.mpr_rec.hops,
-               matrix[0][1]->resp.mpr_rec.path_rec.slid,
-               matrix[0][1]->resp.mpr_rec.path_rec.dlid,
-               matrix[0][1]->resp.mpr_rec.hops,
-               matrix[1][0]->resp.mpr_rec.path_rec.slid,
-               matrix[1][0]->resp.mpr_rec.path_rec.dlid,
-               matrix[1][0]->resp.mpr_rec.hops,
-               matrix[1][1]->resp.mpr_rec.path_rec.slid,
-               matrix[1][1]->resp.mpr_rec.path_rec.dlid,
-               matrix[1][1]->resp.mpr_rec.hops);
+               matrix[0][0] ? matrix[0][0]->resp.mpr_rec.path_rec.slid : 0,
+               matrix[0][0] ? matrix[0][0]->resp.mpr_rec.path_rec.dlid : 0,
+               matrix[0][0] ? matrix[0][0]->resp.mpr_rec.hops : 0,
+               matrix[0][1] ? matrix[0][1]->resp.mpr_rec.path_rec.slid : 0,
+               matrix[0][1] ? matrix[0][1]->resp.mpr_rec.path_rec.dlid : 0,
+               matrix[0][1] ? matrix[0][1]->resp.mpr_rec.hops : 0,
+               matrix[1][0] ? matrix[1][0]->resp.mpr_rec.path_rec.slid : 0,
+               matrix[1][0] ? matrix[1][0]->resp.mpr_rec.path_rec.dlid : 0,
+               matrix[1][0] ? matrix[1][0]->resp.mpr_rec.hops : 0,
+               matrix[1][1] ? matrix[1][1]->resp.mpr_rec.path_rec.slid : 0,
+               matrix[1][1] ? matrix[1][1]->resp.mpr_rec.path_rec.dlid : 0,
+               matrix[1][1] ? matrix[1][1]->resp.mpr_rec.hops : 0);
+
+       sumA = minA = sumB = minB = 0;
 
        /* check diagonal A {(0,0), (1,1)} */
-       sumA = matrix[0][0]->resp.mpr_rec.hops + 
matrix[1][1]->resp.mpr_rec.hops;
-       minA = min(matrix[0][0]->resp.mpr_rec.hops, 
matrix[1][1]->resp.mpr_rec.hops);
+       if (matrix[0][0]) {
+               sumA += matrix[0][0]->resp.mpr_rec.hops;
+               minA = matrix[0][0]->resp.mpr_rec.hops;
+       }
+       if (matrix[1][1]) {
+               sumA += matrix[1][1]->resp.mpr_rec.hops;
+               if (minA)
+                       minA = min(minA, matrix[1][1]->resp.mpr_rec.hops);
+               else
+                       minA = matrix[1][1]->resp.mpr_rec.hops;
+       }
 
        /* check diagonal B {(0,1), (1,0)} */
-       sumB = matrix[0][1]->resp.mpr_rec.hops + 
matrix[1][0]->resp.mpr_rec.hops;
-       minB = min(matrix[0][1]->resp.mpr_rec.hops, 
matrix[1][0]->resp.mpr_rec.hops);
+       if (matrix[0][1]) {
+               sumB += matrix[0][1]->resp.mpr_rec.hops;
+               minB = matrix[0][1]->resp.mpr_rec.hops;
+       }
+       if (matrix[1][0]) {
+               sumB += matrix[1][0]->resp.mpr_rec.hops;
+               if (minB)
+                       minB = min(minB, matrix[1][0]->resp.mpr_rec.hops);
+               else
+                       minB = matrix[1][0]->resp.mpr_rec.hops;
+       }
 
        /* and the winner is... */
        if (minA <= minB || (minA == minB && sumA < sumB)) {
@@ -1442,14 +1462,16 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,
                OSM_LOG(sa->p_log, OSM_LOG_DEBUG,
                        "Diag {0,0} & {1,1} is the best:\n"
                        "\t{0,0} 0x%X->0x%X (%d)\t & {1,1} 0x%X->0x%X (%d)\n",
-                       matrix[0][0]->resp.mpr_rec.path_rec.slid,
-                       matrix[0][0]->resp.mpr_rec.path_rec.dlid,
-                       matrix[0][0]->resp.mpr_rec.hops,
-                       matrix[1][1]->resp.mpr_rec.path_rec.slid,
-                       matrix[1][1]->resp.mpr_rec.path_rec.dlid,
-                       matrix[1][1]->resp.mpr_rec.hops);
-               cl_qlist_insert_tail(p_list, &matrix[0][0]->list_item);
-               cl_qlist_insert_tail(p_list, &matrix[1][1]->list_item);
+                       matrix[0][0] ? matrix[0][0]->resp.mpr_rec.path_rec.slid 
: 0,
+                       matrix[0][0] ? matrix[0][0]->resp.mpr_rec.path_rec.dlid 
: 0,
+                       matrix[0][0] ? matrix[0][0]->resp.mpr_rec.hops : 0,
+                       matrix[1][1] ? matrix[1][1]->resp.mpr_rec.path_rec.slid 
: 0,
+                       matrix[1][1] ? matrix[1][1]->resp.mpr_rec.path_rec.dlid 
: 0,
+                       matrix[1][1] ? matrix[1][1]->resp.mpr_rec.hops : 0);
+               if (matrix[0][0])
+                       cl_qlist_insert_tail(p_list, &matrix[0][0]->list_item);
+               if (matrix[1][1])
+                       cl_qlist_insert_tail(p_list, &matrix[1][1]->list_item);
                free(matrix[0][1]);
                free(matrix[1][0]);
        } else {
@@ -1457,14 +1479,16 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,
                OSM_LOG(sa->p_log, OSM_LOG_DEBUG,
                        "Diag {0,1} & {1,0} is the best:\n"
                        "\t{0,1} 0x%X->0x%X (%d)\t & {1,0} 0x%X->0x%X (%d)\n",
-                       matrix[0][1]->resp.mpr_rec.path_rec.slid,
-                       matrix[0][1]->resp.mpr_rec.path_rec.dlid,
-                       matrix[0][1]->resp.mpr_rec.hops,
-                       matrix[1][0]->resp.mpr_rec.path_rec.slid,
-                       matrix[1][0]->resp.mpr_rec.path_rec.dlid,
-                       matrix[1][0]->resp.mpr_rec.hops);
-               cl_qlist_insert_tail(p_list, &matrix[0][1]->list_item);
-               cl_qlist_insert_tail(p_list, &matrix[1][0]->list_item);
+                       matrix[0][1] ? matrix[0][1]->resp.mpr_rec.path_rec.slid 
: 0,
+                       matrix[0][1] ? matrix[0][1]->resp.mpr_rec.path_rec.dlid 
: 0,
+                       matrix[0][1] ? matrix[0][1]->resp.mpr_rec.hops : 0,
+                       matrix[1][0] ? matrix[1][0]->resp.mpr_rec.path_rec.slid 
: 0,
+                       matrix[1][0] ? 
matrix[1][0]->resp.mpr_rec.path_rec.dlid: 0,
+                       matrix[1][0] ? matrix[1][0]->resp.mpr_rec.hops : 0);
+               if (matrix[0][1])
+                       cl_qlist_insert_tail(p_list, &matrix[0][1]->list_item);
+               if (matrix[1][0])
+                       cl_qlist_insert_tail(p_list, &matrix[1][0]->list_item);
                free(matrix[0][0]);
                free(matrix[1][1]);
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to