[ewg] [PATCH RFC ofed-1.4] RDMA/CMA: Allocate PS_TCP ports from the host TCP port space
Steve Wise
swise at opengridcomputing.com
Sat Aug 9 16:55:19 PDT 2008
Tziporet & EWG members,
iWARP customers including Sandia Labs have asked that we include this in
OFED distributions to correctly unify the
host stack and iwarp stack TCP port space.
I recommend we maintain this patch as part of the OFED distribution.
I you agree, then we can pull this in as a patch file in
kernel_patches/fixes/ for ofed-1.4.
Thanks,
Steve.
-----
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.
Signed-off-by: Steve Wise <swise at opengridcomputing.com>
---
drivers/infiniband/core/cma.c | 27 ++++++++++++++++++++++++++-
1 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index e980ff3..f828a68 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -117,6 +117,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 +810,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 +2040,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 +2070,9 @@ static int cma_get_port(struct rdma_id_private *id_priv)
break;
case RDMA_PS_TCP:
ps = &tcp_ps;
+ ret = cma_get_tcp_port(id_priv); /* Synch with native stack */
+ if (ret)
+ goto out;
break;
case RDMA_PS_UDP:
ps = &udp_ps;
@@ -2065,7 +2090,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;
}
More information about the ewg
mailing list