Integrating unicast routing cache into the unicast manager.

The cache is used the following way:
 - SM is executed - it starts first routing calculation
 - calculated routing is stored in the cache
 - at some point new heavy sweep is triggered
 - unicast manager checks whether the cache can be used instead
   of new routing calculation.
   In one of the following cases we can use cached routing
    + there is no topology change
    + one or more CAs disappeared (they exist in the cached topology
      model, but missing in the newly discovered fabric)
    + one or more leaf switches disappeared
   In these cases cached routing is written to the switches as is
   (unless the switch doesn't exist).
   If there is any other topology change:
     - existing cache is invalidated
     - topology is cached
     - routing is calculated as usual
     - routing is cached

Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_ucast_mgr.h |    7 +++-
 opensm/opensm/osm_ucast_mgr.c         |   79 ++++++++++++++++++++++-----------
 2 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/opensm/include/opensm/osm_ucast_mgr.h 
b/opensm/include/opensm/osm_ucast_mgr.h
index 0317c93..33e164b 100644
--- a/opensm/include/opensm/osm_ucast_mgr.h
+++ b/opensm/include/opensm/osm_ucast_mgr.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -53,6 +53,7 @@
 #include <opensm/osm_madw.h>
 #include <opensm/osm_subnet.h>
 #include <opensm/osm_switch.h>
+#include <opensm/osm_ucast_cache.h>
 #include <opensm/osm_log.h>

 #ifdef __cplusplus
@@ -103,6 +104,7 @@ typedef struct _osm_ucast_mgr {
        boolean_t is_dor;
        boolean_t any_change;
        boolean_t some_hop_count_set;
+       osm_ucast_cache_t * p_cache;
        uint8_t *lft_buf;
 } osm_ucast_mgr_t;
 /*
@@ -132,6 +134,9 @@ typedef struct _osm_ucast_mgr {
 *              tables calculation iteration cycle, set to TRUE to indicate
 *              that some hop count changes were done.
 *
+*      p_cache
+*              Pointer to the unicast cache object.
+*
 *      lft_buf
 *              LFT buffer - used during LFT calculation/setup.
 *
diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
index 938db84..d854fa9 100644
--- a/opensm/opensm/osm_ucast_mgr.c
+++ b/opensm/opensm/osm_ucast_mgr.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved.
+ * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -81,6 +81,9 @@ void osm_ucast_mgr_destroy(IN osm_ucast_mgr_t * const p_mgr)
        if (p_mgr->lft_buf)
                free(p_mgr->lft_buf);

+       if (p_mgr->p_cache)
+               osm_ucast_cache_destroy(p_mgr->p_cache);
+
        OSM_LOG_EXIT(p_mgr->p_log);
 }

@@ -104,6 +107,9 @@ osm_ucast_mgr_init(IN osm_ucast_mgr_t * const p_mgr, IN 
osm_sm_t * sm)
        if (!p_mgr->lft_buf)
                return IB_INSUFFICIENT_MEMORY;

+       if (p_mgr->p_subn->opt.use_ucast_cache)
+               p_mgr->p_cache = osm_ucast_cache_construct(p_mgr);
+
        OSM_LOG_EXIT(p_mgr->p_log);
        return (status);
 }
@@ -375,6 +381,10 @@ osm_ucast_mgr_set_fwd_table(IN osm_ucast_mgr_t * const 
p_mgr,

        CL_ASSERT(p_path);

+       if (p_mgr->p_cache && p_mgr->p_cache->need_update)
+               osm_ucast_cache_set_sw_fwd_table(p_mgr->p_cache,
+                                                p_mgr->lft_buf, p_sw);
+
        /*
           Set the top of the unicast forwarding table.
         */
@@ -688,33 +698,50 @@ osm_signal_t osm_ucast_mgr_process(IN osm_ucast_mgr_t * 
const p_mgr)

        p_mgr->any_change = FALSE;

-       if (!p_routing_eng->build_lid_matrices ||
-           (blm = p_routing_eng->build_lid_matrices(p_routing_eng->context)))
-               osm_ucast_mgr_build_lid_matrices(p_mgr);
+       if (p_mgr->p_cache && (osm_ucast_cache_apply(p_mgr->p_cache) == 0))
+               OSM_LOG(p_mgr->p_log, OSM_LOG_INFO,
+                       "configured switch tables using cached routing\n");
+       else {
+               if (p_mgr->p_cache) {
+                       /* ucast cache is enabled - refresh
+                          topology and mark routing for update */
+                       p_mgr->p_cache->need_update = TRUE;
+                       osm_ucast_cache_refresh_topo(p_mgr->p_cache);
+               }
+
+               if (!p_routing_eng->build_lid_matrices ||
+                   (blm = 
p_routing_eng->build_lid_matrices(p_routing_eng->context)))
+                       osm_ucast_mgr_build_lid_matrices(p_mgr);

-       /*
-          Now that the lid matrices have been built, we can
-          build and download the switch forwarding tables.
-        */
-       if (!p_routing_eng->ucast_build_fwd_tables ||
-           (ubft =
-            p_routing_eng->ucast_build_fwd_tables(p_routing_eng->context)))
-               cl_qmap_apply_func(p_sw_guid_tbl, __osm_ucast_mgr_process_tbl,
-                                  p_mgr);
-
-       /* 'file' routing engine has one unique logic corner case */
-       if (p_routing_eng->name && (strcmp(p_routing_eng->name, "file") == 0)
-           && (!blm || !ubft))
-               p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_FILE;
-       else if (!blm && !ubft)
-               p_osm->routing_engine_used =
-                   osm_routing_engine_type(p_routing_eng->name);
-       else
-               p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP;
+               /*
+                  Now that the lid matrices have been built, we can
+                  build and download the switch forwarding tables.
+                */
+               if (!p_routing_eng->ucast_build_fwd_tables ||
+                   (ubft =
+                    
p_routing_eng->ucast_build_fwd_tables(p_routing_eng->context)))
+                       cl_qmap_apply_func(p_sw_guid_tbl, 
__osm_ucast_mgr_process_tbl,
+                                          p_mgr);
+
+               /* 'file' routing engine has one unique logic corner case */
+               if (p_routing_eng->name && (strcmp(p_routing_eng->name, "file") 
== 0)
+                   && (!blm || !ubft))
+                       p_osm->routing_engine_used = 
OSM_ROUTING_ENGINE_TYPE_FILE;
+               else if (!blm && !ubft)
+                       p_osm->routing_engine_used =
+                           osm_routing_engine_type(p_routing_eng->name);
+               else
+                       p_osm->routing_engine_used = 
OSM_ROUTING_ENGINE_TYPE_MINHOP;
+
+               OSM_LOG(p_mgr->p_log, OSM_LOG_INFO,
+                       "%s tables configured on all switches\n",
+                       
osm_routing_engine_type_str(p_osm->routing_engine_used));

-       OSM_LOG(p_mgr->p_log, OSM_LOG_INFO,
-               "%s tables configured on all switches\n",
-               osm_routing_engine_type_str(p_osm->routing_engine_used));
+               if (p_mgr->p_cache) {
+                       osm_ucast_cache_refresh_lid_matrices(p_mgr->p_cache);
+                       p_mgr->p_cache->need_update = FALSE;
+               }
+       }

        if (p_mgr->any_change) {
                signal = OSM_SIGNAL_DONE_PENDING;
-- 
1.5.1.4

_______________________________________________
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