[ofa-general] Re: [PATCH] opensm: Convert mgrp_mlid_tbl into array

Hal Rosenstock hrosenstock at xsigo.com
Tue Jun 24 16:02:12 PDT 2008


On Wed, 2008-06-25 at 01:36 +0300, Sasha Khapyorsky wrote:
> On 15:19 Tue 24 Jun     , Hal Rosenstock wrote:
> > > >  
> > > > +struct _osm_mgrp_mlid_tbl {
> > > > +	void *mgroup[IB_LID_MCAST_END_HO - IB_LID_MCAST_START_HO + 1];
> > > > +};
> > > > +
> > > 
> > > Why this wrapper struct is needed?
> > 
> > It's just for clarity (self documenting). Does it need to be removed ?
> 
> Yes, please - this makes the code less readable (I spent some time in
> attempts to understand why it was done so).

OK.

> > > Here you have p_mcm->mlid which is index of multicast group where this
> > > port is member + IB_LID_MCAST_START_HO. So you don't need to loop other
> > > all groups in the array. Actually there only one line require changing:
> > > 
> > > 	p_mgrp = sm->p_subn->mgrp_mlid_tbl.mgroup[p_mcm->mlid -
> > > 			IB_LID_MCAST_START_HO]
> > > 	if (p_mgrp) {
> > > 		osm_mgrp_remove_port(sm->p_subn, sm->p_log, p_mgrp,
> > > 				     p_port->guid);
> > > 		osm_mcm_info_delete((osm_mcm_info_t *) p_mcm);
> > > 	}
> > 
> > Yes, that's much better.
> 
> But check about possibly needed cl_ntoh16(p_mcm->mlid) - I don't remember
> how mcm stores mlid.

It's in net format so does need the conversion.

> > > Same function exists in osm_sa_mcmember_record.c. It is probably good
> > > time to consolidate it in something like osm_get_mgrp_by_mlid() (it
> > > could be placed in osm_subnet.c where another osm_get_*_by() hosted).
> > 
> > Sure; is it OK for that to be an incremental patch on top of this to
> > follow shortly ?
> 
> Yes, if it is simpler for you. I would make osm_get_mgrp_by_mlid() as
> separate patch even before to array converting, but it is really minor.

Sure; it could be done before, during, or after this patch. I do prefer
to do it after.

> > > > @@ -154,16 +149,20 @@ __get_new_mlid(IN osm_sa_t * sa, IN ib_net16_t requested_mlid)
> > > >  
> > > >  	if (requested_mlid && cl_ntoh16(requested_mlid) >= IB_LID_MCAST_START_HO
> > > >  	    && cl_ntoh16(requested_mlid) <= p_subn->max_multicast_lid_ho
> > > > -	    && cl_qmap_get(&p_subn->mgrp_mlid_tbl,
> > > > -			   requested_mlid) ==
> > > > -	    cl_qmap_end(&p_subn->mgrp_mlid_tbl)) {
> > > > +	    && !p_subn->mgrp_mlid_tbl.mgroup[cl_ntoh16(requested_mlid) - IB_LID_MCAST_START_HO]) { 
> > > >  		mlid = cl_ntoh16(requested_mlid);
> > > >  		goto Exit;
> > > >  	}
> > > >  
> > > >  	/* If MCGroups table is empty, first return the min mlid */
> > > > -	p_mgrp = (osm_mgrp_t *) cl_qmap_head(&p_subn->mgrp_mlid_tbl);
> > > > -	if (p_mgrp == (osm_mgrp_t *) cl_qmap_end(&p_subn->mgrp_mlid_tbl)) {
> > > > +	max_num_mlids = sa->p_subn->max_multicast_lid_ho -
> > > > +			IB_LID_MCAST_START_HO + 1;
> > > > +	for (idx = 0; idx < max_num_mlids; idx++) {
> > > > +		p_mgrp = sa->p_subn->mgrp_mlid_tbl.mgroup[idx];
> > > > +		if (p_mgrp)
> > > > +			break;
> > > > +	}
> > > > +	if (!p_mgrp) {
> > > >  		mlid = IB_LID_MCAST_START_HO;
> > > >  		OSM_LOG(sa->p_log, OSM_LOG_VERBOSE,
> > > >  			"No multicast groups found using minimal mlid:0x%04X\n",
> > > > @@ -171,9 +170,6 @@ __get_new_mlid(IN osm_sa_t * sa, IN ib_net16_t requested_mlid)
> > > >  		goto Exit;
> > > >  	}
> > > >  
> > > > -	max_num_mlids =
> > > > -	    sa->p_subn->max_multicast_lid_ho - IB_LID_MCAST_START_HO + 1;
> > > > -
> > > >  	/* track all used mlids in the array (by mlid index) */
> > > >  	used_mlids_array = (uint8_t *) malloc(sizeof(uint8_t) * max_num_mlids);
> > > >  	if (!used_mlids_array)
> > > > @@ -181,9 +177,10 @@ __get_new_mlid(IN osm_sa_t * sa, IN ib_net16_t requested_mlid)
> > > >  	memset(used_mlids_array, 0, sizeof(uint8_t) * max_num_mlids);
> > > >  
> > > >  	/* scan all available multicast groups in the DB and fill in the table */
> > > > -	while (p_mgrp != (osm_mgrp_t *) cl_qmap_end(&p_subn->mgrp_mlid_tbl)) {
> > > > +	for (idx = 0; idx < max_num_mlids; idx++) {
> > > > +		p_mgrp = sa->p_subn->mgrp_mlid_tbl.mgroup[idx];
> > > >  		/* ignore mgrps marked for deletion */
> > > > -		if (p_mgrp->to_be_deleted == FALSE) {
> > > > +		if (p_mgrp && p_mgrp->to_be_deleted == FALSE) {
> > > >  			OSM_LOG(sa->p_log, OSM_LOG_DEBUG,
> > > >  				"Found mgrp with lid:0x%X MGID: 0x%016" PRIx64
> > > >  				" : " "0x%016" PRIx64 "\n",
> > > > @@ -202,11 +199,9 @@ __get_new_mlid(IN osm_sa_t * sa, IN ib_net16_t requested_mlid)
> > > >  					cl_ntoh16(p_mgrp->mlid),
> > > >  					max_num_mlids + IB_LID_MCAST_START_HO);
> > > >  			} else {
> > > > -				used_mlids_array[cl_ntoh16(p_mgrp->mlid) -
> > > > -						 IB_LID_MCAST_START_HO] = 1;
> > > > +				used_mlids_array[idx] = 1;
> > > >  			}
> > > >  		}
> > > > -		p_mgrp = (osm_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
> > > >  	}
> > > >  
> > > >  	/* Find "mlid holes" in the mgrp table */
> > > 
> > > There were some dirty tricks when qmap was used and finally they did
> > > an additional mlid array (that with malloc()) for free mlid searching.
> > > But now you already have such array, what is the reason to copy this and
> > > to run additional loop?
> > 
> > It can be eliminated in an incremental patch. OK ?
> 
> I would prefer to have this improved in v2 of the patch. This function
> was never ideal, but now it looks (and works) really bad.

It's no worse than it was; can't it wait a little ?

-- Hal

> Sasha
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
> 
> To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general




More information about the general mailing list