Hi Sasha,

Some modifications in qos policy as a step toward
supporting MultiPathRecord:
 - Added subnet object to the qos policy struct to remove
   dependency on osm_pr_rcv_t (and later on osm_mpr_rcv_t).
 - osm_qos_policy_get_qos_level_by_pr() turned into a wrapper fuction
   that gets path record and extracts the relevant parameters.

-- Yevgeny

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

diff --git a/opensm/include/opensm/osm_qos_policy.h 
b/opensm/include/opensm/osm_qos_policy.h
index a7a9cd2..11598be 100644
--- a/opensm/include/opensm/osm_qos_policy.h
+++ b/opensm/include/opensm/osm_qos_policy.h
@@ -141,6 +141,7 @@ typedef struct _osm_qos_policy_t {
        cl_list_t qos_levels;                   /* list of osm_qos_level_t */
        cl_list_t qos_match_rules;              /* list of osm_qos_match_rule_t 
*/
        osm_qos_level_t *p_default_qos_level;   /* default QoS level */
+       osm_subn_t *p_subn;                     /* osm subnet object */
 } osm_qos_policy_t;

 /***************************************************/
@@ -167,17 +168,16 @@ ib_net16_t osm_qos_level_get_shared_pkey(IN const 
osm_qos_level_t * p_qos_level,
 osm_qos_match_rule_t * osm_qos_policy_match_rule_create();
 void osm_qos_policy_match_rule_destroy(osm_qos_match_rule_t * p_match_rule);

-osm_qos_policy_t * osm_qos_policy_create();
+osm_qos_policy_t * osm_qos_policy_create(osm_subn_t * p_subn);
 void osm_qos_policy_destroy(osm_qos_policy_t * p_qos_policy);
 int osm_qos_policy_validate(osm_qos_policy_t * p_qos_policy, osm_log_t * 
p_log);

-void osm_qos_policy_get_qos_level_by_pr(IN const osm_qos_policy_t * 
p_qos_policy,
-                                       IN const osm_pr_rcv_t * p_rcv,
-                                       IN const ib_path_rec_t * p_pr,
-                                       IN const osm_physp_t * p_src_physp,
-                                       IN const osm_physp_t * p_dest_physp,
-                                       IN ib_net64_t comp_mask,
-                                       OUT osm_qos_level_t ** pp_qos_level);
+osm_qos_level_t * osm_qos_policy_get_qos_level_by_pr(
+       IN const osm_qos_policy_t * p_qos_policy,
+       IN const ib_path_rec_t * p_pr,
+       IN const osm_physp_t * p_src_physp,
+       IN const osm_physp_t * p_dest_physp,
+       IN ib_net64_t comp_mask);

 /***************************************************/

diff --git a/opensm/opensm/osm_qos_parser.y b/opensm/opensm/osm_qos_parser.y
index 876448b..a477084 100644
--- a/opensm/opensm/osm_qos_parser.y
+++ b/opensm/opensm/osm_qos_parser.y
@@ -1752,7 +1752,7 @@ int osm_qos_parse_policy_file(IN osm_subn_t * const 
p_subn)
     column_num = 1;
     line_num = 1;

-    p_subn->p_qos_policy = osm_qos_policy_create();
+    p_subn->p_qos_policy = osm_qos_policy_create(p_subn);

     __parser_tmp_struct_init();
     p_qos_policy = p_subn->p_qos_policy;
diff --git a/opensm/opensm/osm_qos_policy.c b/opensm/opensm/osm_qos_policy.c
index 059a861..4ac0e35 100644
--- a/opensm/opensm/osm_qos_policy.c
+++ b/opensm/opensm/osm_qos_policy.c
@@ -53,6 +53,7 @@
 #include <opensm/osm_node.h>
 #include <opensm/osm_port.h>
 #include <opensm/osm_partition.h>
+#include <opensm/osm_opensm.h>
 #include <opensm/osm_qos_policy.h>

 /***************************************************
@@ -380,7 +381,7 @@ void osm_qos_policy_match_rule_destroy(osm_qos_match_rule_t 
* p)
 /***************************************************
  ***************************************************/

-osm_qos_policy_t * osm_qos_policy_create()
+osm_qos_policy_t * osm_qos_policy_create(osm_subn_t * p_subn)
 {
        osm_qos_policy_t * p_qos_policy = (osm_qos_policy_t 
*)malloc(sizeof(osm_qos_policy_t));
        if (!p_qos_policy)
@@ -403,6 +404,7 @@ osm_qos_policy_t * osm_qos_policy_create()
        cl_list_construct(&p_qos_policy->qos_match_rules);
        cl_list_init(&p_qos_policy->qos_match_rules, 10);

+       p_qos_policy->p_subn = p_subn;
        return p_qos_policy;
 }

@@ -542,7 +544,7 @@ __qos_policy_is_port_in_group(osm_subn_t * p_subn,
  ***************************************************/

 static boolean_t
-__qos_policy_is_port_in_group_list(const osm_pr_rcv_t * p_rcv,
+__qos_policy_is_port_in_group_list(const osm_qos_policy_t * p_qos_policy,
                                   const osm_physp_t * p_physp,
                                   cl_list_t * p_port_group_list)
 {
@@ -555,7 +557,7 @@ __qos_policy_is_port_in_group_list(const osm_pr_rcv_t * 
p_rcv,
                    (osm_qos_port_group_t *) cl_list_obj(list_iterator);
                if (p_port_group) {
                        if (__qos_policy_is_port_in_group
-                           (p_rcv->p_subn, p_physp, p_port_group))
+                           (p_qos_policy->p_subn, p_physp, p_port_group))
                                return TRUE;
                }
                list_iterator = cl_list_next(list_iterator);
@@ -566,10 +568,11 @@ __qos_policy_is_port_in_group_list(const osm_pr_rcv_t * 
p_rcv,
 /***************************************************
  ***************************************************/

-static osm_qos_match_rule_t *__qos_policy_get_match_rule_by_pr(
+static osm_qos_match_rule_t *__qos_policy_get_match_rule_by_params(
                         const osm_qos_policy_t * p_qos_policy,
-                        const osm_pr_rcv_t * p_rcv,
-                        const ib_path_rec_t * p_pr,
+                        uint64_t service_id,
+                        uint16_t qos_class,
+                        uint16_t pkey,
                         const osm_physp_t * p_src_physp,
                         const osm_physp_t * p_dest_physp,
                         ib_net64_t comp_mask)
@@ -594,7 +597,7 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
                /* If a match rule has Source groups, PR request source has to 
be in this list */

                if (cl_list_count(&p_qos_match_rule->source_group_list)) {
-                       if (!__qos_policy_is_port_in_group_list(p_rcv,
+                       if (!__qos_policy_is_port_in_group_list(p_qos_policy,
                                                                p_src_physp,
                                                                
&p_qos_match_rule->
                                                                
source_group_list))
@@ -607,7 +610,7 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
                /* If a match rule has Destination groups, PR request dest. has 
to be in this list */

                if (cl_list_count(&p_qos_match_rule->destination_group_list)) {
-                       if (!__qos_policy_is_port_in_group_list(p_rcv,
+                       if (!__qos_policy_is_port_in_group_list(p_qos_policy,
                                                                p_dest_physp,
                                                                
&p_qos_match_rule->
                                                                
destination_group_list))
@@ -629,7 +632,7 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
                        if (!__is_num_in_range_arr
                            (p_qos_match_rule->qos_class_range_arr,
                             p_qos_match_rule->qos_class_range_len,
-                            ib_path_rec_qos_class(p_pr))) {
+                            qos_class)) {
                                list_iterator = cl_list_next(list_iterator);
                                continue;
                        }
@@ -649,7 +652,7 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
                        if (!__is_num_in_range_arr
                            (p_qos_match_rule->service_id_range_arr,
                             p_qos_match_rule->service_id_range_len,
-                            cl_ntoh64(p_pr->service_id))) {
+                            service_id)) {
                                list_iterator = cl_list_next(list_iterator);
                                continue;
                        }
@@ -668,7 +671,7 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
                        if (!__is_num_in_range_arr
                            (p_qos_match_rule->pkey_range_arr,
                             p_qos_match_rule->pkey_range_len,
-                            cl_ntoh16(p_pr->pkey))) {
+                            pkey)) {
                                list_iterator = cl_list_next(list_iterator);
                                continue;
                        }
@@ -688,8 +691,9 @@ static osm_qos_match_rule_t 
*__qos_policy_get_match_rule_by_pr(
 /***************************************************
  ***************************************************/

-static osm_qos_level_t *__qos_policy_get_qos_level_by_name(osm_qos_policy_t * 
p_qos_policy,
-                                                          char *name)
+static osm_qos_level_t *__qos_policy_get_qos_level_by_name(
+               const osm_qos_policy_t * p_qos_policy,
+               char *name)
 {
        osm_qos_level_t *p_qos_level = NULL;
        cl_list_iterator_t list_iterator;
@@ -713,8 +717,9 @@ static osm_qos_level_t 
*__qos_policy_get_qos_level_by_name(osm_qos_policy_t * p_
 /***************************************************
  ***************************************************/

-static osm_qos_port_group_t 
*__qos_policy_get_port_group_by_name(osm_qos_policy_t * p_qos_policy,
-                                                                const char 
*const name)
+static osm_qos_port_group_t *__qos_policy_get_port_group_by_name(
+               const osm_qos_policy_t * p_qos_policy,
+               const char *const name)
 {
        osm_qos_port_group_t *p_port_group = NULL;
        cl_list_iterator_t list_iterator;
@@ -869,54 +874,66 @@ int osm_qos_policy_validate(osm_qos_policy_t * 
p_qos_policy,
 /***************************************************
  ***************************************************/

-void osm_qos_policy_get_qos_level_by_pr(IN const osm_qos_policy_t * 
p_qos_policy,
-                                       IN const osm_pr_rcv_t * p_rcv,
-                                       IN const ib_path_rec_t * p_pr,
-                                       IN const osm_physp_t * p_src_physp,
-                                       IN const osm_physp_t * p_dest_physp,
-                                       IN ib_net64_t comp_mask,
-                                       OUT osm_qos_level_t ** pp_qos_level)
+static osm_qos_level_t * __qos_policy_get_qos_level_by_params(
+       IN const osm_qos_policy_t * p_qos_policy,
+       IN const osm_physp_t * p_src_physp,
+       IN const osm_physp_t * p_dest_physp,
+       IN uint64_t service_id,
+       IN uint16_t qos_class,
+       IN uint16_t pkey,
+       IN ib_net64_t comp_mask)
 {
        osm_qos_match_rule_t *p_qos_match_rule = NULL;
        osm_qos_level_t *p_qos_level = NULL;

-       OSM_LOG_ENTER(p_rcv->p_log, osm_qos_policy_get_qos_level_by_pr);
-
-       *pp_qos_level = NULL;
+       OSM_LOG_ENTER(&p_qos_policy->p_subn->p_osm->log,
+                     __qos_policy_get_qos_level_by_params);

        if (!p_qos_policy)
                goto Exit;

-       p_qos_match_rule = __qos_policy_get_match_rule_by_pr(p_qos_policy,
-                                                            p_rcv,
-                                                            p_pr,
-                                                            p_src_physp,
-                                                            p_dest_physp,
-                                                            comp_mask);
+       p_qos_match_rule = __qos_policy_get_match_rule_by_params(
+               p_qos_policy, service_id, qos_class, pkey,
+               p_src_physp, p_dest_physp, comp_mask);

        if (p_qos_match_rule)
                p_qos_level = p_qos_match_rule->p_qos_level;
        else
                p_qos_level = p_qos_policy->p_default_qos_level;

-       osm_log(p_rcv->p_log, OSM_LOG_DEBUG,
-               "osm_qos_policy_get_qos_level_by_pr: "
+       osm_log(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_DEBUG,
+               "__qos_policy_get_qos_level_by_params: "
                "PathRecord request:"
                "Src port 0x%016" PRIx64 ", "
                "Dst port 0x%016" PRIx64 "\n",
                cl_ntoh64(osm_physp_get_port_guid(p_src_physp)),
                cl_ntoh64(osm_physp_get_port_guid(p_dest_physp)));
-       osm_log(p_rcv->p_log, OSM_LOG_DEBUG,
-               "osm_qos_policy_get_qos_level_by_pr: "
+       osm_log(&p_qos_policy->p_subn->p_osm->log, OSM_LOG_DEBUG,
+               "__qos_policy_get_qos_level_by_params: "
                "Applying QoS Level %s (%s)\n",
                p_qos_level->name,
                (p_qos_level->use) ? p_qos_level->use : "no description");

-       *pp_qos_level = p_qos_level;
-
       Exit:
-       OSM_LOG_EXIT(p_rcv->p_log);
-}                              /* osm_qos_policy_get_qos_level_by_pr() */
+       OSM_LOG_EXIT(&p_qos_policy->p_subn->p_osm->log);
+       return p_qos_level;
+}                              /* __qos_policy_get_qos_level_by_params() */
+
+/***************************************************
+ ***************************************************/
+
+osm_qos_level_t * osm_qos_policy_get_qos_level_by_pr(
+       IN const osm_qos_policy_t * p_qos_policy,
+       IN const ib_path_rec_t * p_pr,
+       IN const osm_physp_t * p_src_physp,
+       IN const osm_physp_t * p_dest_physp,
+       IN ib_net64_t comp_mask)
+{
+       return __qos_policy_get_qos_level_by_params(
+               p_qos_policy, p_src_physp, p_dest_physp,
+               cl_ntoh64(p_pr->service_id), ib_path_rec_qos_class(p_pr),
+               cl_ntoh16(p_pr->pkey), comp_mask);
+}

 /***************************************************
  ***************************************************/
-- 
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