aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Hefty <sean.hefty@intel.com>2013-05-29 13:09:22 -0400
committerRoland Dreier <roland@purestorage.com>2013-06-21 02:35:36 -0400
commite8160e15930969de709ba9b46df9571448b78ce5 (patch)
treec849ad7a71b6ed73cedfc1eeb512b817b27d72ed
parentfbaa1a6d852aa6878059acb18cbc336746795a56 (diff)
RDMA/cma: Expose private data when using AF_IB
If the source or destination address is AF_IB, then do not reserve a portion of the private data in the IB CM REQ or SIDR REQ messages for the cma header. Instead, all private data should be exported to the user. When AF_IB is used, the rdma cm does not have sufficient information to fill in the cma header. Additionally, this will be necessary to support any IB connection through the rdma cm interface, Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/core/cma.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 112a192eae9c..7a9b033e37ce 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -893,9 +893,9 @@ static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
893 return 0; 893 return 0;
894} 894}
895 895
896static inline int cma_user_data_offset(enum rdma_port_space ps) 896static inline int cma_user_data_offset(struct rdma_id_private *id_priv)
897{ 897{
898 return sizeof(struct cma_hdr); 898 return cma_family(id_priv) == AF_IB ? 0 : sizeof(struct cma_hdr);
899} 899}
900 900
901static void cma_cancel_route(struct rdma_id_private *id_priv) 901static void cma_cancel_route(struct rdma_id_private *id_priv)
@@ -1265,7 +1265,7 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1265 return -ECONNABORTED; 1265 return -ECONNABORTED;
1266 1266
1267 memset(&event, 0, sizeof event); 1267 memset(&event, 0, sizeof event);
1268 offset = cma_user_data_offset(listen_id->id.ps); 1268 offset = cma_user_data_offset(listen_id);
1269 event.event = RDMA_CM_EVENT_CONNECT_REQUEST; 1269 event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
1270 if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) { 1270 if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) {
1271 conn_id = cma_new_udp_id(&listen_id->id, ib_event); 1271 conn_id = cma_new_udp_id(&listen_id->id, ib_event);
@@ -2585,7 +2585,7 @@ static int cma_format_hdr(void *hdr, struct rdma_id_private *id_priv)
2585 cma_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr; 2585 cma_hdr->src_addr.ip4.addr = src4->sin_addr.s_addr;
2586 cma_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr; 2586 cma_hdr->dst_addr.ip4.addr = dst4->sin_addr.s_addr;
2587 cma_hdr->port = src4->sin_port; 2587 cma_hdr->port = src4->sin_port;
2588 } else { 2588 } else if (cma_family(id_priv) == AF_INET6) {
2589 struct sockaddr_in6 *src6, *dst6; 2589 struct sockaddr_in6 *src6, *dst6;
2590 2590
2591 src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv); 2591 src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv);
@@ -2668,24 +2668,30 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
2668{ 2668{
2669 struct ib_cm_sidr_req_param req; 2669 struct ib_cm_sidr_req_param req;
2670 struct ib_cm_id *id; 2670 struct ib_cm_id *id;
2671 int ret; 2671 int offset, ret;
2672 2672
2673 req.private_data_len = sizeof(struct cma_hdr) + 2673 offset = cma_user_data_offset(id_priv);
2674 conn_param->private_data_len; 2674 req.private_data_len = offset + conn_param->private_data_len;
2675 if (req.private_data_len < conn_param->private_data_len) 2675 if (req.private_data_len < conn_param->private_data_len)
2676 return -EINVAL; 2676 return -EINVAL;
2677 2677
2678 req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC); 2678 if (req.private_data_len) {
2679 if (!req.private_data) 2679 req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
2680 return -ENOMEM; 2680 if (!req.private_data)
2681 return -ENOMEM;
2682 } else {
2683 req.private_data = NULL;
2684 }
2681 2685
2682 if (conn_param->private_data && conn_param->private_data_len) 2686 if (conn_param->private_data && conn_param->private_data_len)
2683 memcpy((void *) req.private_data + sizeof(struct cma_hdr), 2687 memcpy((void *) req.private_data + offset,
2684 conn_param->private_data, conn_param->private_data_len); 2688 conn_param->private_data, conn_param->private_data_len);
2685 2689
2686 ret = cma_format_hdr((void *) req.private_data, id_priv); 2690 if (req.private_data) {
2687 if (ret) 2691 ret = cma_format_hdr((void *) req.private_data, id_priv);
2688 goto out; 2692 if (ret)
2693 goto out;
2694 }
2689 2695
2690 id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler, 2696 id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler,
2691 id_priv); 2697 id_priv);
@@ -2720,14 +2726,18 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
2720 int offset, ret; 2726 int offset, ret;
2721 2727
2722 memset(&req, 0, sizeof req); 2728 memset(&req, 0, sizeof req);
2723 offset = cma_user_data_offset(id_priv->id.ps); 2729 offset = cma_user_data_offset(id_priv);
2724 req.private_data_len = offset + conn_param->private_data_len; 2730 req.private_data_len = offset + conn_param->private_data_len;
2725 if (req.private_data_len < conn_param->private_data_len) 2731 if (req.private_data_len < conn_param->private_data_len)
2726 return -EINVAL; 2732 return -EINVAL;
2727 2733
2728 private_data = kzalloc(req.private_data_len, GFP_ATOMIC); 2734 if (req.private_data_len) {
2729 if (!private_data) 2735 private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
2730 return -ENOMEM; 2736 if (!private_data)
2737 return -ENOMEM;
2738 } else {
2739 private_data = NULL;
2740 }
2731 2741
2732 if (conn_param->private_data && conn_param->private_data_len) 2742 if (conn_param->private_data && conn_param->private_data_len)
2733 memcpy(private_data + offset, conn_param->private_data, 2743 memcpy(private_data + offset, conn_param->private_data,
@@ -2741,10 +2751,12 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
2741 id_priv->cm_id.ib = id; 2751 id_priv->cm_id.ib = id;
2742 2752
2743 route = &id_priv->id.route; 2753 route = &id_priv->id.route;
2744 ret = cma_format_hdr(private_data, id_priv); 2754 if (private_data) {
2745 if (ret) 2755 ret = cma_format_hdr(private_data, id_priv);
2746 goto out; 2756 if (ret)
2747 req.private_data = private_data; 2757 goto out;
2758 req.private_data = private_data;
2759 }
2748 2760
2749 req.primary_path = &route->path_rec[0]; 2761 req.primary_path = &route->path_rec[0];
2750 if (route->num_paths == 2) 2762 if (route->num_paths == 2)