From: Kim Zhu Date: Wed, 7 Jan 2026 16:15:11 +0000 (+0100) Subject: RDMA/rtrs: Improve error logging for RDMA cm events X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f85febf57bb567b59b41a13c9bf845a73b616d10;p=thirdparty%2Fkernel%2Flinux.git RDMA/rtrs: Improve error logging for RDMA cm events The member variable status in the struct rdma_cm_event is used for both linux errors and the errors definded in rdma stack. Signed-off-by: Kim Zhu Reviewed-by: Md Haris Iqbal Signed-off-by: Grzegorz Prajsner Link: https://patch.msgid.link/20260107161517.56357-5-haris.iqbal@ionos.com Signed-off-by: Leon Romanovsky --- diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c index 58042d835045f..1cd4d333d4179 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c @@ -1946,8 +1946,8 @@ static int rtrs_rdma_conn_rejected(struct rtrs_clt_con *con, status, rej_msg, ERR_PTR(errno)); } else { rtrs_err(s, - "Connect rejected but with malformed message: status %pe (%s)\n", - ERR_PTR(status), rej_msg); + "Connect rejected but with malformed message: status %d (%s)\n", + status, rej_msg); } return -ECONNRESET; @@ -2014,27 +2014,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: %pe)\n", - rdma_event_msg(ev->event), ERR_PTR(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: %pe)\n", - rdma_event_msg(ev->event), ERR_PTR(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: %pe\n", rdma_event_msg(ev->event), - ERR_PTR(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: %pe)\n", - rdma_event_msg(ev->event), ERR_PTR(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; } diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c index 7ed8910ef7f5a..9b8567e5ea38f 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c @@ -2012,8 +2012,15 @@ static int rtrs_srv_rdma_cm_handler(struct rdma_cm_id *cm_id, case RDMA_CM_EVENT_REJECTED: case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_UNREACHABLE: - rtrs_err(s, "CM error (CM event: %s, err: %pe)\n", - rdma_event_msg(ev->event), ERR_PTR(ev->status)); + if (ev->status < 0) { + rtrs_err(s, "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, "CM error (CM event: %s, err: %s)\n", + rdma_event_msg(ev->event), + rdma_reject_msg(cm_id, ev->status)); + } fallthrough; case RDMA_CM_EVENT_DISCONNECTED: case RDMA_CM_EVENT_ADDR_CHANGE: @@ -2022,8 +2029,15 @@ static int rtrs_srv_rdma_cm_handler(struct rdma_cm_id *cm_id, close_path(srv_path); break; default: - pr_err("Ignoring unexpected CM event %s, err %pe\n", - rdma_event_msg(ev->event), ERR_PTR(ev->status)); + if (ev->status < 0) { + pr_err("Ignoring unexpected CM event %s, err %pe\n", + rdma_event_msg(ev->event), + ERR_PTR(ev->status)); + } else if (ev->status > 0) { + pr_err("Ignoring unexpected CM event %s, err %s\n", + rdma_event_msg(ev->event), + rdma_reject_msg(cm_id, ev->status)); + } break; }