Use single array (instead of ptr vector) for used_lids.

Signed-off-by: Sasha Khapyorsky <[email protected]>
---
 opensm/include/opensm/osm_lid_mgr.h |    4 +-
 opensm/opensm/osm_lid_mgr.c         |   60 +++++++++--------------------------
 2 files changed, 17 insertions(+), 47 deletions(-)

diff --git a/opensm/include/opensm/osm_lid_mgr.h 
b/opensm/include/opensm/osm_lid_mgr.h
index 714ba41..d6d1ab8 100644
--- a/opensm/include/opensm/osm_lid_mgr.h
+++ b/opensm/include/opensm/osm_lid_mgr.h
@@ -98,8 +98,8 @@ typedef struct osm_lid_mgr {
        cl_plock_t *p_lock;
        boolean_t send_set_reqs;
        osm_db_domain_t *p_g2l;
-       cl_ptr_vector_t used_lids;
        cl_qlist_t free_ranges;
+       uint8_t used_lids[IB_LID_UCAST_END_HO + 1];
 } osm_lid_mgr_t;
 /*
 * FIELDS
@@ -125,7 +125,7 @@ typedef struct osm_lid_mgr {
 *              Pointer to the database domain storing guid to lid mapping.
 *
 *      used_lids
-*              A vector the maps from the lid to its guid. keeps track of
+*              An array of used lids. keeps track of
 *              existing and non existing mapping of guid->lid
 *
 *      free_ranges
diff --git a/opensm/opensm/osm_lid_mgr.c b/opensm/opensm/osm_lid_mgr.c
index 63c3bb9..e527337 100644
--- a/opensm/opensm/osm_lid_mgr.c
+++ b/opensm/opensm/osm_lid_mgr.c
@@ -109,7 +109,6 @@ typedef struct osm_lid_mgr_range {
 void osm_lid_mgr_construct(IN osm_lid_mgr_t * const p_mgr)
 {
        memset(p_mgr, 0, sizeof(*p_mgr));
-       cl_ptr_vector_construct(&p_mgr->used_lids);
 }
 
 /**********************************************************************
@@ -120,7 +119,6 @@ void osm_lid_mgr_destroy(IN osm_lid_mgr_t * const p_mgr)
 
        OSM_LOG_ENTER(p_mgr->p_log);
 
-       cl_ptr_vector_destroy(&p_mgr->used_lids);
        p_item = cl_qlist_remove_head(&p_mgr->free_ranges);
        while (p_item != cl_qlist_end(&p_mgr->free_ranges)) {
                free((osm_lid_mgr_range_t *) p_item);
@@ -188,11 +186,7 @@ static void __osm_lid_mgr_validate_db(IN osm_lid_mgr_t * 
p_mgr)
                        } else {
                                /* check if the lids were not previously 
assigned */
                                for (lid = min_lid; lid <= max_lid; lid++) {
-                                       if ((cl_ptr_vector_get_size
-                                            (&p_mgr->used_lids) > lid)
-                                           &&
-                                           (cl_ptr_vector_get
-                                            (&p_mgr->used_lids, lid))) {
+                                       if (p_mgr->used_lids[lid]) {
                                                OSM_LOG(p_mgr->p_log,
                                                        OSM_LOG_ERROR, "ERR 
0314: "
                                                        "0x%04x for guid:0x%016"
@@ -215,8 +209,7 @@ static void __osm_lid_mgr_validate_db(IN osm_lid_mgr_t * 
p_mgr)
                        } else {
                                /* mark it was visited */
                                for (lid = min_lid; lid <= max_lid; lid++)
-                                       cl_ptr_vector_set(&p_mgr->used_lids,
-                                                         lid, (void *)1);
+                                       p_mgr->used_lids[lid] = 1;
                        }
                }               /* got a lid */
                free(p_item);
@@ -252,7 +245,6 @@ osm_lid_mgr_init(IN osm_lid_mgr_t * const p_mgr, IN 
osm_sm_t *sm)
                goto Exit;
        }
 
-       cl_ptr_vector_init(&p_mgr->used_lids, 100, 40);
        cl_qlist_init(&p_mgr->free_ranges);
 
        /* we use the stored guid to lid table if not forced to reassign */
@@ -303,7 +295,6 @@ static uint16_t __osm_trim_lid(IN uint16_t lid)
 static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * const p_mgr)
 {
        cl_ptr_vector_t *p_discovered_vec = &p_mgr->p_subn->port_lid_tbl;
-       cl_ptr_vector_t *p_persistent_vec = &p_mgr->used_lids;
        uint16_t max_defined_lid;
        uint16_t max_persistent_lid;
        uint16_t max_discovered_lid;
@@ -335,10 +326,7 @@ static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * 
const p_mgr)
                        OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG,
                                "Ignore guid2lid file when coming out of 
standby\n");
                        osm_db_clear(p_mgr->p_g2l);
-                       for (lid = 0;
-                            lid < cl_ptr_vector_get_size(&p_mgr->used_lids);
-                            lid++)
-                               cl_ptr_vector_set(p_persistent_vec, lid, NULL);
+                       memset(p_mgr->used_lids, 0, sizeof(p_mgr->used_lids));
                } else {
                        OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG,
                                "Honor current guid2lid file when coming out "
@@ -413,7 +401,7 @@ static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * 
const p_mgr)
                                               cl_ntoh64
                                               (osm_port_get_guid(p_port)));
                        for (lid = db_min_lid; lid <= db_max_lid; lid++)
-                               cl_ptr_vector_set(p_persistent_vec, lid, NULL);
+                               p_mgr->used_lids[lid] = 0;
                }
        }
 
@@ -437,14 +425,11 @@ static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * 
const p_mgr)
        /* find the range of lids to scan */
        max_discovered_lid =
            (uint16_t) cl_ptr_vector_get_size(p_discovered_vec);
-       max_persistent_lid =
-           (uint16_t) cl_ptr_vector_get_size(p_persistent_vec);
+       max_persistent_lid = sizeof(p_mgr->used_lids) - 1;
 
        /* but the vectors have one extra entry for lid=0 */
        if (max_discovered_lid)
                max_discovered_lid--;
-       if (max_persistent_lid)
-               max_persistent_lid--;
 
        if (max_persistent_lid > max_discovered_lid)
                max_defined_lid = max_persistent_lid;
@@ -454,8 +439,7 @@ static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * 
const p_mgr)
        for (lid = 1; lid <= max_defined_lid; lid++) {
                is_free = TRUE;
                /* first check to see if the lid is used by a persistent 
assignment */
-               if ((lid <= max_persistent_lid)
-                   && cl_ptr_vector_get(p_persistent_vec, lid)) {
+               if (lid <= max_persistent_lid && p_mgr->used_lids[lid]) {
                        OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG,
                                "0x%04x is not free as its mapped by the "
                                "persistent db\n", lid);
@@ -515,11 +499,9 @@ static int __osm_lid_mgr_init_sweep(IN osm_lid_mgr_t * 
const p_mgr)
                                        for (req_lid = disc_min_lid + 1;
                                             req_lid <= disc_max_lid;
                                             req_lid++) {
-                                               if ((req_lid <=
-                                                    max_persistent_lid) &&
-                                                   cl_ptr_vector_get
-                                                   (p_persistent_vec,
-                                                    req_lid)) {
+                                               if (req_lid <=
+                                                   max_persistent_lid &&
+                                                   p_mgr->used_lids[req_lid]) {
                                                        OSM_LOG(p_mgr->p_log,
                                                                OSM_LOG_DEBUG,
                                                                "0x%04x is free 
as it was discovered "
@@ -604,28 +586,16 @@ __osm_lid_mgr_is_range_not_persistent(IN osm_lid_mgr_t * 
const p_mgr,
                                      IN const uint16_t num_lids)
 {
        uint16_t i;
-       cl_status_t status;
-       osm_port_t *p_port;
        const uint8_t start_lid = (uint8_t) (1 << p_mgr->p_subn->opt.lmc);
-       const cl_ptr_vector_t *const p_tbl = &p_mgr->used_lids;
 
        if (lid < start_lid)
-               return (FALSE);
+               return FALSE;
 
-       for (i = lid; i < lid + num_lids; i++) {
-               status = cl_ptr_vector_at(p_tbl, i, (void *)&p_port);
-               if (status == CL_SUCCESS) {
-                       if (p_port != NULL)
-                               return (FALSE);
-               } else
-                       /*
-                          We are out of range in the array.
-                          Consider all further entries "free".
-                        */
-                       return (TRUE);
-       }
+       for (i = lid; i < lid + num_lids; i++)
+               if (p_mgr->used_lids[lid])
+                       return FALSE;
 
-       return (TRUE);
+       return TRUE;
 }
 
 /**********************************************************************
@@ -824,7 +794,7 @@ NewLidSet:
        /* update the guid2lid db and used_lids */
        osm_db_guid2lid_set(p_mgr->p_g2l, guid, *p_min_lid, *p_max_lid);
        for (lid = *p_min_lid; lid <= *p_max_lid; lid++)
-               cl_ptr_vector_set(&p_mgr->used_lids, lid, (void *)1);
+               p_mgr->used_lids[lid] = 1;
 
 Exit:
        /* make sure the assigned lids are marked in port_lid_tbl */
-- 
1.6.1.2.319.gbd9e

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to