From a8ae62260246dee71a830da27b3d452b13c8e258 Mon Sep 17 00:00:00 2001 From: Chien-Hua Yen Date: Wed, 17 Jul 2013 15:54:52 -0700 Subject: [PATCH] rdma_cm: CMA_QUERY_HANDLER: BAD STATUS -110 and -22 Orabug: 16708786 Signed-off-by: Chien-Hua Yen (cherry picked from commit 0d0e27b60592d65b15cdc2926fbb032eaaa9351c) Signed-off-by: Ajaykumar Hotchandani Conflicts: drivers/infiniband/core/cma.c --- drivers/infiniband/core/cma.c | 4 ++++ drivers/infiniband/core/sa_query.c | 16 +++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index f48e4501ef97..0fe0706136b7 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -1776,6 +1776,7 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, { struct cma_work *work = context; struct rdma_route *route; + struct rdma_id_private *id_priv = work->id; route = &work->id->id.route; @@ -1783,6 +1784,9 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, route->num_paths = 1; *route->path_rec = *path_rec; } else { + if (status != -EBUSY && status != -ETIMEDOUT) + if (printk_ratelimit()) + cma_warn(id_priv, "bad status %d from path query\n", status); work->old_state = RDMA_CM_ROUTE_QUERY; work->new_state = RDMA_CM_ADDR_RESOLVED; work->event.event = RDMA_CM_EVENT_ROUTE_ERROR; diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c index 80461aff9c66..fb6a32af0f79 100644 --- a/drivers/infiniband/core/sa_query.c +++ b/drivers/infiniband/core/sa_query.c @@ -1137,12 +1137,18 @@ static void recv_handler(struct ib_mad_agent *mad_agent, query = mad_buf->context[0]; if (query->callback) { - if (mad_recv_wc->wc->status == IB_WC_SUCCESS) - query->callback(query, - mad_recv_wc->recv_buf.mad->mad_hdr.status ? - -EINVAL : 0, + if (mad_recv_wc->wc->status == IB_WC_SUCCESS) { + int mad_status = mad_recv_wc->recv_buf.mad->mad_hdr.status; + int status = 0; + + if ((mad_status & IB_MGMT_MAD_STATUS_BUSY) && (mad_status & \ + ~(IB_MGMT_MAD_STATUS_BUSY|IB_MGMT_MAD_STATUS_REDIRECT_REQD)) == 0) + status = -EBUSY; + else if (mad_status) + status = -EINVAL; + query->callback(query, status, (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad); - else + } else query->callback(query, -EIO, NULL); } -- 2.50.1