summaryrefslogtreecommitdiff
path: root/drivers/infiniband/ulp/rtrs/rtrs-clt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/ulp/rtrs/rtrs-clt.c')
-rw-r--r--drivers/infiniband/ulp/rtrs/rtrs-clt.c131
1 files changed, 83 insertions, 48 deletions
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
index 2b397a544cb9..59e30640f94a 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
@@ -422,8 +422,8 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
refcount_inc(&req->ref);
err = rtrs_inv_rkey(req);
if (err) {
- rtrs_err_rl(con->c.path, "Send INV WR key=%#x: %d\n",
- req->mr->rkey, err);
+ rtrs_err_rl(con->c.path, "Send INV WR key=%#x: %pe\n",
+ req->mr->rkey, ERR_PTR(err));
} else if (can_wait) {
wait_for_completion(&req->inv_comp);
}
@@ -443,8 +443,8 @@ static void complete_rdma_req(struct rtrs_clt_io_req *req, int errno,
if (errno) {
rtrs_err_rl(con->c.path,
- "IO %s request failed: error=%d path=%s [%s:%u] notify=%d\n",
- req->dir == DMA_TO_DEVICE ? "write" : "read", errno,
+ "IO %s request failed: error=%pe path=%s [%s:%u] notify=%d\n",
+ req->dir == DMA_TO_DEVICE ? "write" : "read", ERR_PTR(errno),
kobject_name(&clt_path->kobj), clt_path->hca_name,
clt_path->hca_port, notify);
}
@@ -514,7 +514,7 @@ static void rtrs_clt_recv_done(struct rtrs_clt_con *con, struct ib_wc *wc)
cqe);
err = rtrs_iu_post_recv(&con->c, iu);
if (err) {
- rtrs_err(con->c.path, "post iu failed %d\n", err);
+ rtrs_err(con->c.path, "post iu failed %pe\n", ERR_PTR(err));
rtrs_rdma_error_recovery(con);
}
}
@@ -659,8 +659,8 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)
else
err = rtrs_post_recv_empty(&con->c, &io_comp_cqe);
if (err) {
- rtrs_err(con->c.path, "rtrs_post_recv_empty(): %d\n",
- err);
+ rtrs_err(con->c.path, "rtrs_post_recv_empty(): %pe\n",
+ ERR_PTR(err));
rtrs_rdma_error_recovery(con);
}
break;
@@ -731,8 +731,8 @@ static int post_recv_path(struct rtrs_clt_path *clt_path)
err = post_recv_io(to_clt_con(clt_path->s.con[cid]), q_size);
if (err) {
- rtrs_err(clt_path->clt, "post_recv_io(), err: %d\n",
- err);
+ rtrs_err(clt_path->clt, "post_recv_io(), err: %pe\n",
+ ERR_PTR(err));
return err;
}
}
@@ -1122,8 +1122,8 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
ret = rtrs_map_sg_fr(req, count);
if (ret < 0) {
rtrs_err_rl(s,
- "Write request failed, failed to map fast reg. data, err: %d\n",
- ret);
+ "Write request failed, failed to map fast reg. data, err: %pe\n",
+ ERR_PTR(ret));
ib_dma_unmap_sg(clt_path->s.dev->ib_dev, req->sglist,
req->sg_cnt, req->dir);
return ret;
@@ -1150,9 +1150,9 @@ static int rtrs_clt_write_req(struct rtrs_clt_io_req *req)
imm, wr, NULL);
if (ret) {
rtrs_err_rl(s,
- "Write request failed: error=%d path=%s [%s:%u]\n",
- ret, kobject_name(&clt_path->kobj), clt_path->hca_name,
- clt_path->hca_port);
+ "Write request failed: error=%pe path=%s [%s:%u]\n",
+ ERR_PTR(ret), kobject_name(&clt_path->kobj),
+ clt_path->hca_name, clt_path->hca_port);
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
atomic_dec(&clt_path->stats->inflight);
if (req->mr->need_inval) {
@@ -1208,8 +1208,8 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
ret = rtrs_map_sg_fr(req, count);
if (ret < 0) {
rtrs_err_rl(s,
- "Read request failed, failed to map fast reg. data, err: %d\n",
- ret);
+ "Read request failed, failed to map fast reg. data, err: %pe\n",
+ ERR_PTR(ret));
ib_dma_unmap_sg(dev->ib_dev, req->sglist, req->sg_cnt,
req->dir);
return ret;
@@ -1260,9 +1260,9 @@ static int rtrs_clt_read_req(struct rtrs_clt_io_req *req)
req->data_len, imm, wr);
if (ret) {
rtrs_err_rl(s,
- "Read request failed: error=%d path=%s [%s:%u]\n",
- ret, kobject_name(&clt_path->kobj), clt_path->hca_name,
- clt_path->hca_port);
+ "Read request failed: error=%pe path=%s [%s:%u]\n",
+ ERR_PTR(ret), kobject_name(&clt_path->kobj),
+ clt_path->hca_name, clt_path->hca_port);
if (req->mp_policy == MP_POLICY_MIN_INFLIGHT)
atomic_dec(&clt_path->stats->inflight);
req->mr->need_inval = false;
@@ -1359,7 +1359,9 @@ static void free_path_reqs(struct rtrs_clt_path *clt_path)
static int alloc_path_reqs(struct rtrs_clt_path *clt_path)
{
+ struct ib_device *ib_dev = clt_path->s.dev->ib_dev;
struct rtrs_clt_io_req *req;
+ enum ib_mr_type mr_type;
int i, err = -ENOMEM;
clt_path->reqs = kcalloc(clt_path->queue_depth,
@@ -1368,6 +1370,11 @@ static int alloc_path_reqs(struct rtrs_clt_path *clt_path)
if (!clt_path->reqs)
return -ENOMEM;
+ if (ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)
+ mr_type = IB_MR_TYPE_SG_GAPS;
+ else
+ mr_type = IB_MR_TYPE_MEM_REG;
+
for (i = 0; i < clt_path->queue_depth; ++i) {
req = &clt_path->reqs[i];
req->iu = rtrs_iu_alloc(1, clt_path->max_hdr_size, GFP_KERNEL,
@@ -1381,8 +1388,7 @@ static int alloc_path_reqs(struct rtrs_clt_path *clt_path)
if (!req->sge)
goto out;
- req->mr = ib_alloc_mr(clt_path->s.dev->ib_pd,
- IB_MR_TYPE_MEM_REG,
+ req->mr = ib_alloc_mr(clt_path->s.dev->ib_pd, mr_type,
clt_path->max_pages_per_mr);
if (IS_ERR(req->mr)) {
err = PTR_ERR(req->mr);
@@ -1775,12 +1781,12 @@ static int rtrs_rdma_addr_resolved(struct rtrs_clt_con *con)
err = create_con_cq_qp(con);
mutex_unlock(&con->con_mutex);
if (err) {
- rtrs_err(s, "create_con_cq_qp(), err: %d\n", err);
+ rtrs_err(s, "create_con_cq_qp(), err: %pe\n", ERR_PTR(err));
return err;
}
err = rdma_resolve_route(con->c.cm_id, RTRS_CONNECT_TIMEOUT_MS);
if (err)
- rtrs_err(s, "Resolving route failed, err: %d\n", err);
+ rtrs_err(s, "Resolving route failed, err: %pe\n", ERR_PTR(err));
return err;
}
@@ -1814,7 +1820,7 @@ static int rtrs_rdma_route_resolved(struct rtrs_clt_con *con)
err = rdma_connect_locked(con->c.cm_id, &param);
if (err)
- rtrs_err(clt, "rdma_connect_locked(): %d\n", err);
+ rtrs_err(clt, "rdma_connect_locked(): %pe\n", ERR_PTR(err));
return err;
}
@@ -1847,8 +1853,8 @@ static int rtrs_rdma_conn_established(struct rtrs_clt_con *con,
}
errno = le16_to_cpu(msg->errno);
if (errno) {
- rtrs_err(clt, "Invalid RTRS message: errno %d\n",
- errno);
+ rtrs_err(clt, "Invalid RTRS message: errno %pe\n",
+ ERR_PTR(errno));
return -ECONNRESET;
}
if (con->c.cid == 0) {
@@ -1923,7 +1929,7 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
struct rtrs_path *s = con->c.path;
const struct rtrs_msg_conn_rsp *msg;
const char *rej_msg;
- int status, errno;
+ int status, errno = -ECONNRESET;
u8 data_len;
status = ev->status;
@@ -1937,15 +1943,15 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con,
"Previous session is still exists on the server, please reconnect later\n");
else
rtrs_err(s,
- "Connect rejected: status %d (%s), rtrs errno %d\n",
- status, rej_msg, errno);
+ "Connect rejected: status %d (%s), rtrs errno %pe\n",
+ status, rej_msg, ERR_PTR(errno));
} else {
rtrs_err(s,
"Connect rejected but with malformed message: status %d (%s)\n",
status, rej_msg);
}
- return -ECONNRESET;
+ return errno;
}
void rtrs_clt_close_conns(struct rtrs_clt_path *clt_path, bool wait)
@@ -2009,27 +2015,53 @@ static int rtrs_clt_rdma_cm_handler(struct rdma_cm_id *cm_id,
case RDMA_CM_EVENT_UNREACHABLE:
case RDMA_CM_EVENT_ADDR_CHANGE:
case RDMA_CM_EVENT_TIMEWAIT_EXIT:
- rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
- rdma_event_msg(ev->event), ev->status);
+ if (ev->status < 0) {
+ rtrs_wrn(s, "CM error (CM event: %s, err: %pe)\n",
+ rdma_event_msg(ev->event), ERR_PTR(ev->status));
+ } else if (ev->status > 0) {
+ rtrs_wrn(s, "CM error (CM event: %s, err: %s)\n",
+ rdma_event_msg(ev->event),
+ rdma_reject_msg(cm_id, ev->status));
+ }
cm_err = -ECONNRESET;
break;
case RDMA_CM_EVENT_ADDR_ERROR:
case RDMA_CM_EVENT_ROUTE_ERROR:
- rtrs_wrn(s, "CM error (CM event: %s, err: %d)\n",
- rdma_event_msg(ev->event), ev->status);
+ if (ev->status < 0) {
+ rtrs_wrn(s, "CM error (CM event: %s, err: %pe)\n",
+ rdma_event_msg(ev->event),
+ ERR_PTR(ev->status));
+ } else if (ev->status > 0) {
+ rtrs_wrn(s, "CM error (CM event: %s, err: %s)\n",
+ rdma_event_msg(ev->event),
+ rdma_reject_msg(cm_id, ev->status));
+ }
cm_err = -EHOSTUNREACH;
break;
case RDMA_CM_EVENT_DEVICE_REMOVAL:
/*
* Device removal is a special case. Queue close and return 0.
*/
- rtrs_wrn_rl(s, "CM event: %s, status: %d\n", rdma_event_msg(ev->event),
- ev->status);
+ if (ev->status < 0) {
+ rtrs_wrn_rl(s, "CM event: %s, status: %pe\n",
+ rdma_event_msg(ev->event),
+ ERR_PTR(ev->status));
+ } else if (ev->status > 0) {
+ rtrs_wrn_rl(s, "CM event: %s, status: %s\n",
+ rdma_event_msg(ev->event),
+ rdma_reject_msg(cm_id, ev->status));
+ }
rtrs_clt_close_conns(clt_path, false);
return 0;
default:
- rtrs_err(s, "Unexpected RDMA CM error (CM event: %s, err: %d)\n",
- rdma_event_msg(ev->event), ev->status);
+ if (ev->status < 0) {
+ rtrs_err(s, "Unexpected RDMA CM error (CM event: %s, err: %pe)\n",
+ rdma_event_msg(ev->event), ERR_PTR(ev->status));
+ } else if (ev->status > 0) {
+ rtrs_err(s, "Unexpected RDMA CM error (CM event: %s, err: %s)\n",
+ rdma_event_msg(ev->event),
+ rdma_reject_msg(cm_id, ev->status));
+ }
cm_err = -ECONNRESET;
break;
}
@@ -2066,14 +2098,14 @@ static int create_cm(struct rtrs_clt_con *con)
/* allow the port to be reused */
err = rdma_set_reuseaddr(cm_id, 1);
if (err != 0) {
- rtrs_err(s, "Set address reuse failed, err: %d\n", err);
+ rtrs_err(s, "Set address reuse failed, err: %pe\n", ERR_PTR(err));
return err;
}
err = rdma_resolve_addr(cm_id, (struct sockaddr *)&clt_path->s.src_addr,
(struct sockaddr *)&clt_path->s.dst_addr,
RTRS_CONNECT_TIMEOUT_MS);
if (err) {
- rtrs_err(s, "Failed to resolve address, err: %d\n", err);
+ rtrs_err(s, "Failed to resolve address, err: %pe\n", ERR_PTR(err));
return err;
}
/*
@@ -2548,7 +2580,7 @@ static int rtrs_send_path_info(struct rtrs_clt_path *clt_path)
/* Prepare for getting info response */
err = rtrs_iu_post_recv(&usr_con->c, rx_iu);
if (err) {
- rtrs_err(clt_path->clt, "rtrs_iu_post_recv(), err: %d\n", err);
+ rtrs_err(clt_path->clt, "rtrs_iu_post_recv(), err: %pe\n", ERR_PTR(err));
goto out;
}
rx_iu = NULL;
@@ -2564,7 +2596,7 @@ static int rtrs_send_path_info(struct rtrs_clt_path *clt_path)
/* Send info request */
err = rtrs_iu_post_send(&usr_con->c, tx_iu, sizeof(*msg), NULL);
if (err) {
- rtrs_err(clt_path->clt, "rtrs_iu_post_send(), err: %d\n", err);
+ rtrs_err(clt_path->clt, "rtrs_iu_post_send(), err: %pe\n", ERR_PTR(err));
goto out;
}
tx_iu = NULL;
@@ -2615,15 +2647,15 @@ static int init_path(struct rtrs_clt_path *clt_path)
err = init_conns(clt_path);
if (err) {
rtrs_err(clt_path->clt,
- "init_conns() failed: err=%d path=%s [%s:%u]\n", err,
- str, clt_path->hca_name, clt_path->hca_port);
+ "init_conns() failed: err=%pe path=%s [%s:%u]\n",
+ ERR_PTR(err), str, clt_path->hca_name, clt_path->hca_port);
goto out;
}
err = rtrs_send_path_info(clt_path);
if (err) {
rtrs_err(clt_path->clt,
- "rtrs_send_path_info() failed: err=%d path=%s [%s:%u]\n",
- err, str, clt_path->hca_name, clt_path->hca_port);
+ "rtrs_send_path_info() failed: err=%pe path=%s [%s:%u]\n",
+ ERR_PTR(err), str, clt_path->hca_name, clt_path->hca_port);
goto out;
}
rtrs_clt_path_up(clt_path);
@@ -3147,8 +3179,11 @@ close_path:
void rtrs_clt_ib_event_handler(struct ib_event_handler *handler,
struct ib_event *ibevent)
{
- pr_info("Handling event: %s (%d).\n", ib_event_msg(ibevent->event),
- ibevent->event);
+ struct ib_device *idev = ibevent->device;
+ u32 port_num = ibevent->element.port_num;
+
+ pr_info("Handling event: %s (%d). HCA name: %s, port num: %u\n",
+ ib_event_msg(ibevent->event), ibevent->event, idev->name, port_num);
}