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

Steve Wise swise at opengridcomputing.com
Wed Aug 13 18:54:07 PDT 2008


Vlad, I think this patch can go...

Steve.

Steve Wise wrote:
> From: Steve Wise <swise at opengridcomputing.com>
>
> 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>
> ---
>
>  drivers/infiniband/core/cma.c |   34 +++++++++++++++++++++++++++++++++-
>  1 files changed, 33 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
> index e980ff3..bffc8df 100644
> --- a/drivers/infiniband/core/cma.c
> +++ b/drivers/infiniband/core/cma.c
> @@ -54,6 +54,11 @@ MODULE_AUTHOR("Sean Hefty");
>  MODULE_DESCRIPTION("Generic RDMA CM Agent");
>  MODULE_LICENSE("Dual BSD/GPL");
>  
> +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)
> @@ -117,6 +122,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 */
> @@ -809,6 +815,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)
> @@ -2037,6 +2045,25 @@ 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;
> +	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(&id_priv->id.route.addr.src_addr));
> +	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;
> @@ -2048,6 +2075,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;
> @@ -2065,7 +2097,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
>   




More information about the ewg mailing list