Extract listen handling in cm_cep_handler into a separate
handler.  This will simplify changes to support queuing
connection requests and allow connection requests to move
to a fetch model, rather than a callback model.

Since connection requests require allocating new resources,
connection rates can be improved by queuing the requests
until the user has allocated the resources, then fetches
the request.

Signed-off-by: Sean Hefty <[email protected]>
---
This patch should go into WinoF 2.2 after committing to the trunk.


 trunk/core/al/kernel/al_cm.c |   48 +++++++++++++++++++++++++++++++-----------
 1 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/trunk/core/al/kernel/al_cm.c b/trunk/core/al/kernel/al_cm.c
index 955985a..177bb9e 100644
--- a/trunk/core/al/kernel/al_cm.c
+++ b/trunk/core/al/kernel/al_cm.c
@@ -77,28 +77,49 @@ cm_cep_handler(const ib_al_handle_t h_al, const net32_t cid)
        void                            *context;
        net32_t                         new_cid;
        ib_mad_element_t        *mad;
-       iba_cm_id                       *id, *listen_id;
+       iba_cm_id                       *id;
        iba_cm_event            event;
        NTSTATUS                        status;
 
        while (al_cep_poll(h_al, cid, &context, &new_cid, &mad) == IB_SUCCESS) {
 
-               if (new_cid == AL_INVALID_CID) {
-                       id = (iba_cm_id *) context;
-               } else {
-                       listen_id = (iba_cm_id *) context;
+               id = (iba_cm_id *) context;
+               kal_cep_format_event(h_al, id->cid, mad, &event);
+
+               status = id->callback(id, &event);
+               if (!NT_SUCCESS(status)) {
+                       kal_cep_config(h_al, new_cid, NULL, NULL, NULL);
+                       kal_cep_destroy(h_al, id->cid, status);
+                       cm_free_id(id);
+               }
+               ib_put_mad(mad);
+       }
+}
+
+static void
+cm_listen_handler(const ib_al_handle_t h_al, const net32_t cid)
+{
+       void                            *context;
+       net32_t                         new_cid;
+       ib_mad_element_t        *mad;
+       iba_cm_id                       *id, *listen_id;
+       iba_cm_event            event;
+       NTSTATUS                        status;
+
+       while (al_cep_poll(h_al, cid, &context, &new_cid, &mad) == IB_SUCCESS) {
 
-                       id = cm_alloc_id(listen_id->callback, listen_id);
-                       if (id == NULL) {
-                               kal_cep_destroy(h_al, new_cid, 
STATUS_NO_MORE_ENTRIES);
-                               ib_put_mad(mad);
-                               continue;
-                       }
+               listen_id = (iba_cm_id *) context;
 
-                       kal_cep_config(h_al, new_cid, cm_cep_handler, id, 
cm_destroy_handler);
-                       id->cid = new_cid;
+               id = cm_alloc_id(listen_id->callback, listen_id);
+               if (id == NULL) {
+                       kal_cep_destroy(h_al, new_cid, STATUS_NO_MORE_ENTRIES);
+                       ib_put_mad(mad);
+                       continue;
                }
 
+               kal_cep_config(h_al, new_cid, cm_cep_handler, id, 
cm_destroy_handler);
+               id->cid = new_cid;
+
                kal_cep_format_event(h_al, id->cid, mad, &event);
                status = id->callback(id, &event);
                if (!NT_SUCCESS(status)) {
@@ -157,6 +178,7 @@ cm_listen(iba_cm_id *p_id, net64_t service_id, void 
*p_compare_buf,
        info.cmp_len = compare_len;
        info.cmp_offset = compare_offset;
        
+       kal_cep_config(gh_al, p_id->cid, cm_listen_handler, p_id, 
cm_destroy_handler);
        ib_status = al_cep_listen(gh_al, p_id->cid, &info);
        return ib_to_ntstatus(ib_status);
 }


_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to