> @@ -1037,17 +1033,13 @@ void rdma_destroy_id(struct rdma_cm_id *id)
>       mutex_unlock(&id_priv->handler_mutex);
> 
>       if (id_priv->cma_dev) {
> -             switch (rdma_node_get_transport(id_priv->id.device-
> >node_type)) {
> -             case RDMA_TRANSPORT_IB:
> +             if (rdma_ib_or_iboe(id_priv->id.device, id_priv->id.port_num))

A listen id can be associated with a device without being associated with a 
port (see the listen_any_list).  Some other check is needed to handle this 
case.  I guess the code could check the first port on the device (replace 
port_num with hardcoded value 1).  Then we wouldn't be any more broken than the 
code already is.  (The 'break' is conceptual, not practical.)

This appears to be highlighting an architectural flaw in the iboe integration.

> {
>                       if (id_priv->cm_id.ib)
>                               ib_destroy_cm_id(id_priv->cm_id.ib);
> -                     break;
> -             case RDMA_TRANSPORT_IWARP:
> +             } else if (rdma_tech_iwarp(id_priv->id.device,
> +                                        id_priv->id.port_num)) {
>                       if (id_priv->cm_id.iw)
>                               iw_destroy_cm_id(id_priv->cm_id.iw);
> -                     break;
> -             default:
> -                     break;
>               }
>               cma_leave_mc_groups(id_priv);
>               cma_release_dev(id_priv);

 - Sean

Reply via email to