svcrdma: Add tracepoints to report ->xpo_accept failures
Failure to accept a connection is typically due to a problem specific to a transport type. Also, ->xpo_accept returns NULL on error rather than reporting a specific problem. So, add failure-specific tracepoints in svc_rdma_accept(). Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
decc13f7eb
commit
e979a173a0
|
@ -1309,9 +1309,45 @@ DECLARE_EVENT_CLASS(svcrdma_xprt_event,
|
||||||
TP_ARGS(xprt))
|
TP_ARGS(xprt))
|
||||||
|
|
||||||
DEFINE_XPRT_EVENT(accept);
|
DEFINE_XPRT_EVENT(accept);
|
||||||
DEFINE_XPRT_EVENT(fail);
|
|
||||||
DEFINE_XPRT_EVENT(free);
|
DEFINE_XPRT_EVENT(free);
|
||||||
|
|
||||||
|
DECLARE_EVENT_CLASS(svcrdma_accept_class,
|
||||||
|
TP_PROTO(
|
||||||
|
const struct svcxprt_rdma *rdma,
|
||||||
|
long status
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_ARGS(rdma, status),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(long, status)
|
||||||
|
__string(addr, rdma->sc_xprt.xpt_remotebuf)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->status = status;
|
||||||
|
__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("addr=%s status=%ld",
|
||||||
|
__get_str(addr), __entry->status
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
#define DEFINE_ACCEPT_EVENT(name) \
|
||||||
|
DEFINE_EVENT(svcrdma_accept_class, svcrdma_##name##_err, \
|
||||||
|
TP_PROTO( \
|
||||||
|
const struct svcxprt_rdma *rdma, \
|
||||||
|
long status \
|
||||||
|
), \
|
||||||
|
TP_ARGS(rdma, status))
|
||||||
|
|
||||||
|
DEFINE_ACCEPT_EVENT(pd);
|
||||||
|
DEFINE_ACCEPT_EVENT(qp);
|
||||||
|
DEFINE_ACCEPT_EVENT(fabric);
|
||||||
|
DEFINE_ACCEPT_EVENT(initdepth);
|
||||||
|
DEFINE_ACCEPT_EVENT(accept);
|
||||||
|
|
||||||
TRACE_DEFINE_ENUM(RDMA_MSG);
|
TRACE_DEFINE_ENUM(RDMA_MSG);
|
||||||
TRACE_DEFINE_ENUM(RDMA_NOMSG);
|
TRACE_DEFINE_ENUM(RDMA_NOMSG);
|
||||||
TRACE_DEFINE_ENUM(RDMA_MSGP);
|
TRACE_DEFINE_ENUM(RDMA_MSGP);
|
||||||
|
|
|
@ -410,9 +410,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
if (!newxprt)
|
if (!newxprt)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dprintk("svcrdma: newxprt from accept queue = %p, cm_id=%p\n",
|
|
||||||
newxprt, newxprt->sc_cm_id);
|
|
||||||
|
|
||||||
dev = newxprt->sc_cm_id->device;
|
dev = newxprt->sc_cm_id->device;
|
||||||
newxprt->sc_port_num = newxprt->sc_cm_id->port_num;
|
newxprt->sc_port_num = newxprt->sc_cm_id->port_num;
|
||||||
|
|
||||||
|
@ -448,21 +445,17 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
|
|
||||||
newxprt->sc_pd = ib_alloc_pd(dev, 0);
|
newxprt->sc_pd = ib_alloc_pd(dev, 0);
|
||||||
if (IS_ERR(newxprt->sc_pd)) {
|
if (IS_ERR(newxprt->sc_pd)) {
|
||||||
dprintk("svcrdma: error creating PD for connect request\n");
|
trace_svcrdma_pd_err(newxprt, PTR_ERR(newxprt->sc_pd));
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
newxprt->sc_sq_cq = ib_alloc_cq_any(dev, newxprt, newxprt->sc_sq_depth,
|
newxprt->sc_sq_cq = ib_alloc_cq_any(dev, newxprt, newxprt->sc_sq_depth,
|
||||||
IB_POLL_WORKQUEUE);
|
IB_POLL_WORKQUEUE);
|
||||||
if (IS_ERR(newxprt->sc_sq_cq)) {
|
if (IS_ERR(newxprt->sc_sq_cq))
|
||||||
dprintk("svcrdma: error creating SQ CQ for connect request\n");
|
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
|
||||||
newxprt->sc_rq_cq =
|
newxprt->sc_rq_cq =
|
||||||
ib_alloc_cq_any(dev, newxprt, rq_depth, IB_POLL_WORKQUEUE);
|
ib_alloc_cq_any(dev, newxprt, rq_depth, IB_POLL_WORKQUEUE);
|
||||||
if (IS_ERR(newxprt->sc_rq_cq)) {
|
if (IS_ERR(newxprt->sc_rq_cq))
|
||||||
dprintk("svcrdma: error creating RQ CQ for connect request\n");
|
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
|
||||||
|
|
||||||
memset(&qp_attr, 0, sizeof qp_attr);
|
memset(&qp_attr, 0, sizeof qp_attr);
|
||||||
qp_attr.event_handler = qp_event_handler;
|
qp_attr.event_handler = qp_event_handler;
|
||||||
|
@ -486,7 +479,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
|
|
||||||
ret = rdma_create_qp(newxprt->sc_cm_id, newxprt->sc_pd, &qp_attr);
|
ret = rdma_create_qp(newxprt->sc_cm_id, newxprt->sc_pd, &qp_attr);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dprintk("svcrdma: failed to create QP, ret=%d\n", ret);
|
trace_svcrdma_qp_err(newxprt, ret);
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
newxprt->sc_qp = newxprt->sc_cm_id->qp;
|
newxprt->sc_qp = newxprt->sc_cm_id->qp;
|
||||||
|
@ -494,8 +487,10 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
if (!(dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
|
if (!(dev->attrs.device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
|
||||||
newxprt->sc_snd_w_inv = false;
|
newxprt->sc_snd_w_inv = false;
|
||||||
if (!rdma_protocol_iwarp(dev, newxprt->sc_port_num) &&
|
if (!rdma_protocol_iwarp(dev, newxprt->sc_port_num) &&
|
||||||
!rdma_ib_or_roce(dev, newxprt->sc_port_num))
|
!rdma_ib_or_roce(dev, newxprt->sc_port_num)) {
|
||||||
|
trace_svcrdma_fabric_err(newxprt, -EINVAL);
|
||||||
goto errout;
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
if (!svc_rdma_post_recvs(newxprt))
|
if (!svc_rdma_post_recvs(newxprt))
|
||||||
goto errout;
|
goto errout;
|
||||||
|
@ -517,15 +512,17 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
conn_param.initiator_depth = min_t(int, newxprt->sc_ord,
|
conn_param.initiator_depth = min_t(int, newxprt->sc_ord,
|
||||||
dev->attrs.max_qp_init_rd_atom);
|
dev->attrs.max_qp_init_rd_atom);
|
||||||
if (!conn_param.initiator_depth) {
|
if (!conn_param.initiator_depth) {
|
||||||
dprintk("svcrdma: invalid ORD setting\n");
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
trace_svcrdma_initdepth_err(newxprt, ret);
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
conn_param.private_data = &pmsg;
|
conn_param.private_data = &pmsg;
|
||||||
conn_param.private_data_len = sizeof(pmsg);
|
conn_param.private_data_len = sizeof(pmsg);
|
||||||
ret = rdma_accept(newxprt->sc_cm_id, &conn_param);
|
ret = rdma_accept(newxprt->sc_cm_id, &conn_param);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
trace_svcrdma_accept_err(newxprt, ret);
|
||||||
goto errout;
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
|
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
|
||||||
dprintk("svcrdma: new connection %p accepted:\n", newxprt);
|
dprintk("svcrdma: new connection %p accepted:\n", newxprt);
|
||||||
|
@ -544,8 +541,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
|
||||||
return &newxprt->sc_xprt;
|
return &newxprt->sc_xprt;
|
||||||
|
|
||||||
errout:
|
errout:
|
||||||
dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret);
|
|
||||||
trace_svcrdma_xprt_fail(&newxprt->sc_xprt);
|
|
||||||
/* Take a reference in case the DTO handler runs */
|
/* Take a reference in case the DTO handler runs */
|
||||||
svc_xprt_get(&newxprt->sc_xprt);
|
svc_xprt_get(&newxprt->sc_xprt);
|
||||||
if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
|
if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp))
|
||||||
|
|
Loading…
Reference in New Issue