[Openib-windows] A problem in ib_close_al

Leonid Keller leonid at mellanox.co.il
Tue Jul 25 01:47:32 PDT 2006


 

> -----Original Message-----
> From: ftillier.sst at gmail.com [mailto:ftillier.sst at gmail.com] 
> On Behalf Of Fabian Tillier
> Sent: Tuesday, July 25, 2006 1:41 AM
> To: Leonid Keller
> Cc: openib-windows at openib.org
> Subject: Re: [Openib-windows] A problem in ib_close_al
> 
> Hi Leo,
> 
> On 7/23/06, Leonid Keller <leonid at mellanox.co.il> wrote:
> > Hi Fab,
> > Seems like I found the reason of the stuck on shutdown.
> > Find attached 2 patches for problems, which I come across on during 
> > investigating of this case.
> > Here are short description.
> > 1. (a bug responsible for the stuck)
> >        If a send MAD times out, it sends once more, so one 
> can get 2 
> > responds for it.
> >        __process_recv_resp() stores the second respond on place of 
> > they first one (h_send->p_resp_mad)
> >        and the latter gets never released !
> > 2. there are 2 more places, that *seems* like "forget" to release 
> > response MADs - please, check me.
> > 3. synchronization problems - we have talked them already over. I 
> > suggest a variant of a fix.
> 
> I just checked in the special QP synchronization and MAD 
> tracking fixes in revisions 427 and 426, respectively.
> 
> I had missed the synchronization problem in the user-mode MAD pool.
> This has been checked in as revision 428.
> 
> > One more question:
> > Is it possible for internal send in __mad_svc_send_done to have a 
> > response on it ?
> 
> Internal MADs don't get responses - they are any non-data 
> RMPP MADs (RMPP ACK, ABORT, and STOP MADs.)  Only RMPP ACK 
> messages are sent in IBAL, but it handles receiving any ABORT 
> and STOP messages.
> 
> > If - yes, one needs to release it.
> >
> > I'll appreciate, if you can look these patches ASAP - we 
> need them for 
> > the release.
> 
> In the al_mad.patch:
> 
> > Index: al_mad.c
> > ===================================================================
> > --- al_mad.c	(revision 425)
> > +++ al_mad.c	(working copy)
> > @@ -1257,6 +1257,9 @@
> >  		AL_PRINT( TRACE_LEVEL_INFORMATION, 
> AL_DBG_MAD_SVC, ("canceling MAD\n") );
> >  		h_send = PARENT_STRUCT( p_list_item, 
> al_mad_send_t, pool_item );
> >  		h_send->canceled = TRUE;
> > +		/* __check_send_queue() skips MADs with 
> 'retry_time=MAX_TIME'
> > +		before it checks 'canceled' field, so part of 
> the request will be skipped */
> > +		h_send->retry_time = 0;
> >  	}
> >  	cl_spinlock_release( &h_mad_svc->obj.lock );
> 
> You can't set retry_time to zero here - the MAD will be 
> referenced in the send completion callback.  If retry_time is 
> MAX_TIME, it means the send is posted on the QP, but hasn't 
> yet completed.  It should just be flagged as cancelled.  The 
> send completion will finish processing it.

I hope, it will also release the corresponding MAD responses.
> 
> > @@ -2260,8 +2264,14 @@
> >  		/* The send is currently active.  Do not report it. */
> >  		AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_MAD_SVC,
> >  			("resp send active TID:0x%I64x\n", 
> p_mad_hdr->trans_id) );
> > +		p_resp_mad = h_send->p_resp_mad;
> >  		h_send->p_resp_mad = p_mad_element;
> >  		cl_spinlock_release( &h_mad_svc->obj.lock );
> > +		if (p_resp_mad)
> > +		{
> > +			/* we got a second response to that 
> send --> drop the first one */
> > +			ib_put_mad( p_resp_mad );
> > +		}
> >  	}
> >  	else
> >  	{
> 
> You can put the MAD back into its pool while holding the MAD 
> service lock. Did you actually see this happen, where a 
> duplicate response was received?

YES, that was the REAL cause of the stuck on shutdown and this fix has
solved it.

> 
> > @@ -2273,6 +2283,12 @@
> >  			(cl_list_item_t*)&h_send->pool_item );
> >  		cl_spinlock_release( &h_mad_svc->obj.lock );
> >
> > +		if (h_send->p_resp_mad)
> > +		{
> > +			/* we got a second response to that 
> send --> drop the first one */
> > +			ib_put_mad( h_send->p_resp_mad );
> > +		}
> > +
> >  		/* Report the receive. */
> >  		h_mad_svc->pfn_user_recv_cb( h_mad_svc, 
> (void*)h_mad_svc->obj.context,
> >  			p_mad_element );
> 
> If the send is complete, it is removed from the list and a 
> duplicate response will not find it in the send list (see the 
> call to __mad_svc_match_recv earlier in that function).
> 

I didn't see the duplicate responses here, so if you absolutely sure,
that it can't happen, one can skip the fix here.

> > @@ -3092,9 +3108,7 @@
> >  	{
> >  		h_send = PARENT_STRUCT( p_list_item, 
> al_mad_send_t, pool_item );
> >
> > -		h_mad_svc->pfn_user_send_cb( h_mad_svc, 
> (void*)h_mad_svc->obj.context,
> > -			h_send->p_send_mad );
> > -		__cleanup_mad_send( h_mad_svc, h_send );
> > +		__notify_send_comp( h_mad_svc, h_send, 
> h_send->p_send_mad->status);
> >  		p_list_item = cl_qlist_remove_head( &timeout_list );
> >  	}
> >  	AL_EXIT( AL_DBG_MAD_SVC );
> 
> I don't understand what you were trying to do here.  If a MAD 
> times out, it cannot have a response associated with it, so 
> calling __notify_send_comp doesn't accomplish anything.  Am I 
> missing something?  Did you see a timeout where the response 
> mad was there?
> 
No, I didn't.
But this way the code is shorter and more understandable and it adds
only one 'if(p_send->p_resp_mad'.

> Thanks,
> 
> - Fab
> 

Thank you for the sync patches, already done.
You can decide upon other fixes, you question here, but we need the fix
to duplicate response handling, I really saw.
Thank you in advance.




More information about the ofw mailing list