[IBAL] Only create CEPs for REQs that matched to a listen.
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 24 Mar 2009 14:33:44 +0000 (14:33 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 24 Mar 2009 14:33:44 +0000 (14:33 +0000)
Currently, the CM creates a CEP for an incoming REQ before matching to either a listen or a Peer-to-Peer connection request.  As Peer-to-Peer is not supported, this means that CEPs are created before matching the incoming REQ to a listen.  In the case where there is no listen, this will result in CEPs being created, and then queued for destruction to the timewait timer callback.  Because the CEPs have a timewait time of zero, the timer callback runs as fast as REQs are received, severely affecting system responsiveness.

This patch moves the CEP creation after matching against listens, avoiding creation altogether if there is no listening endpoint.

Signed-off-by: Fab Tillier <ftillier@microsoft.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2042 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/kernel/al_cm_cep.c

index d5f3f2e..5b3071a 100644 (file)
@@ -1108,22 +1108,6 @@ __req_handler(
                return;\r
        }\r
 \r
                return;\r
        }\r
 \r
-       /*\r
-        * Allocate a new CEP for the new request.  This will\r
-        * prevent multiple identical REQs from queueing up for processing.\r
-        */\r
-       p_new_cep = __create_cep();\r
-       if( !p_new_cep )\r
-       {\r
-               /* Reject the request for insufficient resources. */\r
-               reason = IB_REJ_INSUF_RESOURCES;\r
-               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,\r
-                       ("al_create_cep failed\nREJ sent for insufficient resources.\n") );\r
-               goto reject;\r
-       }\r
-\r
-       __save_wire_req( p_new_cep, p_req );\r
-\r
        /*\r
         * Match against listens using SID and compare data, also provide the receiving\r
         * MAD service's port GUID so we can properly filter.\r
        /*\r
         * Match against listens using SID and compare data, also provide the receiving\r
         * MAD service's port GUID so we can properly filter.\r
@@ -1131,7 +1115,26 @@ __req_handler(
        p_cep = __lookup_listen( p_req->sid, p_port_cep->port_guid, p_req->pdata );\r
        if( p_cep )\r
        {\r
        p_cep = __lookup_listen( p_req->sid, p_port_cep->port_guid, p_req->pdata );\r
        if( p_cep )\r
        {\r
+               /*\r
+                * Allocate a new CEP for the new request.  This will\r
+                * prevent multiple identical REQs from queueing up for processing.\r
+                */\r
+               p_new_cep = __create_cep();\r
+               if( !p_new_cep )\r
+               {\r
+                       /* Reject the request for insufficient resources. */\r
+                       reason = IB_REJ_INSUF_RESOURCES;\r
+                       AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,\r
+                               ("al_create_cep failed\nREJ sent for insufficient resources.\n") );\r
+                       goto reject;\r
+               }\r
+\r
+               __save_wire_req( p_new_cep, p_req );\r
+\r
                __bind_cep( p_new_cep, p_cep->p_cid->h_al, p_cep->pfn_cb, NULL );\r
                __bind_cep( p_new_cep, p_cep->p_cid->h_al, p_cep->pfn_cb, NULL );\r
+               AL_PRINT( TRACE_LEVEL_VERBOSE, AL_DBG_CM,\r
+                       ("Created CEP with CID = %d, h_al %p, remote = %d\n",\r
+                       p_new_cep->cid, p_cep->p_cid->h_al, p_new_cep->remote_comm_id) );\r
 \r
                /* Add the new CEP to the map so that repeated REQs match up. */\r
                p_stale_cep = __insert_cep( p_new_cep );\r
 \r
                /* Add the new CEP to the map so that repeated REQs match up. */\r
                p_stale_cep = __insert_cep( p_new_cep );\r
@@ -1198,7 +1201,7 @@ __req_handler(
                        /* No match found.  Reject. */\r
                        reason = IB_REJ_INVALID_SID;\r
                        AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_CM, ("REQ received but no match found.\n") );\r
                        /* No match found.  Reject. */\r
                        reason = IB_REJ_INVALID_SID;\r
                        AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_CM, ("REQ received but no match found.\n") );\r
-                       goto cleanup;\r
+                       goto reject;\r
                }\r
        }\r
 \r
                }\r
        }\r
 \r
@@ -1214,7 +1217,6 @@ __req_handler(
 unbind:\r
        __unbind_cep( p_new_cep );\r
 \r
 unbind:\r
        __unbind_cep( p_new_cep );\r
 \r
-cleanup:\r
        /*\r
         * Move the CEP in the idle state so that we don't send a reject\r
         * for it when cleaning up.  Also clear the RQPN and RCID so that\r
        /*\r
         * Move the CEP in the idle state so that we don't send a reject\r
         * for it when cleaning up.  Also clear the RQPN and RCID so that\r