[ofa-general] Re: RDMA/iwarp CM question

Steve Wise swise at opengridcomputing.com
Wed Sep 12 13:08:43 PDT 2007


>>>            
>> It looks to me like ucma_clean_events() calls
>> rdma_destroy_id() / 
>> iw_destroy_cm_id() / destroy_cm_id() which calls the
>> provider reject 
>> function.  Or NOT! :)  There's a comment in the
>> IW_CM_STATE_CONN_RECV 
>> case inside destroy_cm_id():
>>
>>>                 /*
>>>                  * App called destroy
>> before/without calling accept after
>>>                  * receiving connection request
>> event notification or
>>>                  * returned non zero from the
>> event callback function.
>>>                  * In either case, must tell the
>> provider to reject.
>>>                  */
>> But I don't see the call to reject the connection...
>>
>> Maybe you could add it and see if it clears up your
>> issue?
> 
> I haven't hit a problem yet, I am looking at what my
> driver should/should not do ...
> 
>>
>>> Doesn't this sound like a problem (namely
>>> provider/card resource leak due to races with
>> listener
>>> destruct)?
>>>         
>> It does.
>>
>> But MPA mandates a timeout so the connections will
>> get aborted 
>> eventually by the provider or peer...
>>
> 
> I believe the timeout you are talking about applies to
> limiting how long it takes (on responder side) from an
> incoming SYN to receipt of complete MPA request. I
> don't believe there is much logic in having a timeout
> between the incoming-connect upcall send by the driver
> and an eventual accept/reject done by the app, but
> thats a seperate discussion.
>

My point is the peer will abort the TCP connection if the passive side 
never accepts or rejects.


> The core problem is this though. On a listener
> destruct, the driver can either do:
> 
> a. destroy all children on which an accept/reject has
> not yet been invoked, and OFA stack then must stop app
> from sending an accept/reject down in such case. There
> is currently an attempt to do this at the ucma layer
> (eg cleanup unpolled events), but it is not race free.
> 

This code is only cleaning up cm_id's that have _not_ been reaped by the 
application via get_rdma_cm_event().  Any connection requests that have 
been reaped will stay around until the application disposes of them via 
rdma_accept(), rdma_reject(), rdma_destroy_id(), or when the process exists.


> b. OFA guarantees than an eventual accept/reject
> downcall will be made, and driver can rely on that to
> prevent resource leakage.
>

Yes I think the rdma core must guarantee an eventual accept/reject downcall.


> Any other solution will have some problem somewhere.
> EG, in your timeout suggestion, if the driver goes
> ahead and cleans up the state on on-card resource for
> the child, due to the race mentioned in a) above, the
> app might succeed in making an eventual accept/reject,
> leading to a kernel crash.
> 
> 
>> But I think you've found a bug...
>>
>> Steve.
>>
> 
> Are folks filing bugs in bugzilla or similar? 
> 

You can if you want.  There is a bugzilla db on the ofa site...

Or provide the fix and test it. That would be ideal...


Steve.



More information about the general mailing list