mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
8dc105befe
Surface the operation of MAD exchanges during connection establishment. Some samples: [root@klimt ~]# trace-cmd report -F ib_cma cpus=4 kworker/0:4-123 [000] 60.677388: icm_send_rep: local_id=1965336542 remote_id=1096195961 state=REQ_RCVD lap_state=LAP_UNINIT kworker/u8:11-391 [002] 60.678808: icm_send_req: local_id=1982113758 remote_id=0 state=IDLE lap_state=LAP_UNINIT kworker/0:4-123 [000] 60.679652: icm_send_rtu: local_id=1982113758 remote_id=1079418745 state=REP_RCVD lap_state=LAP_UNINIT nfsd-1954 [001] 60.691350: icm_send_rep: local_id=1998890974 remote_id=1129750393 state=MRA_REQ_SENT lap_state=LAP_UNINIT nfsd-1954 [003] 62.017931: icm_send_drep: local_id=1998890974 remote_id=1129750393 state=TIMEWAIT lap_state=LAP_UNINIT Link: https://lore.kernel.org/r/159767240197.2968.12048458026453596018.stgit@klimt.1015granger.net Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
414 lines
9.7 KiB
C
414 lines
9.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Trace point definitions for the RDMA Connect Manager.
|
|
*
|
|
* Author: Chuck Lever <chuck.lever@oracle.com>
|
|
*
|
|
* Copyright (c) 2020 Oracle and/or its affiliates.
|
|
*/
|
|
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM ib_cma
|
|
|
|
#if !defined(_TRACE_IB_CMA_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
|
|
#define _TRACE_IB_CMA_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
#include <rdma/ib_cm.h>
|
|
#include <trace/events/rdma.h>
|
|
|
|
/*
|
|
* enum ib_cm_state, from include/rdma/ib_cm.h
|
|
*/
|
|
#define IB_CM_STATE_LIST \
|
|
ib_cm_state(IDLE) \
|
|
ib_cm_state(LISTEN) \
|
|
ib_cm_state(REQ_SENT) \
|
|
ib_cm_state(REQ_RCVD) \
|
|
ib_cm_state(MRA_REQ_SENT) \
|
|
ib_cm_state(MRA_REQ_RCVD) \
|
|
ib_cm_state(REP_SENT) \
|
|
ib_cm_state(REP_RCVD) \
|
|
ib_cm_state(MRA_REP_SENT) \
|
|
ib_cm_state(MRA_REP_RCVD) \
|
|
ib_cm_state(ESTABLISHED) \
|
|
ib_cm_state(DREQ_SENT) \
|
|
ib_cm_state(DREQ_RCVD) \
|
|
ib_cm_state(TIMEWAIT) \
|
|
ib_cm_state(SIDR_REQ_SENT) \
|
|
ib_cm_state_end(SIDR_REQ_RCVD)
|
|
|
|
#undef ib_cm_state
|
|
#undef ib_cm_state_end
|
|
#define ib_cm_state(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
#define ib_cm_state_end(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
|
|
IB_CM_STATE_LIST
|
|
|
|
#undef ib_cm_state
|
|
#undef ib_cm_state_end
|
|
#define ib_cm_state(x) { IB_CM_##x, #x },
|
|
#define ib_cm_state_end(x) { IB_CM_##x, #x }
|
|
|
|
#define show_ib_cm_state(x) \
|
|
__print_symbolic(x, IB_CM_STATE_LIST)
|
|
|
|
/*
|
|
* enum ib_cm_lap_state, from include/rdma/ib_cm.h
|
|
*/
|
|
#define IB_CM_LAP_STATE_LIST \
|
|
ib_cm_lap_state(LAP_UNINIT) \
|
|
ib_cm_lap_state(LAP_IDLE) \
|
|
ib_cm_lap_state(LAP_SENT) \
|
|
ib_cm_lap_state(LAP_RCVD) \
|
|
ib_cm_lap_state(MRA_LAP_SENT) \
|
|
ib_cm_lap_state_end(MRA_LAP_RCVD)
|
|
|
|
#undef ib_cm_lap_state
|
|
#undef ib_cm_lap_state_end
|
|
#define ib_cm_lap_state(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
#define ib_cm_lap_state_end(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
|
|
IB_CM_LAP_STATE_LIST
|
|
|
|
#undef ib_cm_lap_state
|
|
#undef ib_cm_lap_state_end
|
|
#define ib_cm_lap_state(x) { IB_CM_##x, #x },
|
|
#define ib_cm_lap_state_end(x) { IB_CM_##x, #x }
|
|
|
|
#define show_ib_cm_lap_state(x) \
|
|
__print_symbolic(x, IB_CM_LAP_STATE_LIST)
|
|
|
|
/*
|
|
* enum ib_cm_rej_reason, from include/rdma/ib_cm.h
|
|
*/
|
|
#define IB_CM_REJ_REASON_LIST \
|
|
ib_cm_rej_reason(REJ_NO_QP) \
|
|
ib_cm_rej_reason(REJ_NO_EEC) \
|
|
ib_cm_rej_reason(REJ_NO_RESOURCES) \
|
|
ib_cm_rej_reason(REJ_TIMEOUT) \
|
|
ib_cm_rej_reason(REJ_UNSUPPORTED) \
|
|
ib_cm_rej_reason(REJ_INVALID_COMM_ID) \
|
|
ib_cm_rej_reason(REJ_INVALID_COMM_INSTANCE) \
|
|
ib_cm_rej_reason(REJ_INVALID_SERVICE_ID) \
|
|
ib_cm_rej_reason(REJ_INVALID_TRANSPORT_TYPE) \
|
|
ib_cm_rej_reason(REJ_STALE_CONN) \
|
|
ib_cm_rej_reason(REJ_RDC_NOT_EXIST) \
|
|
ib_cm_rej_reason(REJ_INVALID_GID) \
|
|
ib_cm_rej_reason(REJ_INVALID_LID) \
|
|
ib_cm_rej_reason(REJ_INVALID_SL) \
|
|
ib_cm_rej_reason(REJ_INVALID_TRAFFIC_CLASS) \
|
|
ib_cm_rej_reason(REJ_INVALID_HOP_LIMIT) \
|
|
ib_cm_rej_reason(REJ_INVALID_PACKET_RATE) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_GID) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_LID) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_SL) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_TRAFFIC_CLASS) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_HOP_LIMIT) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_PACKET_RATE) \
|
|
ib_cm_rej_reason(REJ_PORT_CM_REDIRECT) \
|
|
ib_cm_rej_reason(REJ_PORT_REDIRECT) \
|
|
ib_cm_rej_reason(REJ_INVALID_MTU) \
|
|
ib_cm_rej_reason(REJ_INSUFFICIENT_RESP_RESOURCES) \
|
|
ib_cm_rej_reason(REJ_CONSUMER_DEFINED) \
|
|
ib_cm_rej_reason(REJ_INVALID_RNR_RETRY) \
|
|
ib_cm_rej_reason(REJ_DUPLICATE_LOCAL_COMM_ID) \
|
|
ib_cm_rej_reason(REJ_INVALID_CLASS_VERSION) \
|
|
ib_cm_rej_reason(REJ_INVALID_FLOW_LABEL) \
|
|
ib_cm_rej_reason(REJ_INVALID_ALT_FLOW_LABEL) \
|
|
ib_cm_rej_reason_end(REJ_VENDOR_OPTION_NOT_SUPPORTED)
|
|
|
|
#undef ib_cm_rej_reason
|
|
#undef ib_cm_rej_reason_end
|
|
#define ib_cm_rej_reason(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
#define ib_cm_rej_reason_end(x) TRACE_DEFINE_ENUM(IB_CM_##x);
|
|
|
|
IB_CM_REJ_REASON_LIST
|
|
|
|
#undef ib_cm_rej_reason
|
|
#undef ib_cm_rej_reason_end
|
|
#define ib_cm_rej_reason(x) { IB_CM_##x, #x },
|
|
#define ib_cm_rej_reason_end(x) { IB_CM_##x, #x }
|
|
|
|
#define show_ib_cm_rej_reason(x) \
|
|
__print_symbolic(x, IB_CM_REJ_REASON_LIST)
|
|
|
|
DECLARE_EVENT_CLASS(icm_id_class,
|
|
TP_PROTO(
|
|
const struct ib_cm_id *cm_id
|
|
),
|
|
|
|
TP_ARGS(cm_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const void *, cm_id) /* for eBPF scripts */
|
|
__field(unsigned int, local_id)
|
|
__field(unsigned int, remote_id)
|
|
__field(unsigned long, state)
|
|
__field(unsigned long, lap_state)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cm_id = cm_id;
|
|
__entry->local_id = be32_to_cpu(cm_id->local_id);
|
|
__entry->remote_id = be32_to_cpu(cm_id->remote_id);
|
|
__entry->state = cm_id->state;
|
|
__entry->lap_state = cm_id->lap_state;
|
|
),
|
|
|
|
TP_printk("local_id=%u remote_id=%u state=%s lap_state=%s",
|
|
__entry->local_id, __entry->remote_id,
|
|
show_ib_cm_state(__entry->state),
|
|
show_ib_cm_lap_state(__entry->lap_state)
|
|
)
|
|
);
|
|
|
|
#define DEFINE_CM_SEND_EVENT(name) \
|
|
DEFINE_EVENT(icm_id_class, \
|
|
icm_send_##name, \
|
|
TP_PROTO( \
|
|
const struct ib_cm_id *cm_id \
|
|
), \
|
|
TP_ARGS(cm_id))
|
|
|
|
DEFINE_CM_SEND_EVENT(req);
|
|
DEFINE_CM_SEND_EVENT(rep);
|
|
DEFINE_CM_SEND_EVENT(dup_req);
|
|
DEFINE_CM_SEND_EVENT(dup_rep);
|
|
DEFINE_CM_SEND_EVENT(rtu);
|
|
DEFINE_CM_SEND_EVENT(mra);
|
|
DEFINE_CM_SEND_EVENT(sidr_req);
|
|
DEFINE_CM_SEND_EVENT(sidr_rep);
|
|
DEFINE_CM_SEND_EVENT(dreq);
|
|
DEFINE_CM_SEND_EVENT(drep);
|
|
|
|
TRACE_EVENT(icm_send_rej,
|
|
TP_PROTO(
|
|
const struct ib_cm_id *cm_id,
|
|
enum ib_cm_rej_reason reason
|
|
),
|
|
|
|
TP_ARGS(cm_id, reason),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const void *, cm_id)
|
|
__field(u32, local_id)
|
|
__field(u32, remote_id)
|
|
__field(unsigned long, state)
|
|
__field(unsigned long, reason)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cm_id = cm_id;
|
|
__entry->local_id = be32_to_cpu(cm_id->local_id);
|
|
__entry->remote_id = be32_to_cpu(cm_id->remote_id);
|
|
__entry->state = cm_id->state;
|
|
__entry->reason = reason;
|
|
),
|
|
|
|
TP_printk("local_id=%u remote_id=%u state=%s reason=%s",
|
|
__entry->local_id, __entry->remote_id,
|
|
show_ib_cm_state(__entry->state),
|
|
show_ib_cm_rej_reason(__entry->reason)
|
|
)
|
|
);
|
|
|
|
#define DEFINE_CM_ERR_EVENT(name) \
|
|
DEFINE_EVENT(icm_id_class, \
|
|
icm_##name##_err, \
|
|
TP_PROTO( \
|
|
const struct ib_cm_id *cm_id \
|
|
), \
|
|
TP_ARGS(cm_id))
|
|
|
|
DEFINE_CM_ERR_EVENT(send_cm_rtu);
|
|
DEFINE_CM_ERR_EVENT(establish);
|
|
DEFINE_CM_ERR_EVENT(no_listener);
|
|
DEFINE_CM_ERR_EVENT(send_drep);
|
|
DEFINE_CM_ERR_EVENT(dreq_unknown);
|
|
DEFINE_CM_ERR_EVENT(send_unknown_rej);
|
|
DEFINE_CM_ERR_EVENT(rej_unknown);
|
|
DEFINE_CM_ERR_EVENT(send_mra_unknown);
|
|
DEFINE_CM_ERR_EVENT(mra_unknown);
|
|
DEFINE_CM_ERR_EVENT(qp_init);
|
|
DEFINE_CM_ERR_EVENT(qp_rtr);
|
|
DEFINE_CM_ERR_EVENT(qp_rts);
|
|
|
|
DEFINE_EVENT(icm_id_class, \
|
|
icm_dreq_skipped, \
|
|
TP_PROTO( \
|
|
const struct ib_cm_id *cm_id \
|
|
), \
|
|
TP_ARGS(cm_id) \
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(icm_local_class,
|
|
TP_PROTO(
|
|
unsigned int local_id,
|
|
unsigned int remote_id
|
|
),
|
|
|
|
TP_ARGS(local_id, remote_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, local_id)
|
|
__field(unsigned int, remote_id)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->local_id = local_id;
|
|
__entry->remote_id = remote_id;
|
|
),
|
|
|
|
TP_printk("local_id=%u remote_id=%u",
|
|
__entry->local_id, __entry->remote_id
|
|
)
|
|
);
|
|
|
|
#define DEFINE_CM_LOCAL_EVENT(name) \
|
|
DEFINE_EVENT(icm_local_class, \
|
|
icm_##name, \
|
|
TP_PROTO( \
|
|
unsigned int local_id, \
|
|
unsigned int remote_id \
|
|
), \
|
|
TP_ARGS(local_id, remote_id))
|
|
|
|
DEFINE_CM_LOCAL_EVENT(issue_rej);
|
|
DEFINE_CM_LOCAL_EVENT(issue_drep);
|
|
DEFINE_CM_LOCAL_EVENT(staleconn_err);
|
|
DEFINE_CM_LOCAL_EVENT(no_priv_err);
|
|
|
|
DECLARE_EVENT_CLASS(icm_remote_class,
|
|
TP_PROTO(
|
|
u32 remote_id
|
|
),
|
|
|
|
TP_ARGS(remote_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u32, remote_id)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->remote_id = remote_id;
|
|
),
|
|
|
|
TP_printk("remote_id=%u",
|
|
__entry->remote_id
|
|
)
|
|
);
|
|
|
|
#define DEFINE_CM_REMOTE_EVENT(name) \
|
|
DEFINE_EVENT(icm_remote_class, \
|
|
icm_##name, \
|
|
TP_PROTO( \
|
|
u32 remote_id \
|
|
), \
|
|
TP_ARGS(remote_id))
|
|
|
|
DEFINE_CM_REMOTE_EVENT(remote_no_priv_err);
|
|
DEFINE_CM_REMOTE_EVENT(insert_failed_err);
|
|
|
|
TRACE_EVENT(icm_send_rep_err,
|
|
TP_PROTO(
|
|
__be32 local_id,
|
|
enum ib_cm_state state
|
|
),
|
|
|
|
TP_ARGS(local_id, state),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, local_id)
|
|
__field(unsigned long, state)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->local_id = be32_to_cpu(local_id);
|
|
__entry->state = state;
|
|
),
|
|
|
|
TP_printk("local_id=%u state=%s",
|
|
__entry->local_id, show_ib_cm_state(__entry->state)
|
|
)
|
|
);
|
|
|
|
TRACE_EVENT(icm_rep_unknown_err,
|
|
TP_PROTO(
|
|
unsigned int local_id,
|
|
unsigned int remote_id,
|
|
enum ib_cm_state state
|
|
),
|
|
|
|
TP_ARGS(local_id, remote_id, state),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, local_id)
|
|
__field(unsigned int, remote_id)
|
|
__field(unsigned long, state)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->local_id = local_id;
|
|
__entry->remote_id = remote_id;
|
|
__entry->state = state;
|
|
),
|
|
|
|
TP_printk("local_id=%u remote_id=%u state=%s",
|
|
__entry->local_id, __entry->remote_id,
|
|
show_ib_cm_state(__entry->state)
|
|
)
|
|
);
|
|
|
|
TRACE_EVENT(icm_handler_err,
|
|
TP_PROTO(
|
|
enum ib_cm_event_type event
|
|
),
|
|
|
|
TP_ARGS(event),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned long, event)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->event = event;
|
|
),
|
|
|
|
TP_printk("unhandled event=%s",
|
|
rdma_show_ib_cm_event(__entry->event)
|
|
)
|
|
);
|
|
|
|
TRACE_EVENT(icm_mad_send_err,
|
|
TP_PROTO(
|
|
enum ib_cm_state state,
|
|
enum ib_wc_status wc_status
|
|
),
|
|
|
|
TP_ARGS(state, wc_status),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned long, state)
|
|
__field(unsigned long, wc_status)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->state = state;
|
|
__entry->wc_status = wc_status;
|
|
),
|
|
|
|
TP_printk("state=%s completion status=%s",
|
|
show_ib_cm_state(__entry->state),
|
|
rdma_show_wc_status(__entry->wc_status)
|
|
)
|
|
);
|
|
|
|
#endif /* _TRACE_IB_CMA_H */
|
|
|
|
#undef TRACE_INCLUDE_PATH
|
|
#define TRACE_INCLUDE_PATH ../../drivers/infiniband/core
|
|
#define TRACE_INCLUDE_FILE cm_trace
|
|
|
|
#include <trace/define_trace.h>
|