1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Trace point definitions for the RDMA Connect Manager. 4 * 5 * Author: Chuck Lever <chuck.lever@oracle.com> 6 * 7 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. 8 */ 9 10 #undef TRACE_SYSTEM 11 #define TRACE_SYSTEM rdma_cma 12 13 #if !defined(_TRACE_RDMA_CMA_H) || defined(TRACE_HEADER_MULTI_READ) 14 15 #define _TRACE_RDMA_CMA_H 16 17 #include <linux/tracepoint.h> 18 #include <trace/events/rdma.h> 19 20 21 DECLARE_EVENT_CLASS(cma_fsm_class, 22 TP_PROTO( 23 const struct rdma_id_private *id_priv 24 ), 25 26 TP_ARGS(id_priv), 27 28 TP_STRUCT__entry( 29 __field(u32, cm_id) 30 __field(u32, tos) 31 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 32 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 33 ), 34 35 TP_fast_assign( 36 __entry->cm_id = id_priv->res.id; 37 __entry->tos = id_priv->tos; 38 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 39 sizeof(struct sockaddr_in6)); 40 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 41 sizeof(struct sockaddr_in6)); 42 ), 43 44 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u", 45 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos 46 ) 47 ); 48 49 #define DEFINE_CMA_FSM_EVENT(name) \ 50 DEFINE_EVENT(cma_fsm_class, cm_##name, \ 51 TP_PROTO( \ 52 const struct rdma_id_private *id_priv \ 53 ), \ 54 TP_ARGS(id_priv)) 55 56 DEFINE_CMA_FSM_EVENT(send_rtu); 57 DEFINE_CMA_FSM_EVENT(send_rej); 58 DEFINE_CMA_FSM_EVENT(send_mra); 59 DEFINE_CMA_FSM_EVENT(send_sidr_req); 60 DEFINE_CMA_FSM_EVENT(send_sidr_rep); 61 DEFINE_CMA_FSM_EVENT(disconnect); 62 DEFINE_CMA_FSM_EVENT(sent_drep); 63 DEFINE_CMA_FSM_EVENT(sent_dreq); 64 DEFINE_CMA_FSM_EVENT(id_destroy); 65 66 TRACE_EVENT(cm_id_attach, 67 TP_PROTO( 68 const struct rdma_id_private *id_priv, 69 const struct ib_device *device 70 ), 71 72 TP_ARGS(id_priv, device), 73 74 TP_STRUCT__entry( 75 __field(u32, cm_id) 76 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 77 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 78 __string(devname, device->name) 79 ), 80 81 TP_fast_assign( 82 __entry->cm_id = id_priv->res.id; 83 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 84 sizeof(struct sockaddr_in6)); 85 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 86 sizeof(struct sockaddr_in6)); 87 __assign_str(devname, device->name); 88 ), 89 90 TP_printk("cm.id=%u src=%pISpc dst=%pISpc device=%s", 91 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, 92 __get_str(devname) 93 ) 94 ); 95 96 DECLARE_EVENT_CLASS(cma_qp_class, 97 TP_PROTO( 98 const struct rdma_id_private *id_priv 99 ), 100 101 TP_ARGS(id_priv), 102 103 TP_STRUCT__entry( 104 __field(u32, cm_id) 105 __field(u32, tos) 106 __field(u32, qp_num) 107 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 108 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 109 ), 110 111 TP_fast_assign( 112 __entry->cm_id = id_priv->res.id; 113 __entry->tos = id_priv->tos; 114 __entry->qp_num = id_priv->qp_num; 115 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 116 sizeof(struct sockaddr_in6)); 117 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 118 sizeof(struct sockaddr_in6)); 119 ), 120 121 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u qp_num=%u", 122 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 123 __entry->qp_num 124 ) 125 ); 126 127 #define DEFINE_CMA_QP_EVENT(name) \ 128 DEFINE_EVENT(cma_qp_class, cm_##name, \ 129 TP_PROTO( \ 130 const struct rdma_id_private *id_priv \ 131 ), \ 132 TP_ARGS(id_priv)) 133 134 DEFINE_CMA_QP_EVENT(send_req); 135 DEFINE_CMA_QP_EVENT(send_rep); 136 DEFINE_CMA_QP_EVENT(qp_destroy); 137 138 /* 139 * enum ib_wp_type, from include/rdma/ib_verbs.h 140 */ 141 #define IB_QP_TYPE_LIST \ 142 ib_qp_type(SMI) \ 143 ib_qp_type(GSI) \ 144 ib_qp_type(RC) \ 145 ib_qp_type(UC) \ 146 ib_qp_type(UD) \ 147 ib_qp_type(RAW_IPV6) \ 148 ib_qp_type(RAW_ETHERTYPE) \ 149 ib_qp_type(RAW_PACKET) \ 150 ib_qp_type(XRC_INI) \ 151 ib_qp_type_end(XRC_TGT) 152 153 #undef ib_qp_type 154 #undef ib_qp_type_end 155 156 #define ib_qp_type(x) TRACE_DEFINE_ENUM(IB_QPT_##x); 157 #define ib_qp_type_end(x) TRACE_DEFINE_ENUM(IB_QPT_##x); 158 159 IB_QP_TYPE_LIST 160 161 #undef ib_qp_type 162 #undef ib_qp_type_end 163 164 #define ib_qp_type(x) { IB_QPT_##x, #x }, 165 #define ib_qp_type_end(x) { IB_QPT_##x, #x } 166 167 #define rdma_show_qp_type(x) \ 168 __print_symbolic(x, IB_QP_TYPE_LIST) 169 170 171 TRACE_EVENT(cm_qp_create, 172 TP_PROTO( 173 const struct rdma_id_private *id_priv, 174 const struct ib_pd *pd, 175 const struct ib_qp_init_attr *qp_init_attr, 176 int rc 177 ), 178 179 TP_ARGS(id_priv, pd, qp_init_attr, rc), 180 181 TP_STRUCT__entry( 182 __field(u32, cm_id) 183 __field(u32, pd_id) 184 __field(u32, tos) 185 __field(u32, qp_num) 186 __field(u32, send_wr) 187 __field(u32, recv_wr) 188 __field(int, rc) 189 __field(unsigned long, qp_type) 190 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 191 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 192 ), 193 194 TP_fast_assign( 195 __entry->cm_id = id_priv->res.id; 196 __entry->pd_id = pd->res.id; 197 __entry->tos = id_priv->tos; 198 __entry->send_wr = qp_init_attr->cap.max_send_wr; 199 __entry->recv_wr = qp_init_attr->cap.max_recv_wr; 200 __entry->rc = rc; 201 if (!rc) { 202 __entry->qp_num = id_priv->qp_num; 203 __entry->qp_type = id_priv->id.qp_type; 204 } else { 205 __entry->qp_num = 0; 206 __entry->qp_type = 0; 207 } 208 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 209 sizeof(struct sockaddr_in6)); 210 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 211 sizeof(struct sockaddr_in6)); 212 ), 213 214 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u pd.id=%u qp_type=%s" 215 " send_wr=%u recv_wr=%u qp_num=%u rc=%d", 216 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, 217 __entry->tos, __entry->pd_id, 218 rdma_show_qp_type(__entry->qp_type), __entry->send_wr, 219 __entry->recv_wr, __entry->qp_num, __entry->rc 220 ) 221 ); 222 223 TRACE_EVENT(cm_req_handler, 224 TP_PROTO( 225 const struct rdma_id_private *id_priv, 226 int event 227 ), 228 229 TP_ARGS(id_priv, event), 230 231 TP_STRUCT__entry( 232 __field(u32, cm_id) 233 __field(u32, tos) 234 __field(unsigned long, event) 235 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 236 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 237 ), 238 239 TP_fast_assign( 240 __entry->cm_id = id_priv->res.id; 241 __entry->tos = id_priv->tos; 242 __entry->event = event; 243 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 244 sizeof(struct sockaddr_in6)); 245 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 246 sizeof(struct sockaddr_in6)); 247 ), 248 249 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu)", 250 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 251 rdma_show_ib_cm_event(__entry->event), __entry->event 252 ) 253 ); 254 255 TRACE_EVENT(cm_event_handler, 256 TP_PROTO( 257 const struct rdma_id_private *id_priv, 258 const struct rdma_cm_event *event 259 ), 260 261 TP_ARGS(id_priv, event), 262 263 TP_STRUCT__entry( 264 __field(u32, cm_id) 265 __field(u32, tos) 266 __field(unsigned long, event) 267 __field(int, status) 268 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 269 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 270 ), 271 272 TP_fast_assign( 273 __entry->cm_id = id_priv->res.id; 274 __entry->tos = id_priv->tos; 275 __entry->event = event->event; 276 __entry->status = event->status; 277 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 278 sizeof(struct sockaddr_in6)); 279 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 280 sizeof(struct sockaddr_in6)); 281 ), 282 283 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu/%d)", 284 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 285 rdma_show_cm_event(__entry->event), __entry->event, 286 __entry->status 287 ) 288 ); 289 290 TRACE_EVENT(cm_event_done, 291 TP_PROTO( 292 const struct rdma_id_private *id_priv, 293 const struct rdma_cm_event *event, 294 int result 295 ), 296 297 TP_ARGS(id_priv, event, result), 298 299 TP_STRUCT__entry( 300 __field(u32, cm_id) 301 __field(u32, tos) 302 __field(unsigned long, event) 303 __field(int, result) 304 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 305 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 306 ), 307 308 TP_fast_assign( 309 __entry->cm_id = id_priv->res.id; 310 __entry->tos = id_priv->tos; 311 __entry->event = event->event; 312 __entry->result = result; 313 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 314 sizeof(struct sockaddr_in6)); 315 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 316 sizeof(struct sockaddr_in6)); 317 ), 318 319 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s consumer returns %d", 320 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 321 rdma_show_cm_event(__entry->event), __entry->result 322 ) 323 ); 324 325 DECLARE_EVENT_CLASS(cma_client_class, 326 TP_PROTO( 327 const struct ib_device *device 328 ), 329 330 TP_ARGS(device), 331 332 TP_STRUCT__entry( 333 __string(name, device->name) 334 ), 335 336 TP_fast_assign( 337 __assign_str(name, device->name); 338 ), 339 340 TP_printk("device name=%s", 341 __get_str(name) 342 ) 343 ); 344 345 #define DEFINE_CMA_CLIENT_EVENT(name) \ 346 DEFINE_EVENT(cma_client_class, cm_##name, \ 347 TP_PROTO( \ 348 const struct ib_device *device \ 349 ), \ 350 TP_ARGS(device)) 351 352 DEFINE_CMA_CLIENT_EVENT(add_one); 353 DEFINE_CMA_CLIENT_EVENT(remove_one); 354 355 #endif /* _TRACE_RDMA_CMA_H */ 356 357 #undef TRACE_INCLUDE_PATH 358 #define TRACE_INCLUDE_PATH . 359 #define TRACE_INCLUDE_FILE cma_trace 360 361 #include <trace/define_trace.h> 362