[ofw] ibal library callback model
    Fab Tillier 
    ftillier at windows.microsoft.com
       
    Tue Apr  7 11:48:13 PDT 2009
    
    
  
> I'm trying to understand if a user can get simultaneous callbacks for
> the same CM connection.
No, the CM callbacks are serialized by CEP.  In ual_cm_cep.c, in the function cm_cb (line 1423), you can see the CEP callback being invoked before the next UAL_CEP_GET_EVENT IOCTL is issued.
> For example, I see the following call paths in ual_mgr.c:
>
> __cb_thread_routine() -> cm_cb() -> __cm_handler() ->
> __proc_conn() -> __proc_dreq()
>
> I end up with two threads in this same code path.  I wanted to verify
> that the same connection would not get simultaneous callbacks, and I
> wanted to confirm that blocking in the callback could lead to a
> deadlock, depending on what was being waited on.  In this case, blocking
> in a CM callback affects callbacks for CQs.
Two threads in that code path would have to be for different CEPs (unless there's a bug), the same connection will not get simultaneous callbacks.  Originally the kernel code would push events to UAL, and that required more serialization in user-mode.  Internally, the CEP manager works very much like WinVerbs/ND with an async IOCTL outstanding until the next CEP event.  The kernel does not push events to user-mode, user-mode must explicitly request events.  Since the event is just a notification event, the al_cm_qp.c code path ends up polling the CEP for the actual events.
If you end up blocking all the callback threads, you will potentially deadlock. This is another reason I dislike the callback model and prefer the 'thread less' model of ND/WinVerbs, as all blocking/deadlocking logic is in the client's domain and requires no special knowledge of how the provider is implemented.
-Fab
    
    
More information about the ofw
mailing list