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
