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

Alex Estrin alex.estrin at qlogic.com
Fri Feb 27 05:55:34 PST 2009


Hi Fab,

Do you think that scenario could cause REQ sender to timeout, i.e. listener would destroy CEP instead of sending reject?
Thanks,
Alex.

> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Fab
> Tillier
> Sent: Wednesday, February 25, 2009 6:18 PM
> To: ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH] IBAL: Only create CEPs for REQs that matched to a listen
> 
> 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