IB/cma: Add debug messages to error flows
PATCH 1/1 IB/cma: Add debug messages to error flows
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
Print debug messages to the kernel log to add more information about RDMA_CM events that indicate an error.
--- drivers/infiniband/core/cm.c | 2 ++ drivers/infiniband/core/cma.c | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-)
drivers/infiniband/core/cm.c +2 -0
@@ -3409,6 +3409,8 @@ static void cm_process_send_error(struct ib_mad_send_buf *msg,if (msg != cm_id_priv->msg || state != cm_id_priv->id.state) goto discard; +pr_debug_ratelimited ("CM: failed sending MAD in state %d. (%s)\n" , + state,ib_wc_status_msg (wc_status));switch (state) {case IB_CM_REQ_SENT :case IB_CM_MRA_REQ_RCVD :
drivers/infiniband/core/cma.c +23 -2
@@ -1689,6 +1689,7 @@ static int cma_rep_recv(struct rdma_id_private *id_priv)return 0 ; reject: +pr_debug_ratelimited ("RDMA CM: CONNECT_ERROR: failed to handle reply. status %d\n" , ret);cma_modify_qp_err (id_priv);ib_send_cm_rej (id_priv->cm_id.ib,IB_CM_REJ_CONSUMER_DEFINED ,NULL ,0 ,NULL ,0 );
@@ -1760,6 +1761,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)/* ignore event */ goto out;case IB_CM_REJ_RECEIVED : +pr_debug_ratelimited ("RDMA CM: REJECTED: %s\n" ,rdma_reject_msg (&id_priv->id, + ib_event->param.rej_rcvd.reason));cma_modify_qp_err (id_priv); event.status = ib_event->param.rej_rcvd.reason; event.event =RDMA_CM_EVENT_REJECTED ;
@@ -2285,6 +2288,8 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, work->new_state =RDMA_CM_ADDR_RESOLVED ; work->event.event =RDMA_CM_EVENT_ROUTE_ERROR ; work->event.status = status; +pr_debug_ratelimited ("RDMA CM: ROUTE_ERROR: failed to query path. status %d\n" , + status); }queue_work (cma_wq, &work->work);
@@ -2720,8 +2725,14 @@ static void addr_handler(int status, struct sockaddr *src_addr, goto out;memcpy (cma_src_addr (id_priv), src_addr,rdma_addr_size (src_addr)); -if (!status && !id_priv->cma_dev) +if (!status && !id_priv->cma_dev) { status =cma_acquire_dev (id_priv,NULL ); +if (status) +pr_debug_ratelimited ("RDMA CM: ADDR_ERROR: failed to acquire device. status %d\n" , + status); + }else { +pr_debug_ratelimited ("RDMA CM: ADDR_ERROR: failed to resolve IP. status %d\n" , status); + } if (status) { if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_RESOLVED,
@@ -3307,10 +3318,13 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id,if (rep->status !=IB_SIDR_SUCCESS ) { event.event =RDMA_CM_EVENT_UNREACHABLE ; event.status = ib_event->param.sidr_rep_rcvd.status; +pr_debug_ratelimited ("RDMA CM: UNREACHABLE: bad SIDR reply. status %d\n" , + event.status);break ; } ret =cma_set_qkey (id_priv, rep->qkey);if (ret) { +pr_debug_ratelimited ("RDMA CM: ADDR_ERROR: failed to set qkey. status %d\n" , ret); event.event =RDMA_CM_EVENT_ADDR_ERROR ; event.status = ret;break ;
@@ -3759,10 +3773,17 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)if (!status) status =cma_set_qkey (id_priv,be32_to_cpu (multicast->rec.qkey)); +else +pr_debug_ratelimited ("RDMA CM: MULTICAST_ERROR: failed to join multicast. status %d\n" , + status);mutex_lock (&id_priv->qp_mutex); -if (!status && id_priv->id.qp) +if (!status && id_priv->id.qp) { status =ib_attach_mcast (id_priv->id.qp, &multicast->rec.mgid,be16_to_cpu (multicast->rec.mlid)); +if (!status) +pr_debug_ratelimited ("RDMA CM: MULTICAST_ERROR: failed to attach QP. status %d\n" , + status); + }mutex_unlock (&id_priv->qp_mutex);memset (&event,0 ,sizeof event);
--
2.10.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170105141636.23284-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH 1/1 IB/cma: Allow port reuse for rdma_id
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
When allocating a port number for binding to a rdma_id, assuming the allocation is not for a specific port, the rule is to allow only ports that were not in use before by any other rdma_id.
This condition is too strong to achieve the goal of a unique 5 tuple rdma_id. Instead, we can compare current rdma_id with other rdma_id for difference in one of destination port, source address and destination address to allow port reuse.
--- drivers/infiniband/core/cma.c | 67 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-)
drivers/infiniband/core/cma.c +60 -7
@@ -2843,20 +2843,26 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,int ret; id_priv = container_of(id, struct rdma_id_private, id); +memcpy (cma_dst_addr (id_priv), dst_addr,rdma_addr_size (dst_addr));if (id_priv->state ==RDMA_CM_IDLE ) { ret =cma_bind_addr (id, src_addr, dst_addr); -if (ret) +if (ret) { +memset (cma_dst_addr (id_priv),0 ,rdma_addr_size (dst_addr));return ret; + } } -if (cma_family (id_priv) != dst_addr->sa_family) +if (cma_family (id_priv) != dst_addr->sa_family) { +memset (cma_dst_addr (id_priv),0 ,rdma_addr_size (dst_addr));return -EINVAL ; + } -if (!cma_comp_exch (id_priv,RDMA_CM_ADDR_BOUND ,RDMA_CM_ADDR_QUERY )) +if (!cma_comp_exch (id_priv,RDMA_CM_ADDR_BOUND ,RDMA_CM_ADDR_QUERY )) { +memset (cma_dst_addr (id_priv),0 ,rdma_addr_size (dst_addr));return -EINVAL ; + }atomic_inc (&id_priv->refcount); -memcpy (cma_dst_addr (id_priv), dst_addr,rdma_addr_size (dst_addr));if (cma_any_addr (dst_addr)) { ret =cma_resolve_loopback (id_priv); }else {
@@ -2972,6 +2978,43 @@ static int cma_alloc_port(enum rdma_port_space ps,return ret == -ENOSPC ? -EADDRNOTAVAIL : ret; } +static int cma_port_is_unique (struct rdma_bind_list *bind_list, +struct rdma_id_private *id_priv) +{ +struct rdma_id_private *cur_id; +struct sockaddr *daddr =cma_dst_addr (id_priv); +struct sockaddr *saddr =cma_src_addr (id_priv); +__be16 dport =cma_port (daddr); + +hlist_for_each_entry (cur_id, &bind_list->owners, node) { +struct sockaddr *cur_daddr =cma_dst_addr (cur_id); +struct sockaddr *cur_saddr =cma_src_addr (cur_id); +__be16 cur_dport =cma_port (cur_daddr); + +if (id_priv == cur_id) +continue ; + +/* different dest port -> unique */ +if (!cma_any_port (cur_daddr) && + (dport != cur_dport)) +continue ; + +/* different src address -> unique */ +if (!cma_any_addr (saddr) && + !cma_any_addr (cur_saddr) && +cma_addr_cmp (saddr, cur_saddr)) +continue ; + +/* different dst address -> unique */ +if (!cma_any_addr (cur_daddr) && +cma_addr_cmp (daddr, cur_daddr)) +continue ; + +return -EADDRNOTAVAIL ; + } +return 0 ; +} +static int cma_alloc_any_port (enum rdma_port_space ps,struct rdma_id_private *id_priv) {
@@ -2984,9 +3027,19 @@ static int cma_alloc_any_port(enum rdma_port_space ps, remaining = (high - low) +1 ; rover =prandom_u32 () % remaining + low; retry: -if (last_used_port != rover && - !cma_ps_find (net, ps, (unsigned short )rover)) { -int ret =cma_alloc_port (ps, id_priv, rover); +if (last_used_port != rover) { +struct rdma_bind_list *bind_list; +int ret; + + bind_list =cma_ps_find (net, ps, (unsigned short )rover); + +if (!bind_list) { + ret =cma_alloc_port (ps, id_priv, rover); + }else { + ret =cma_port_is_unique (bind_list, id_priv); +if (!ret) +cma_bind_port (bind_list, id_priv); + }/* * Remember previously used port number in order to avoid * re-using same port immediately after it is closed.
--
2.10.2
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20170105141636.23284-2-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Hefty, Sean
Acked-byRE: [PATCH rdma-next] IB/cma: Allow port reuse for rdma_id
Quoted 6 lines
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
When allocating a port number for binding to a
rdma_id, assuming the allocation is not for a specific port, the rule is to allow only ports that were not in use before by any otherrdma_id.
Quoted 7 lines
This condition is too strong to achieve the goal of a unique 5 tuple
rdma_id. Instead, we can compare currentrdma_idwith otherrdma_idfor difference in one of destination port, source address and destination address to allow port reuse.Signed-off-by Leon Romanovsky <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 1828884A29C6694DAF28B7E6B8A82373AB0D7F68-P5GAC/[email protected]
Re: [PATCH rdma-next] IB/cma: Allow port reuse for rdma_id
Quoted 11 lines · Sean
Quoted 11 lines
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
When allocating a port number for binding to a
rdma_id, assuming the allocation is not for a specific port, the rule is to allow only ports that were not in use before by any otherrdma_id.This condition is too strong to achieve the goal of a unique 5 tuple
rdma_id. Instead, we can compare currentrdma_idwith otherrdma_idfor difference in one of destination port, source address and destination address to allow port reuse.
Quoted 4 lines
Quoted 2 lines
Signed-off-by Leon Romanovsky <[email protected]>Acked-by Sean Hefty <[email protected]>
Thanks Sean for your prompt response.
I truly appreciate it.
Doug Ledford
AppliedRe: [PATCH rdma-next] IB/cma: Allow port reuse for rdma_id
In reply to a message not in the archiveQuoted 7 lines · Leon Romanovsky
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
When allocating a port number for binding to a
rdma_id, assuming the allocation is not for a specific port, the rule is to allow only ports
that were not in use before by any otherrdma_id.
Quoted 8 lines
This condition is too strong to achieve the goal of a unique 5 tuple
rdma_id. Instead, we can compare currentrdma_idwith otherrdma_idfor
difference in one of destination port, source address and destination address to allow port reuse.Signed-off-by Leon Romanovsky <[email protected]>
Applied to -next, thanks.
Signature · 4 lines
Doug Ledford <[email protected]> GPG KeyID: B826A3330E572FDD Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD
Doug Ledford
AppliedQuoted 7 lines · Leon Romanovsky
From: Moni Shoua <monis-VPRAkNaXOzVWk0Htik3J/[email protected]>
Print debug messages to the kernel log to add more information about
RDMA_CMevents that indicate an error.Signed-off-by Leon Romanovsky <[email protected]>
Applied to -next, thanks.
Signature · 4 lines
Doug Ledford <[email protected]> GPG KeyID: B826A3330E572FDD Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD