xref: /linux/drivers/infiniband/core/cma_trace.h (revision 2d7eaeb05ae265bd64270376e6a2c0d80244771f)
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