Hi Yevgeny, Small comment is below.
On 21:22 Mon 17 Sep , Yevgeny Kliteynik wrote: > QoS policy optimization: replacing partition list and guid > ranges in a port group by port map indexed by port guid. > The port map is filled at parse time, thus checking whether > some port belongs to a group becomes a single map query. > > Signed-off-by: Yevgeny Kliteynik <[EMAIL PROTECTED]> > --- > opensm/include/opensm/osm_qos_policy.h | 11 ++- > opensm/opensm/osm_qos_parser.y | 115 ++++++++++++++++++++++++++----- > opensm/opensm/osm_qos_policy.c | 59 ++++++++--------- > 3 files changed, 131 insertions(+), 54 deletions(-) > > diff --git a/opensm/include/opensm/osm_qos_policy.h > b/opensm/include/opensm/osm_qos_policy.h > index 0c220ee..680bf71 100644 > --- a/opensm/include/opensm/osm_qos_policy.h > +++ b/opensm/include/opensm/osm_qos_policy.h > @@ -50,6 +50,7 @@ > #include <iba/ib_types.h> > #include <complib/cl_list.h> > #include <opensm/osm_port.h> > +#include <opensm/osm_partition.h> > #include <opensm/osm_sa_path_record.h> > #include <opensm/osm_sa_multipath_record.h> > > @@ -59,17 +60,20 @@ > > /***************************************************/ > > +typedef struct _osm_qos_port_t { > + cl_map_item_t map_item; > + osm_physp_t * p_physp; > +} osm_qos_port_t; > + > 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 (.../.../...) */ > - uint64_t **guid_range_arr; /* array of guid ranges (pair of 64-bit > guids) */ > - unsigned guid_range_len; /* num of guid ranges in the array */ > - cl_list_t partition_list; /* list of partition names */ > boolean_t node_type_ca; > boolean_t node_type_switch; > boolean_t node_type_router; > boolean_t node_type_self; > + cl_qmap_t port_map; > } osm_qos_port_group_t; > > /***************************************************/ > @@ -147,6 +151,7 @@ typedef struct _osm_qos_policy_t { > > /***************************************************/ > > +osm_qos_port_t *osm_qos_policy_port_create(osm_physp_t * p_physp); > osm_qos_port_group_t * osm_qos_policy_port_group_create(); > void osm_qos_policy_port_group_destroy(osm_qos_port_group_t * p_port_group); > > diff --git a/opensm/opensm/osm_qos_parser.y b/opensm/opensm/osm_qos_parser.y > index a477084..ca77536 100644 > --- a/opensm/opensm/osm_qos_parser.y > +++ b/opensm/opensm/osm_qos_parser.y > @@ -103,6 +103,19 @@ static void __merge_rangearr( > uint64_t ** * p_arr, > unsigned * p_arr_len ); > > +static void __parser_add_port_to_port_map( > + cl_qmap_t * p_map, > + osm_physp_t * p_physp); > + > +static void __parser_add_range_to_port_map( > + cl_qmap_t * p_map, > + uint64_t ** range_arr, > + unsigned range_len); > + > +static void __parser_add_map_to_port_map( > + cl_qmap_t * p_dmap, > + cl_map_t * p_smap); > + > extern char * __qos_parser_text; > extern void __qos_parser_error (char *s); > extern int __qos_parser_lex (void); > @@ -612,24 +625,9 @@ port_group_port_guid: port_group_port_guid_start > list_of_ranges { > &range_arr, > &range_len ); > > - if ( !p_current_port_group->guid_range_len ) > - { > - p_current_port_group->guid_range_arr = > range_arr; > - p_current_port_group->guid_range_len = > range_len; > - } > - else > - { > - uint64_t ** new_range_arr; > - unsigned new_range_len; > - __merge_rangearr( > p_current_port_group->guid_range_arr, > - > p_current_port_group->guid_range_len, > - range_arr, > - range_len, > - &new_range_arr, > - &new_range_len ); > - p_current_port_group->guid_range_arr = > new_range_arr; > - p_current_port_group->guid_range_len = > new_range_len; > - } > + > __parser_add_range_to_port_map(&p_current_port_group->port_map, > + range_arr, > + range_len); > } > } > ; > @@ -643,13 +641,26 @@ port_group_partition: port_group_partition_start > string_list { > /* 'partition' in 'port-group' - any num of > instances */ > cl_list_iterator_t list_iterator; > char * tmp_str; > + osm_prtn_t * p_prtn; > > + /* extract all the ports from the partition > + to the port map of this port group */ > list_iterator = > cl_list_head(&tmp_parser_struct.str_list); > while( list_iterator != > cl_list_end(&tmp_parser_struct.str_list) ) > { > tmp_str = (char*)cl_list_obj(list_iterator); > if (tmp_str) > - > cl_list_insert_tail(&p_current_port_group->partition_list,tmp_str); > + { > + p_prtn = > osm_prtn_find_by_name(p_qos_policy->p_subn, tmp_str); > + if (p_prtn) > + { > + > __parser_add_map_to_port_map(&p_current_port_group->port_map, > + > &p_prtn->part_guid_tbl); > + > __parser_add_map_to_port_map(&p_current_port_group->port_map, > + > &p_prtn->full_guid_tbl); > + } > + free(tmp_str); > + } > list_iterator = cl_list_next(list_iterator); > } > cl_list_remove_all(&tmp_parser_struct.str_list); > @@ -2185,3 +2196,69 @@ static void __merge_rangearr( > > /*************************************************** > ***************************************************/ > + > +static void __parser_add_port_to_port_map( > + cl_qmap_t * p_map, > + osm_physp_t * p_physp) > +{ > + if (p_physp && osm_physp_is_valid(p_physp) && > + cl_qmap_get(p_map, cl_ntoh64( > + osm_physp_get_port_guid(p_physp))) == cl_qmap_end(p_map)) > + { > + osm_qos_port_t * p_port = osm_qos_policy_port_create(p_physp); Here mem allocation can fail and p_port will be NULL. Don't need to resubmit the patch for this, just send subsequent patch. Sasha > + cl_qmap_insert(p_map, > + cl_ntoh64(osm_physp_get_port_guid(p_physp)), > + &p_port->map_item); > + } > +} > + > +/*************************************************** > + ***************************************************/ > + > +static void __parser_add_range_to_port_map( > + cl_qmap_t * p_map, > + uint64_t ** range_arr, > + unsigned range_len) > +{ > + unsigned i; > + uint64_t guid_ho; > + osm_port_t * p_osm_port; > + > + if (!range_arr || !range_len) > + return; > + > + for (i = 0; i < range_len; i++) { > + for (guid_ho = range_arr[i][0]; guid_ho <= range_arr[i][1]; > guid_ho++) { > + p_osm_port = > + osm_get_port_by_guid(p_qos_policy->p_subn, > cl_hton64(guid_ho)); > + if (p_osm_port) > + __parser_add_port_to_port_map(p_map, p_osm_port->p_physp); > + } > + free(range_arr[i]); > + } > + free(range_arr); > +} > + > +/*************************************************** > + ***************************************************/ > + > +static void __parser_add_map_to_port_map( > + cl_qmap_t * p_dmap, > + cl_map_t * p_smap) > +{ > + cl_map_iterator_t map_iterator; > + osm_physp_t * p_physp; > + > + if (!p_dmap || !p_smap) > + return; > + > + map_iterator = cl_map_head(p_smap); > + while (map_iterator != cl_map_end(p_smap)) { > + p_physp = (osm_physp_t*)cl_map_obj(map_iterator); > + __parser_add_port_to_port_map(p_dmap, p_physp); > + map_iterator = cl_map_next(map_iterator); > + } > +} > + > +/*************************************************** > + ***************************************************/ > diff --git a/opensm/opensm/osm_qos_policy.c b/opensm/opensm/osm_qos_policy.c > index b2d1622..d1b227f 100644 > --- a/opensm/opensm/osm_qos_policy.c > +++ b/opensm/opensm/osm_qos_policy.c > @@ -101,6 +101,27 @@ static void __free_single_element(void *p_element, void > *context) > free(p_element); > } > > +static void __free_port_map_element(cl_map_item_t *p_element, void *context) > +{ > + if (p_element) > + free(p_element); > +} > + > +/*************************************************** > + ***************************************************/ > + > +osm_qos_port_t *osm_qos_policy_port_create(osm_physp_t *p_physp) > +{ > + osm_qos_port_t *p = > + (osm_qos_port_t *) malloc(sizeof(osm_qos_port_t)); > + if (!p) > + return NULL; > + memset(p, 0, sizeof(osm_qos_port_t)); > + > + p->p_physp = p_physp; > + return p; > +} > + > /*************************************************** > ***************************************************/ > > @@ -114,7 +135,7 @@ osm_qos_port_group_t *osm_qos_policy_port_group_create() > memset(p, 0, sizeof(osm_qos_port_group_t)); > > cl_list_init(&p->port_name_list, 10); > - cl_list_init(&p->partition_list, 10); > + cl_qmap_init(&p->port_map); > > return p; > } > @@ -124,8 +145,6 @@ osm_qos_port_group_t *osm_qos_policy_port_group_create() > > void osm_qos_policy_port_group_destroy(osm_qos_port_group_t * p) > { > - unsigned i; > - > if (!p) > return; > > @@ -134,18 +153,12 @@ void > osm_qos_policy_port_group_destroy(osm_qos_port_group_t * p) > if (p->use) > free(p->use); > > - for (i = 0; i < p->guid_range_len; i++) > - free(p->guid_range_arr[i]); > - if (p->guid_range_arr) > - free(p->guid_range_arr); > - > cl_list_apply_func(&p->port_name_list, __free_single_element, NULL); > cl_list_remove_all(&p->port_name_list); > cl_list_destroy(&p->port_name_list); > > - cl_list_apply_func(&p->partition_list, __free_single_element, NULL); > - cl_list_remove_all(&p->partition_list); > - cl_list_destroy(&p->partition_list); > + cl_qmap_apply_func(&p->port_map, __free_port_map_element, NULL); > + cl_qmap_remove_all(&p->port_map); > > free(p); > } > @@ -491,12 +504,9 @@ __qos_policy_is_port_in_group(osm_subn_t * p_subn, > osm_qos_port_group_t * p_port_group) > { > osm_node_t *p_node = osm_physp_get_node_ptr(p_physp); > - osm_prtn_t *p_prtn = NULL; > 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); > - cl_list_iterator_t list_iterator; > - char *partition_name; > > /* check whether this port's type matches any of group's types */ > > @@ -506,27 +516,12 @@ __qos_policy_is_port_in_group(osm_subn_t * p_subn, > && p_port_group->node_type_router)) > return TRUE; > > - /* check whether this port's guid is in range of this group's guids */ > + /* check whether this port's guid is in group's port map */ > > - if (__is_num_in_range_arr(p_port_group->guid_range_arr, > - p_port_group->guid_range_len, port_guid_ho)) > + if (cl_qmap_get(&p_port_group->port_map, port_guid_ho) != > + cl_qmap_end(&p_port_group->port_map)) > return TRUE; > > - /* check whether this port is member of this group's partitions */ > - > - list_iterator = cl_list_head(&p_port_group->partition_list); > - while (list_iterator != cl_list_end(&p_port_group->partition_list)) { > - partition_name = (char *)cl_list_obj(list_iterator); > - if (partition_name && strlen(partition_name)) { > - p_prtn = osm_prtn_find_by_name(p_subn, partition_name); > - if (p_prtn) { > - if (osm_prtn_is_guid(p_prtn, port_guid)) > - return TRUE; > - } > - } > - list_iterator = cl_list_next(list_iterator); > - } > - > /* check whether this port's name matches any of group's names */ > > /* > -- > 1.5.1.4 > > _______________________________________________ general mailing list general@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general