[ofa-general] Re: [PATCH v2] opensm: support routing engine update

Eli Dorfman (Voltaire) dorfman.eli at gmail.com
Tue Mar 17 07:39:23 PDT 2009


Sasha Khapyorsky wrote:
> On 10:24 Mon 16 Mar     , Eli Dorfman (Voltaire) wrote:
> 
> <snip...>
>> diff --git a/opensm/include/opensm/osm_opensm.h b/opensm/include/opensm/osm_opensm.h
>> index c121be4..d297dd8 100644
>> --- a/opensm/include/opensm/osm_opensm.h
>> +++ b/opensm/include/opensm/osm_opensm.h
>> @@ -122,6 +122,8 @@ typedef enum _osm_routing_engine_type {
>>  struct osm_routing_engine {
>>  	const char *name;
>>  	void *context;
>> +	int initialized;
>> +	int (*setup) (void *re, void *p_osm);
> 
> In order to avoid ugly castings here you need to declare a real function
> prototype:
> 
> int (*)(struct osm_routing_engine *, struct osm_opensm *);
> 
> For this you probably should put type forward declarations above those
> lines:
> 
> struct osm_routing_engine;
> struct osm_opensm;
> 
>>  	int (*build_lid_matrices) (void *context);
>>  	int (*ucast_build_fwd_tables) (void *context);
>>  	void (*ucast_dump_tables) (void *context);
>> @@ -183,6 +185,7 @@ typedef struct osm_opensm {
>>  	cl_dispatcher_t disp;
>>  	cl_plock_t lock;
>>  	struct osm_routing_engine *routing_engine_list;
>> +	struct osm_routing_engine *last_routing_engine;
>>  	osm_routing_engine_type_t routing_engine_used;
>>  	osm_stats_t stats;
>>  	osm_console_t console;
>> @@ -523,5 +526,7 @@ extern volatile unsigned int osm_exit_flag;
>>  *  Set to one to cause all threads to leave
>>  *********/
>>  
>> +void osm_update_routing_engines(osm_opensm_t *osm, const char *engine_names);
>> +
>>  END_C_DECLS
>>  #endif				/* _OSM_OPENSM_H_ */
>> diff --git a/opensm/opensm/osm_opensm.c b/opensm/opensm/osm_opensm.c
>> index cfe6474..7126658 100644
>> --- a/opensm/opensm/osm_opensm.c
>> +++ b/opensm/opensm/osm_opensm.c
>> @@ -169,14 +169,7 @@ static void setup_routing_engine(osm_opensm_t *osm, const char *name)
>>  			memset(re, 0, sizeof(struct osm_routing_engine));
>>  
>>  			re->name = m->name;
>> -			if (m->setup(re, osm)) {
>> -				OSM_LOG(&osm->log, OSM_LOG_VERBOSE,
>> -					"setup of routing"
>> -					" engine \'%s\' failed\n", name);
>> -				return;
>> -			}
>> -			OSM_LOG(&osm->log, OSM_LOG_DEBUG,
>> -				"\'%s\' routing engine set up\n", re->name);
>> +			re->setup = (int (*)(void *, void *))m->setup;
>>  			append_routing_engine(osm, re);
>>  			return;
>>  		}
>> @@ -236,6 +229,55 @@ static void destroy_routing_engines(osm_opensm_t *osm)
>>  			r->delete(r->context);
>>  		free(r);
>>  	}
>> +	osm->routing_engine_list = NULL;
>> +}
>> +
>> +static void update_routing_engine(
>> +	struct osm_routing_engine *cur,
>> +	struct osm_routing_engine *last)
>> +{
>> +	cur->context = last->context;
>> +	cur->initialized = last->initialized;
>> +	cur->setup = last->setup;
>> +	cur->build_lid_matrices = last->build_lid_matrices;
>> +	cur->ucast_build_fwd_tables = last->ucast_build_fwd_tables;
>> +	cur->ucast_dump_tables = last->ucast_dump_tables;
>> +	cur->delete = last->delete;
>> +}
> 
> This is memcpy(), isn't it?

No since i don't want the next pointer.

> 
>> +
>> +void osm_update_routing_engines(osm_opensm_t *osm, const char *engine_names)
>> +{
>> +	struct osm_routing_engine *r, *l;
>> +
>> +	/* find used routing engine and save as last */
>> +	l = r = osm->routing_engine_list;
>> +	if (r && osm->routing_engine_used == osm_routing_engine_type(r->name)) {
>> +		osm->last_routing_engine = r;
>> +		osm->routing_engine_list = r->next;
>> +	}
>> +	else while ((r = r->next)) {
>> +		if (osm->routing_engine_used == 
>> +			osm_routing_engine_type(r->name)) {
>> +			osm->last_routing_engine = r;
>> +			l->next = r->next;
>> +			break;
>> +		}
>> +		l = r;
>> +	}
>> +	/* cleanup prev routing engine list and replace with current list */
>> +	destroy_routing_engines(osm);
>> +	setup_routing_engines(osm, engine_names);
>> +
>> +	/* check if last routing engine exist in new list and update callbacks */
>> +	r = osm->routing_engine_list;
>> +	while (r) {
>> +		if (osm->routing_engine_used == 
>> +			osm_routing_engine_type(r->name)) {
>> +			update_routing_engine(r, osm->last_routing_engine);
>> +			break;
>> +		}
>> +		r = r->next;
>> +	}
>>  }
>>  
>>  /**********************************************************************
>> diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
>> index fe0a446..abae978 100644
>> --- a/opensm/opensm/osm_ucast_mgr.c
>> +++ b/opensm/opensm/osm_ucast_mgr.c
>> @@ -970,8 +970,25 @@ int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr)
>>  
>>  	p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE;
>>  	while (p_routing_eng) {
>> +		if (!p_routing_eng->initialized && 
>> +			p_routing_eng->setup(p_routing_eng, p_osm)) {
>> +			OSM_LOG(p_mgr->p_log, OSM_LOG_ERROR,
>> +					"ERR 3A0F: setup of routing engine \'%s\' failed\n", 
>> +					p_routing_eng->name);
>> +			p_routing_eng = p_routing_eng->next;
>> +			continue;
>> +		}
>> +		OSM_LOG(p_mgr->p_log, OSM_LOG_INFO,
>> +			"\'%s\' routing engine set up\n", p_routing_eng->name);
>> +		p_routing_eng->initialized = 1;
>> +
>>  		if (!ucast_mgr_route(p_routing_eng, p_osm))
>>  			break;
>> +
>> +		/* delete unused routing engine */
>> +		if (p_routing_eng->delete)
>> +			p_routing_eng->delete(p_routing_eng->context);
>> +
> 
> Now it can be deleted twice - here and in destroy_routing_engines()?
> Also shouldn't you drop initialized flag?

yes, i should. the second patch fixes that.



More information about the general mailing list