QoS policy optimization: replaced node types with
single bitmask, and node_type_self is implemented
as an additional guid in group's port map.

Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]>
---
 opensm/include/opensm/osm_qos_policy.h |    9 +++++----
 opensm/opensm/osm_qos_parser.y         |   24 +++++++++++++++++-------
 opensm/opensm/osm_qos_policy.c         |    7 ++-----
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/opensm/include/opensm/osm_qos_policy.h 
b/opensm/include/opensm/osm_qos_policy.h
index 680bf71..30c2e6d 100644
--- a/opensm/include/opensm/osm_qos_policy.h
+++ b/opensm/include/opensm/osm_qos_policy.h
@@ -58,6 +58,10 @@
 #define OSM_QOS_POLICY_MAX_PORTS_ON_SWITCH  128
 #define OSM_QOS_POLICY_DEFAULT_LEVEL_NAME   "default"

+#define OSM_QOS_POLICY_NODE_TYPE_CA        (((uint8_t)1)<<IB_NODE_TYPE_CA)
+#define OSM_QOS_POLICY_NODE_TYPE_SWITCH    (((uint8_t)1)<<IB_NODE_TYPE_SWITCH)
+#define OSM_QOS_POLICY_NODE_TYPE_ROUTER    (((uint8_t)1)<<IB_NODE_TYPE_ROUTER)
+
 /***************************************************/

 typedef struct _osm_qos_port_t {
@@ -69,10 +73,7 @@ typedef struct _osm_qos_port_group_t {
        char *name;                     /* single string (this port group name) 
*/
        char *use;                      /* single string (description) */
        cl_list_t port_name_list;       /* list of port names (.../.../...) */
-       boolean_t node_type_ca;
-       boolean_t node_type_switch;
-       boolean_t node_type_router;
-       boolean_t node_type_self;
+       uint8_t node_types;             /* node types bitmask */
        cl_qmap_t port_map;
 } osm_qos_port_group_t;

diff --git a/opensm/opensm/osm_qos_parser.y b/opensm/opensm/osm_qos_parser.y
index ca77536..13baab5 100644
--- a/opensm/opensm/osm_qos_parser.y
+++ b/opensm/opensm/osm_qos_parser.y
@@ -694,29 +694,39 @@ node_type_item:           node_type_ca
                         ;

 node_type_ca:           TK_NODE_TYPE_CA {
-                            p_current_port_group->node_type_ca = TRUE;;
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_CA;
                         }
                         ;

 node_type_switch:       TK_NODE_TYPE_SWITCH {
-                            p_current_port_group->node_type_switch = TRUE;
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_SWITCH;
                         }
                         ;

 node_type_router:       TK_NODE_TYPE_ROUTER {
-                            p_current_port_group->node_type_router = TRUE;
+                            p_current_port_group->node_types |=
+                               OSM_QOS_POLICY_NODE_TYPE_ROUTER;
                         }
                         ;

 node_type_all:          TK_NODE_TYPE_ALL {
-                            p_current_port_group->node_type_ca = TRUE;
-                            p_current_port_group->node_type_switch = TRUE;
-                            p_current_port_group->node_type_router = TRUE;
+                            p_current_port_group->node_types |=
+                               (OSM_QOS_POLICY_NODE_TYPE_CA |
+                                OSM_QOS_POLICY_NODE_TYPE_SWITCH |
+                                OSM_QOS_POLICY_NODE_TYPE_ROUTER);
                         }
                         ;

 node_type_self:         TK_NODE_TYPE_SELF {
-                            p_current_port_group->node_type_self = TRUE;
+                            osm_port_t * p_osm_port =
+                                osm_get_port_by_guid(p_qos_policy->p_subn,
+                                     p_qos_policy->p_subn->sm_port_guid);
+                            if (p_osm_port)
+                                __parser_add_port_to_port_map(
+                                   &p_current_port_group->port_map,
+                                   p_osm_port->p_physp);
                         }
                         ;

diff --git a/opensm/opensm/osm_qos_policy.c b/opensm/opensm/osm_qos_policy.c
index d1b227f..c84fb8b 100644
--- a/opensm/opensm/osm_qos_policy.c
+++ b/opensm/opensm/osm_qos_policy.c
@@ -506,14 +506,11 @@ __qos_policy_is_port_in_group(osm_subn_t * p_subn,
        osm_node_t *p_node = osm_physp_get_node_ptr(p_physp);
        ib_net64_t port_guid = osm_physp_get_port_guid(p_physp);
        uint64_t port_guid_ho = cl_ntoh64(port_guid);
-       uint8_t node_type = osm_node_get_type(p_node);

        /* check whether this port's type matches any of group's types */

-       if ((node_type == IB_NODE_TYPE_CA && p_port_group->node_type_ca) ||
-           (node_type == IB_NODE_TYPE_SWITCH && p_port_group->node_type_switch)
-           || (node_type == IB_NODE_TYPE_ROUTER
-               && p_port_group->node_type_router))
+       if ( p_port_group->node_types &
+            (((uint8_t)1)<<osm_node_get_type(p_node)) )
                return TRUE;

        /* check whether this port's guid is in group's port map */
-- 
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