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(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 | |