[ewg] [PATCH RFC v3] RDMA/CMA: Allocate PS_TCP ports from the host TCP port space.

Steve Wise swise at opengridcomputing.com
Tue Nov 11 14:38:59 PST 2008


Steve Wise wrote:
> FYI:  This new patch fixes a bug in my original patch, that is 
> currently in ofed-1.4.  The bug is that the port number allocated by 
> the stack is not stored in the cm_id...
>

Ah, I see now, this info is all in the comment...

>
> Chien Tung wrote:
>> RDMA/CMA: Allocate PS_TCP ports from the host TCP port space.
>>
>> This is needed for iwarp providers that support native and rdma
>> connections over the same interface.
>>
>> Optionally turned on by the new rdma_cm unify_tcp_port_space module
>> option.
>>
>> Signed-off-by: Steve Wise <swise at opengridcomputing.com>
>> Signed-off-by: Faisal Latif <faisal.latif at intel.com>
>> Signed-off-by: Chien Tung <chien.tin.tung at intel.com>
>> ---
>> All, please comment on V3 change.
>>
>> Vlad, this is an updated version of 
>> cma_0100_unified_tcp_ports.patch.  If you
>> need this in another form, please let me know.
>>
>> V3 change:
>>
>> cma_get_tcp_port does not fill in the port number for the allocated 
>> socket
>> when 0 is passed in for active open.  Call getname to fill in the 
>> port number.
>>
>>  drivers/infiniband/core/cma.c |   43 
>> ++++++++++++++++++++++++++++++++++++++++-
>>  1 files changed, 42 insertions(+), 1 deletions(-)
>>
>> Index: ofed_kernel/drivers/infiniband/core/cma.c
>> ===================================================================
>> --- ofed_kernel.orig/drivers/infiniband/core/cma.c
>> +++ ofed_kernel/drivers/infiniband/core/cma.c
>> @@ -58,6 +58,11 @@ static int tavor_quirk = 0;
>>  module_param_named(tavor_quirk, tavor_quirk, int, 0644);
>>  MODULE_PARM_DESC(tavor_quirk, "Tavor performance quirk: limit MTU to 
>> 1K if > 0");
>>  
>> +int unify_tcp_port_space = 0;
>> +module_param(unify_tcp_port_space, int, 0644);
>> +MODULE_PARM_DESC(unify_tcp_port_space, "Unify the host TCP and RDMA 
>> port "
>> +         "space allocation (default=0)");
>> +
>>  #define CMA_CM_RESPONSE_TIMEOUT 20
>>  #define CMA_MAX_CM_RETRIES 15
>>  #define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24)
>> @@ -125,6 +130,7 @@ struct rdma_id_private {
>>      struct rdma_cm_id    id;
>>  
>>      struct rdma_bind_list    *bind_list;
>> +    struct socket        *sock;
>>      struct hlist_node    node;
>>      struct list_head    list; /* listen_any_list or cma_device.list */
>>      struct list_head    listen_list; /* per device listens */
>> @@ -815,6 +821,8 @@ static void cma_release_port(struct 
>> rdma_id_private *id_priv)
>>          kfree(bind_list);
>>      }
>>      mutex_unlock(&lock);
>> +    if (id_priv->sock)
>> +        sock_release(id_priv->sock);
>>  }
>>  
>>  static void cma_leave_mc_groups(struct rdma_id_private *id_priv)
>> @@ -2049,6 +2057,34 @@ static int cma_use_port(struct idr *ps, struct 
>> rdma_id_private *id_priv)
>>      return 0;
>>  }
>>  
>> +static int cma_get_tcp_port(struct rdma_id_private *id_priv)
>> +{
>> +    int ret;
>> +    int size;
>> +    struct socket *sock;
>> +
>> +    ret = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
>> +    if (ret)
>> +        return ret;
>> +    ret = sock->ops->bind(sock,
>> +            (struct sockaddr *) &id_priv->id.route.addr.src_addr,
>> +            ip_addr_size((struct sockaddr *) 
>> &id_priv->id.route.addr.src_addr));
>> +    if (ret) {
>> +        sock_release(sock);
>> +        return ret;
>> +    }
>> +    size = ip_addr_size(&id_priv->id.route.addr.src_addr);
>> +    ret = sock->ops->getname(sock,
>> +            (struct sockaddr *) &id_priv->id.route.addr.src_addr,
>> +            &size, 0);
>> +    if (ret) {
>> +        sock_release(sock);
>> +        return ret;
>> +    }
>> +    id_priv->sock = sock;
>> +    return 0;
>> +}
>> +
>>  static int cma_get_port(struct rdma_id_private *id_priv)
>>  {
>>      struct idr *ps;
>> @@ -2060,6 +2096,11 @@ static int cma_get_port(struct rdma_id_private 
>> *id_priv)
>>          break;
>>      case RDMA_PS_TCP:
>>          ps = &tcp_ps;
>> +        if (unify_tcp_port_space) {
>> +            ret = cma_get_tcp_port(id_priv);
>> +            if (ret)
>> +                goto out;
>> +        }
>>          break;
>>      case RDMA_PS_UDP:
>>          ps = &udp_ps;
>> @@ -2077,7 +2118,7 @@ static int cma_get_port(struct rdma_id_private 
>> *id_priv)
>>      else
>>          ret = cma_use_port(ps, id_priv);
>>      mutex_unlock(&lock);
>> -
>> +out:
>>      return ret;
>>  }
>>  
>> _______________________________________________
>> ewg mailing list
>> ewg at lists.openfabrics.org
>> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg
>>   
>
> _______________________________________________
> ewg mailing list
> ewg at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg




More information about the ewg mailing list