| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * Trace point definitions for the RDMA Connect Manager. | |
| * | |
| * Author: Chuck Lever <chuck.lever@oracle.com> | |
| * | |
| * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. | |
| */ | |
| #undef TRACE_SYSTEM | |
| #define TRACE_SYSTEM rdma_cma | |
| #if !defined(_TRACE_RDMA_CMA_H) || defined(TRACE_HEADER_MULTI_READ) | |
| #define _TRACE_RDMA_CMA_H | |
| #include <linux/tracepoint.h> | |
| #include <trace/misc/rdma.h> | |
| DECLARE_EVENT_CLASS(cma_fsm_class, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv | |
| ), | |
| TP_ARGS(id_priv), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, tos) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->tos = id_priv->tos; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos | |
| ) | |
| ); | |
| #define DEFINE_CMA_FSM_EVENT(name) \ | |
| DEFINE_EVENT(cma_fsm_class, cm_##name, \ | |
| TP_PROTO( \ | |
| const struct rdma_id_private *id_priv \ | |
| ), \ | |
| TP_ARGS(id_priv)) | |
| DEFINE_CMA_FSM_EVENT(send_rtu); | |
| DEFINE_CMA_FSM_EVENT(send_rej); | |
| DEFINE_CMA_FSM_EVENT(send_mra); | |
| DEFINE_CMA_FSM_EVENT(send_sidr_req); | |
| DEFINE_CMA_FSM_EVENT(send_sidr_rep); | |
| DEFINE_CMA_FSM_EVENT(disconnect); | |
| DEFINE_CMA_FSM_EVENT(sent_drep); | |
| DEFINE_CMA_FSM_EVENT(sent_dreq); | |
| DEFINE_CMA_FSM_EVENT(id_destroy); | |
| TRACE_EVENT(cm_id_attach, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv, | |
| const struct ib_device *device | |
| ), | |
| TP_ARGS(id_priv, device), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| __string(devname, device->name) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| __assign_str(devname); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc device=%s", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, | |
| __get_str(devname) | |
| ) | |
| ); | |
| DECLARE_EVENT_CLASS(cma_qp_class, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv | |
| ), | |
| TP_ARGS(id_priv), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, tos) | |
| __field(u32, qp_num) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->tos = id_priv->tos; | |
| __entry->qp_num = id_priv->qp_num; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u qp_num=%u", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, | |
| __entry->qp_num | |
| ) | |
| ); | |
| #define DEFINE_CMA_QP_EVENT(name) \ | |
| DEFINE_EVENT(cma_qp_class, cm_##name, \ | |
| TP_PROTO( \ | |
| const struct rdma_id_private *id_priv \ | |
| ), \ | |
| TP_ARGS(id_priv)) | |
| DEFINE_CMA_QP_EVENT(send_req); | |
| DEFINE_CMA_QP_EVENT(send_rep); | |
| DEFINE_CMA_QP_EVENT(qp_destroy); | |
| /* | |
| * enum ib_wp_type, from include/rdma/ib_verbs.h | |
| */ | |
| #define IB_QP_TYPE_LIST \ | |
| ib_qp_type(SMI) \ | |
| ib_qp_type(GSI) \ | |
| ib_qp_type(RC) \ | |
| ib_qp_type(UC) \ | |
| ib_qp_type(UD) \ | |
| ib_qp_type(RAW_IPV6) \ | |
| ib_qp_type(RAW_ETHERTYPE) \ | |
| ib_qp_type(RAW_PACKET) \ | |
| ib_qp_type(XRC_INI) \ | |
| ib_qp_type_end(XRC_TGT) | |
| #undef ib_qp_type | |
| #undef ib_qp_type_end | |
| #define ib_qp_type(x) TRACE_DEFINE_ENUM(IB_QPT_##x); | |
| #define ib_qp_type_end(x) TRACE_DEFINE_ENUM(IB_QPT_##x); | |
| IB_QP_TYPE_LIST | |
| #undef ib_qp_type | |
| #undef ib_qp_type_end | |
| #define ib_qp_type(x) { IB_QPT_##x, #x }, | |
| #define ib_qp_type_end(x) { IB_QPT_##x, #x } | |
| #define rdma_show_qp_type(x) \ | |
| __print_symbolic(x, IB_QP_TYPE_LIST) | |
| TRACE_EVENT(cm_qp_create, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv, | |
| const struct ib_pd *pd, | |
| const struct ib_qp_init_attr *qp_init_attr, | |
| int rc | |
| ), | |
| TP_ARGS(id_priv, pd, qp_init_attr, rc), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, pd_id) | |
| __field(u32, tos) | |
| __field(u32, qp_num) | |
| __field(u32, send_wr) | |
| __field(u32, recv_wr) | |
| __field(int, rc) | |
| __field(unsigned long, qp_type) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->pd_id = pd->res.id; | |
| __entry->tos = id_priv->tos; | |
| __entry->send_wr = qp_init_attr->cap.max_send_wr; | |
| __entry->recv_wr = qp_init_attr->cap.max_recv_wr; | |
| __entry->rc = rc; | |
| if (!rc) { | |
| __entry->qp_num = id_priv->qp_num; | |
| __entry->qp_type = id_priv->id.qp_type; | |
| } else { | |
| __entry->qp_num = 0; | |
| __entry->qp_type = 0; | |
| } | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u pd.id=%u qp_type=%s" | |
| " send_wr=%u recv_wr=%u qp_num=%u rc=%d", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, | |
| __entry->tos, __entry->pd_id, | |
| rdma_show_qp_type(__entry->qp_type), __entry->send_wr, | |
| __entry->recv_wr, __entry->qp_num, __entry->rc | |
| ) | |
| ); | |
| TRACE_EVENT(cm_req_handler, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv, | |
| int event | |
| ), | |
| TP_ARGS(id_priv, event), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, tos) | |
| __field(unsigned long, event) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->tos = id_priv->tos; | |
| __entry->event = event; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu)", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, | |
| rdma_show_ib_cm_event(__entry->event), __entry->event | |
| ) | |
| ); | |
| TRACE_EVENT(cm_event_handler, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv, | |
| const struct rdma_cm_event *event | |
| ), | |
| TP_ARGS(id_priv, event), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, tos) | |
| __field(unsigned long, event) | |
| __field(int, status) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->tos = id_priv->tos; | |
| __entry->event = event->event; | |
| __entry->status = event->status; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu/%d)", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, | |
| rdma_show_cm_event(__entry->event), __entry->event, | |
| __entry->status | |
| ) | |
| ); | |
| TRACE_EVENT(cm_event_done, | |
| TP_PROTO( | |
| const struct rdma_id_private *id_priv, | |
| const struct rdma_cm_event *event, | |
| int result | |
| ), | |
| TP_ARGS(id_priv, event, result), | |
| TP_STRUCT__entry( | |
| __field(u32, cm_id) | |
| __field(u32, tos) | |
| __field(unsigned long, event) | |
| __field(int, result) | |
| __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) | |
| __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) | |
| ), | |
| TP_fast_assign( | |
| __entry->cm_id = id_priv->res.id; | |
| __entry->tos = id_priv->tos; | |
| __entry->event = event->event; | |
| __entry->result = result; | |
| memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, | |
| sizeof(struct sockaddr_in6)); | |
| memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, | |
| sizeof(struct sockaddr_in6)); | |
| ), | |
| TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s consumer returns %d", | |
| __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, | |
| rdma_show_cm_event(__entry->event), __entry->result | |
| ) | |
| ); | |
| DECLARE_EVENT_CLASS(cma_client_class, | |
| TP_PROTO( | |
| const struct ib_device *device | |
| ), | |
| TP_ARGS(device), | |
| TP_STRUCT__entry( | |
| __string(name, device->name) | |
| ), | |
| TP_fast_assign( | |
| __assign_str(name); | |
| ), | |
| TP_printk("device name=%s", | |
| __get_str(name) | |
| ) | |
| ); | |
| #define DEFINE_CMA_CLIENT_EVENT(name) \ | |
| DEFINE_EVENT(cma_client_class, cm_##name, \ | |
| TP_PROTO( \ | |
| const struct ib_device *device \ | |
| ), \ | |
| TP_ARGS(device)) | |
| DEFINE_CMA_CLIENT_EVENT(add_one); | |
| DEFINE_CMA_CLIENT_EVENT(remove_one); | |
| #endif /* _TRACE_RDMA_CMA_H */ | |
| #undef TRACE_INCLUDE_PATH | |
| #define TRACE_INCLUDE_PATH . | |
| #define TRACE_INCLUDE_FILE cma_trace | |
| #include <trace/define_trace.h> |