Integrating unicast cache into the discovery and ucast manager.

Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_ucast_mgr.h |    6 ++++
 opensm/opensm/osm_drop_mgr.c          |   13 ++++++++-
 opensm/opensm/osm_node_info_rcv.c     |    9 +++++-
 opensm/opensm/osm_port_info_rcv.c     |    9 +++++-
 opensm/opensm/osm_state_mgr.c         |   10 ++++++-
 opensm/opensm/osm_ucast_mgr.c         |   50 ++++++++++++++++++++++----------
 6 files changed, 77 insertions(+), 20 deletions(-)

diff --git a/opensm/include/opensm/osm_ucast_mgr.h 
b/opensm/include/opensm/osm_ucast_mgr.h
index 27e89e9..e4006bb 100644
--- a/opensm/include/opensm/osm_ucast_mgr.h
+++ b/opensm/include/opensm/osm_ucast_mgr.h
@@ -49,6 +49,7 @@
 #include <opensm/osm_subnet.h>
 #include <opensm/osm_switch.h>
 #include <opensm/osm_log.h>
+#include <opensm/osm_ucast_cache.h>

 #ifdef __cplusplus
 #  define BEGIN_C_DECLS extern "C" {
@@ -77,6 +78,7 @@ BEGIN_C_DECLS
 *
 *********/
 struct osm_sm;
+struct _osm_ucast_cache;
 /****s* OpenSM: Unicast Manager/osm_ucast_mgr_t
 * NAME
 *      osm_ucast_mgr_t
@@ -97,6 +99,7 @@ typedef struct osm_ucast_mgr {
        cl_qlist_t port_order_list;
        boolean_t is_dor;
        boolean_t some_hop_count_set;
+       struct _osm_ucast_cache *p_cache;
 } osm_ucast_mgr_t;
 /*
 * FIELDS
@@ -128,6 +131,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.
+*
 * SEE ALSO
 *      Unicast Manager object
 *********/
diff --git a/opensm/opensm/osm_drop_mgr.c b/opensm/opensm/osm_drop_mgr.c
index e827c26..e8d3454 100644
--- a/opensm/opensm/osm_drop_mgr.c
+++ b/opensm/opensm/osm_drop_mgr.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004-2007 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.
  * Copyright (c) 2008 Xsigo Systems Inc.  All rights reserved.
  *
@@ -61,6 +61,7 @@
 #include <opensm/osm_multicast.h>
 #include <opensm/osm_remote_sm.h>
 #include <opensm/osm_inform.h>
+#include <opensm/osm_ucast_mgr.h>

 /**********************************************************************
  **********************************************************************/
@@ -134,6 +135,13 @@ static void drop_mgr_clean_physp(osm_sm_t * sm, IN 
osm_physp_t * p_physp)
                                  (p_remote_physp->p_node)),
                        p_remote_physp->port_num);

+               if (sm->p_subn->opt.use_ucast_cache)
+                       osm_ucast_cache_add_link(sm->ucast_mgr.p_cache,
+                                                p_physp->p_node,
+                                                p_physp->port_num,
+                                                p_remote_physp->p_node,
+                                                p_remote_physp->port_num);
+
                osm_physp_unlink(p_physp, p_remote_physp);

        }
@@ -307,6 +315,9 @@ __osm_drop_mgr_process_node(osm_sm_t * sm, IN osm_node_t * 
p_node)
                "Unreachable node 0x%016" PRIx64 "\n",
                cl_ntoh64(osm_node_get_node_guid(p_node)));

+       if (sm->p_subn->opt.use_ucast_cache)
+               osm_ucast_cache_add_node(sm->ucast_mgr.p_cache, p_node);
+
        /*
           Delete all the logical and physical port objects
           associated with this node.
diff --git a/opensm/opensm/osm_node_info_rcv.c 
b/opensm/opensm/osm_node_info_rcv.c
index 86710d1..27b842f 100644
--- a/opensm/opensm/osm_node_info_rcv.c
+++ b/opensm/opensm/osm_node_info_rcv.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004-2007 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
@@ -59,6 +59,7 @@
 #include <opensm/osm_helper.h>
 #include <opensm/osm_msgdef.h>
 #include <opensm/osm_opensm.h>
+#include <opensm/osm_ucast_mgr.h>

 static void
 report_duplicated_guid(IN osm_sm_t * sm,
@@ -240,6 +241,12 @@ __osm_ni_rcv_set_links(IN osm_sm_t * sm,
                cl_ntoh64(osm_node_get_node_guid(p_node)), port_num,
                cl_ntoh64(p_ni_context->node_guid), p_ni_context->port_num);

+       if (sm->p_subn->opt.use_ucast_cache)
+               osm_ucast_cache_check_new_link(sm->ucast_mgr.p_cache,
+                                              p_node, port_num,
+                                              p_neighbor_node,
+                                              p_ni_context->port_num);
+
        osm_node_link(p_node, port_num, p_neighbor_node,
                      p_ni_context->port_num);

diff --git a/opensm/opensm/osm_port_info_rcv.c 
b/opensm/opensm/osm_port_info_rcv.c
index a820069..cac3c05 100644
--- a/opensm/opensm/osm_port_info_rcv.c
+++ b/opensm/opensm/osm_port_info_rcv.c
@@ -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
@@ -60,6 +60,7 @@
 #include <opensm/osm_pkey.h>
 #include <opensm/osm_remote_sm.h>
 #include <opensm/osm_opensm.h>
+#include <opensm/osm_ucast_mgr.h>

 /**********************************************************************
  **********************************************************************/
@@ -244,6 +245,12 @@ __osm_pi_rcv_process_switch_port(IN osm_sm_t * sm,
                                                  (p_remote_node)),
                                        remote_port_num);

+                               if (sm->p_subn->opt.use_ucast_cache)
+                                       
osm_ucast_cache_add_link(sm->ucast_mgr.p_cache,
+                                                                p_node, 
port_num,
+                                                                p_remote_node,
+                                                                
remote_port_num);
+
                                osm_node_unlink(p_node, (uint8_t) port_num,
                                                p_remote_node,
                                                (uint8_t) remote_port_num);
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index b4eb87b..88d8bf9 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -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
@@ -1075,6 +1075,10 @@ static void do_sweep(osm_sm_t * sm)
                /* Re-program the switches fully */
                sm->p_subn->ignore_existing_lfts = TRUE;

+               /* we want to re-route, so cache should be invalidated */
+               if (sm->p_subn->opt.use_ucast_cache)
+                       osm_ucast_cache_invalidate(sm->ucast_mgr.p_cache);
+
                osm_ucast_mgr_process(&sm->ucast_mgr);

                /* Reset flag */
@@ -1229,6 +1233,10 @@ _repeat_discovery:
        /*
         * Proceed with unicast forwarding table configuration.
         */
+
+       if (sm->p_subn->opt.use_ucast_cache)
+               osm_ucast_cache_validate(sm->ucast_mgr.p_cache);
+
        osm_ucast_mgr_process(&sm->ucast_mgr);
        if (wait_for_pending_transactions(&sm->p_subn->p_osm->stats))
                return;
diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
index 12a8b58..97b4fb9 100644
--- a/opensm/opensm/osm_ucast_mgr.c
+++ b/opensm/opensm/osm_ucast_mgr.c
@@ -73,6 +73,8 @@ void osm_ucast_mgr_destroy(IN osm_ucast_mgr_t * const p_mgr)
        CL_ASSERT(p_mgr);

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

@@ -92,6 +94,12 @@ osm_ucast_mgr_init(IN osm_ucast_mgr_t * const p_mgr, IN 
osm_sm_t * sm)
        p_mgr->p_subn = sm->p_subn;
        p_mgr->p_lock = sm->p_lock;

+       if (sm->p_subn->opt.use_ucast_cache){
+               p_mgr->p_cache = osm_ucast_cache_construct(p_mgr);
+               if (!p_mgr->p_cache)
+                       status = IB_INSUFFICIENT_MEMORY;
+       }
+
        OSM_LOG_EXIT(p_mgr->p_log);
        return (status);
 }
@@ -818,27 +826,37 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const 
p_mgr)
        /*
           If there are no switches in the subnet, we are done.
         */
-       if (cl_qmap_count(p_sw_guid_tbl) == 0 ||
-           ucast_mgr_setup_all_switches(p_mgr->p_subn) < 0)
+       if (cl_qmap_count(p_sw_guid_tbl) == 0)
                goto Exit;

        p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE;
-       while (p_routing_eng) {
-               if (!ucast_mgr_route(p_routing_eng, p_osm))
-                       break;
-               p_routing_eng = p_routing_eng->next;
-       }
+       if (p_mgr->p_subn->opt.use_ucast_cache &&
+           osm_ucast_cache_is_valid(p_mgr->p_cache)) {
+               OSM_LOG(p_mgr->p_log, OSM_LOG_INFO,
+                       "Configuring switch tables using cached routing\n");
+               osm_ucast_cache_apply(p_mgr->p_cache);

-       if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) {
-               /* If configured routing algorithm failed, use default MinHop */
-               osm_ucast_mgr_build_lid_matrices(p_mgr);
-               ucast_mgr_build_lfts(p_mgr);
-               p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP;
-       }
+       } else {
+
+               if (ucast_mgr_setup_all_switches(p_mgr->p_subn) < 0)
+                       goto Exit;

-       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));
+               while (p_routing_eng) {
+                       if (!ucast_mgr_route(p_routing_eng, p_osm))
+                               break;
+                       p_routing_eng = p_routing_eng->next;
+               }
+
+               if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) 
{
+                       /* If configured routing algorithm failed, use default 
MinHop */
+                       osm_ucast_mgr_build_lid_matrices(p_mgr);
+                       ucast_mgr_build_lfts(p_mgr);
+                       p_osm->routing_engine_used = 
OSM_ROUTING_ENGINE_TYPE_MINHOP;
+               }
+
+               if (p_mgr->p_subn->opt.use_ucast_cache)
+                       osm_ucast_cache_mark_valid(p_mgr->p_cache);
+       }

 Exit:
        CL_PLOCK_RELEASE(p_mgr->p_lock);
-- 
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