[ofw] [PATCH] IBAL: Only create CEPs for REQs that matched to alisten

Leonid Keller leonid at mellanox.co.il
Tue Mar 24 07:34:09 PDT 2009


Applied in 2042, thank you. 

> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org 
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Fab Tillier
> Sent: Thursday, February 26, 2009 1:18 AM
> To: ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH] IBAL: Only create CEPs for REQs that 
> matched to alisten
> 
> 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 at microsoft.com>
> 
> Index: core/al/kernel/al_cm_cep.c
> ===================================================================
> --- core/al/kernel/al_cm_cep.c  (revision 1978)
> +++ core/al/kernel/al_cm_cep.c  (working copy)
> @@ -1108,29 +1108,32 @@ __req_handler(
>         }
> 
>         /*
> -        * Allocate a new CEP for the new request.  This will
> -        * prevent multiple identical REQs from queueing up 
> for processing.
> -        */
> -       p_new_cep = __create_cep();
> -       if( !p_new_cep )
> -       {
> -               /* Reject the request for insufficient resources. */
> -               reason = IB_REJ_INSUF_RESOURCES;
> -               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
> -                       ("al_create_cep failed\nREJ sent for 
> insufficient resources.\n") );
> -               goto reject;
> -       }
> -
> -       __save_wire_req( p_new_cep, p_req );
> -
> -       /*
>          * Match against listens using SID and compare data, 
> also provide the receiving
>          * MAD service's port GUID so we can properly filter.
>          */
>         p_cep = __lookup_listen( p_req->sid, 
> p_port_cep->port_guid, p_req->pdata );
>         if( p_cep )
>         {
> +               /*
> +                * Allocate a new CEP for the new request.  This will
> +                * prevent multiple identical REQs from 
> queueing up for processing.
> +                */
> +               p_new_cep = __create_cep();
> +               if( !p_new_cep )
> +               {
> +                       /* Reject the request for 
> insufficient resources. */
> +                       reason = IB_REJ_INSUF_RESOURCES;
> +                       AL_PRINT_EXIT( TRACE_LEVEL_ERROR, 
> AL_DBG_ERROR,
> +                               ("al_create_cep failed\nREJ 
> sent for insufficient resources.\n") );
> +                       goto reject;
> +               }
> +
> +               __save_wire_req( p_new_cep, p_req );
> +
>                 __bind_cep( p_new_cep, p_cep->p_cid->h_al, 
> p_cep->pfn_cb, NULL );
> +               AL_PRINT( TRACE_LEVEL_VERBOSE, AL_DBG_CM,
> +                       ("Created CEP with CID = %d, h_al %p, 
> remote = %d\n",
> +                       p_new_cep->cid, p_cep->p_cid->h_al, 
> + p_new_cep->remote_comm_id) );
> 
>                 /* Add the new CEP to the map so that 
> repeated REQs match up. */
>                 p_stale_cep = __insert_cep( p_new_cep ); @@ 
> -1197,7 +1200,7 @@ __req_handler(
>                         /* No match found.  Reject. */
>                         reason = IB_REJ_INVALID_SID;
>                         AL_PRINT( TRACE_LEVEL_INFORMATION, 
> AL_DBG_CM, ("REQ received but no match found.\n") );
> -                       goto cleanup;
> +                       goto reject;
>                 }
>         }
> 
> @@ -1213,7 +1216,6 @@ __req_handler(
>  unbind:
>         __unbind_cep( p_new_cep );
> 
> -cleanup:
>         /*
>          * Move the CEP in the idle state so that we don't 
> send a reject
>          * for it when cleaning up.  Also clear the RQPN and 
> RCID so that
> 



More information about the ofw mailing list