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/misc/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(prepare_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(force_disconnect); 65 DEFINE_CMA_FSM_EVENT(id_destroy); 66 67 TRACE_EVENT(cm_id_attach, 68 TP_PROTO( 69 const struct rdma_id_private *id_priv, 70 const struct ib_device *device 71 ), 72 73 TP_ARGS(id_priv, device), 74 75 TP_STRUCT__entry( 76 __field(u32, cm_id) 77 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 78 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 79 __string(devname, device->name) 80 ), 81 82 TP_fast_assign( 83 __entry->cm_id = id_priv->res.id; 84 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 85 sizeof(struct sockaddr_in6)); 86 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 87 sizeof(struct sockaddr_in6)); 88 __assign_str(devname); 89 ), 90 91 TP_printk("cm.id=%u src=%pISpc dst=%pISpc device=%s", 92 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, 93 __get_str(devname) 94 ) 95 ); 96 97 DECLARE_EVENT_CLASS(cma_qp_class, 98 TP_PROTO( 99 const struct rdma_id_private *id_priv 100 ), 101 102 TP_ARGS(id_priv), 103 104 TP_STRUCT__entry( 105 __field(u32, cm_id) 106 __field(u32, tos) 107 __field(u32, qp_num) 108 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 109 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 110 ), 111 112 TP_fast_assign( 113 __entry->cm_id = id_priv->res.id; 114 __entry->tos = id_priv->tos; 115 __entry->qp_num = id_priv->qp_num; 116 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 117 sizeof(struct sockaddr_in6)); 118 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 119 sizeof(struct sockaddr_in6)); 120 ), 121 122 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u qp_num=%u", 123 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 124 __entry->qp_num 125 ) 126 ); 127 128 #define DEFINE_CMA_QP_EVENT(name) \ 129 DEFINE_EVENT(cma_qp_class, cm_##name, \ 130 TP_PROTO( \ 131 const struct rdma_id_private *id_priv \ 132 ), \ 133 TP_ARGS(id_priv)) 134 135 DEFINE_CMA_QP_EVENT(send_req); 136 DEFINE_CMA_QP_EVENT(send_rep); 137 DEFINE_CMA_QP_EVENT(qp_destroy); 138 139 /* 140 * enum ib_wp_type, from include/rdma/ib_verbs.h 141 */ 142 #define IB_QP_TYPE_LIST \ 143 ib_qp_type(SMI) \ 144 ib_qp_type(GSI) \ 145 ib_qp_type(RC) \ 146 ib_qp_type(UC) \ 147 ib_qp_type(UD) \ 148 ib_qp_type(RAW_IPV6) \ 149 ib_qp_type(RAW_ETHERTYPE) \ 150 ib_qp_type(RAW_PACKET) \ 151 ib_qp_type(XRC_INI) \ 152 ib_qp_type_end(XRC_TGT) 153 154 #undef ib_qp_type 155 #undef ib_qp_type_end 156 157 #define ib_qp_type(x) TRACE_DEFINE_ENUM(IB_QPT_##x); 158 #define ib_qp_type_end(x) TRACE_DEFINE_ENUM(IB_QPT_##x); 159 160 IB_QP_TYPE_LIST 161 162 #undef ib_qp_type 163 #undef ib_qp_type_end 164 165 #define ib_qp_type(x) { IB_QPT_##x, #x }, 166 #define ib_qp_type_end(x) { IB_QPT_##x, #x } 167 168 #define rdma_show_qp_type(x) \ 169 __print_symbolic(x, IB_QP_TYPE_LIST) 170 171 172 TRACE_EVENT(cm_qp_create, 173 TP_PROTO( 174 const struct rdma_id_private *id_priv, 175 const struct ib_pd *pd, 176 const struct ib_qp_init_attr *qp_init_attr, 177 int rc 178 ), 179 180 TP_ARGS(id_priv, pd, qp_init_attr, rc), 181 182 TP_STRUCT__entry( 183 __field(u32, cm_id) 184 __field(u32, pd_id) 185 __field(u32, tos) 186 __field(u32, qp_num) 187 __field(u32, send_wr) 188 __field(u32, recv_wr) 189 __field(int, rc) 190 __field(unsigned long, qp_type) 191 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 192 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 193 ), 194 195 TP_fast_assign( 196 __entry->cm_id = id_priv->res.id; 197 __entry->pd_id = pd->res.id; 198 __entry->tos = id_priv->tos; 199 __entry->send_wr = qp_init_attr->cap.max_send_wr; 200 __entry->recv_wr = qp_init_attr->cap.max_recv_wr; 201 __entry->rc = rc; 202 if (!rc) { 203 __entry->qp_num = id_priv->qp_num; 204 __entry->qp_type = id_priv->id.qp_type; 205 } else { 206 __entry->qp_num = 0; 207 __entry->qp_type = 0; 208 } 209 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 210 sizeof(struct sockaddr_in6)); 211 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 212 sizeof(struct sockaddr_in6)); 213 ), 214 215 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u pd.id=%u qp_type=%s" 216 " send_wr=%u recv_wr=%u qp_num=%u rc=%d", 217 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, 218 __entry->tos, __entry->pd_id, 219 rdma_show_qp_type(__entry->qp_type), __entry->send_wr, 220 __entry->recv_wr, __entry->qp_num, __entry->rc 221 ) 222 ); 223 224 TRACE_EVENT(cm_req_handler, 225 TP_PROTO( 226 const struct rdma_id_private *id_priv, 227 int event 228 ), 229 230 TP_ARGS(id_priv, event), 231 232 TP_STRUCT__entry( 233 __field(u32, cm_id) 234 __field(u32, tos) 235 __field(unsigned long, event) 236 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 237 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 238 ), 239 240 TP_fast_assign( 241 __entry->cm_id = id_priv->res.id; 242 __entry->tos = id_priv->tos; 243 __entry->event = event; 244 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 245 sizeof(struct sockaddr_in6)); 246 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 247 sizeof(struct sockaddr_in6)); 248 ), 249 250 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu)", 251 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 252 rdma_show_ib_cm_event(__entry->event), __entry->event 253 ) 254 ); 255 256 TRACE_EVENT(cm_event_handler, 257 TP_PROTO( 258 const struct rdma_id_private *id_priv, 259 const struct rdma_cm_event *event 260 ), 261 262 TP_ARGS(id_priv, event), 263 264 TP_STRUCT__entry( 265 __field(u32, cm_id) 266 __field(u32, tos) 267 __field(unsigned long, event) 268 __field(int, status) 269 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 270 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 271 ), 272 273 TP_fast_assign( 274 __entry->cm_id = id_priv->res.id; 275 __entry->tos = id_priv->tos; 276 __entry->event = event->event; 277 __entry->status = event->status; 278 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 279 sizeof(struct sockaddr_in6)); 280 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 281 sizeof(struct sockaddr_in6)); 282 ), 283 284 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s (%lu/%d)", 285 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 286 rdma_show_cm_event(__entry->event), __entry->event, 287 __entry->status 288 ) 289 ); 290 291 TRACE_EVENT(cm_event_done, 292 TP_PROTO( 293 const struct rdma_id_private *id_priv, 294 const struct rdma_cm_event *event, 295 int result 296 ), 297 298 TP_ARGS(id_priv, event, result), 299 300 TP_STRUCT__entry( 301 __field(u32, cm_id) 302 __field(u32, tos) 303 __field(unsigned long, event) 304 __field(int, result) 305 __array(unsigned char, srcaddr, sizeof(struct sockaddr_in6)) 306 __array(unsigned char, dstaddr, sizeof(struct sockaddr_in6)) 307 ), 308 309 TP_fast_assign( 310 __entry->cm_id = id_priv->res.id; 311 __entry->tos = id_priv->tos; 312 __entry->event = event->event; 313 __entry->result = result; 314 memcpy(__entry->srcaddr, &id_priv->id.route.addr.src_addr, 315 sizeof(struct sockaddr_in6)); 316 memcpy(__entry->dstaddr, &id_priv->id.route.addr.dst_addr, 317 sizeof(struct sockaddr_in6)); 318 ), 319 320 TP_printk("cm.id=%u src=%pISpc dst=%pISpc tos=%u %s consumer returns %d", 321 __entry->cm_id, __entry->srcaddr, __entry->dstaddr, __entry->tos, 322 rdma_show_cm_event(__entry->event), __entry->result 323 ) 324 ); 325 326 DECLARE_EVENT_CLASS(cma_client_class, 327 TP_PROTO( 328 const struct ib_device *device 329 ), 330 331 TP_ARGS(device), 332 333 TP_STRUCT__entry( 334 __string(name, device->name) 335 ), 336 337 TP_fast_assign( 338 __assign_str(name); 339 ), 340 341 TP_printk("device name=%s", 342 __get_str(name) 343 ) 344 ); 345 346 #define DEFINE_CMA_CLIENT_EVENT(name) \ 347 DEFINE_EVENT(cma_client_class, cm_##name, \ 348 TP_PROTO( \ 349 const struct ib_device *device \ 350 ), \ 351 TP_ARGS(device)) 352 353 DEFINE_CMA_CLIENT_EVENT(add_one); 354 DEFINE_CMA_CLIENT_EVENT(remove_one); 355 356 #endif /* _TRACE_RDMA_CMA_H */ 357 358 #undef TRACE_INCLUDE_PATH 359 #define TRACE_INCLUDE_PATH . 360 #define TRACE_INCLUDE_FILE cma_trace 361 362 #include <trace/define_trace.h> 363