From 30cb0684224dd01abd2b1a0535f1d6a3ba2c7bb9 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Wed, 13 Jan 2010 19:34:07 +0000 Subject: [PATCH] ib/cm: separate listen callback into own handler 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 git-svn-id: svn://openib.tc.cornell.edu/gen1@2662 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/core/al/kernel/al_cm.c | 48 ++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/trunk/core/al/kernel/al_cm.c b/trunk/core/al/kernel/al_cm.c index 955985a3..177bb9ed 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); } -- 2.46.0