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) 2020 Oracle and/or its affiliates.
8  */
9 
10 #undef TRACE_SYSTEM
11 #define TRACE_SYSTEM ib_cma
12 
13 #if !defined(_TRACE_IB_CMA_H) || defined(TRACE_HEADER_MULTI_READ)
14 
15 #define _TRACE_IB_CMA_H
16 
17 #include <linux/tracepoint.h>
18 #include <rdma/ib_cm.h>
19 #include <trace/events/rdma.h>
20 
21 /*
22  * enum ib_cm_state, from include/rdma/ib_cm.h
23  */
24 #define IB_CM_STATE_LIST					\
25 	ib_cm_state(IDLE)					\
26 	ib_cm_state(LISTEN)					\
27 	ib_cm_state(REQ_SENT)					\
28 	ib_cm_state(REQ_RCVD)					\
29 	ib_cm_state(MRA_REQ_SENT)				\
30 	ib_cm_state(MRA_REQ_RCVD)				\
31 	ib_cm_state(REP_SENT)					\
32 	ib_cm_state(REP_RCVD)					\
33 	ib_cm_state(MRA_REP_SENT)				\
34 	ib_cm_state(MRA_REP_RCVD)				\
35 	ib_cm_state(ESTABLISHED)				\
36 	ib_cm_state(DREQ_SENT)					\
37 	ib_cm_state(DREQ_RCVD)					\
38 	ib_cm_state(TIMEWAIT)					\
39 	ib_cm_state(SIDR_REQ_SENT)				\
40 	ib_cm_state_end(SIDR_REQ_RCVD)
41 
42 #undef  ib_cm_state
43 #undef  ib_cm_state_end
44 #define ib_cm_state(x)		TRACE_DEFINE_ENUM(IB_CM_##x);
45 #define ib_cm_state_end(x)	TRACE_DEFINE_ENUM(IB_CM_##x);
46 
47 IB_CM_STATE_LIST
48 
49 #undef  ib_cm_state
50 #undef  ib_cm_state_end
51 #define ib_cm_state(x)		{ IB_CM_##x, #x },
52 #define ib_cm_state_end(x)	{ IB_CM_##x, #x }
53 
54 #define show_ib_cm_state(x) \
55 		__print_symbolic(x, IB_CM_STATE_LIST)
56 
57 /*
58  * enum ib_cm_lap_state, from include/rdma/ib_cm.h
59  */
60 #define IB_CM_LAP_STATE_LIST					\
61 	ib_cm_lap_state(LAP_UNINIT)				\
62 	ib_cm_lap_state(LAP_IDLE)				\
63 	ib_cm_lap_state(LAP_SENT)				\
64 	ib_cm_lap_state(LAP_RCVD)				\
65 	ib_cm_lap_state(MRA_LAP_SENT)				\
66 	ib_cm_lap_state_end(MRA_LAP_RCVD)
67 
68 #undef  ib_cm_lap_state
69 #undef  ib_cm_lap_state_end
70 #define ib_cm_lap_state(x)	TRACE_DEFINE_ENUM(IB_CM_##x);
71 #define ib_cm_lap_state_end(x)	TRACE_DEFINE_ENUM(IB_CM_##x);
72 
73 IB_CM_LAP_STATE_LIST
74 
75 #undef  ib_cm_lap_state
76 #undef  ib_cm_lap_state_end
77 #define ib_cm_lap_state(x)	{ IB_CM_##x, #x },
78 #define ib_cm_lap_state_end(x)	{ IB_CM_##x, #x }
79 
80 #define show_ib_cm_lap_state(x) \
81 		__print_symbolic(x, IB_CM_LAP_STATE_LIST)
82 
83 /*
84  * enum ib_cm_rej_reason, from include/rdma/ib_cm.h
85  */
86 #define IB_CM_REJ_REASON_LIST					\
87 	ib_cm_rej_reason(REJ_NO_QP)				\
88 	ib_cm_rej_reason(REJ_NO_EEC)				\
89 	ib_cm_rej_reason(REJ_NO_RESOURCES)			\
90 	ib_cm_rej_reason(REJ_TIMEOUT)				\
91 	ib_cm_rej_reason(REJ_UNSUPPORTED)			\
92 	ib_cm_rej_reason(REJ_INVALID_COMM_ID)			\
93 	ib_cm_rej_reason(REJ_INVALID_COMM_INSTANCE)		\
94 	ib_cm_rej_reason(REJ_INVALID_SERVICE_ID)		\
95 	ib_cm_rej_reason(REJ_INVALID_TRANSPORT_TYPE)		\
96 	ib_cm_rej_reason(REJ_STALE_CONN)			\
97 	ib_cm_rej_reason(REJ_RDC_NOT_EXIST)			\
98 	ib_cm_rej_reason(REJ_INVALID_GID)			\
99 	ib_cm_rej_reason(REJ_INVALID_LID)			\
100 	ib_cm_rej_reason(REJ_INVALID_SL)			\
101 	ib_cm_rej_reason(REJ_INVALID_TRAFFIC_CLASS)		\
102 	ib_cm_rej_reason(REJ_INVALID_HOP_LIMIT)			\
103 	ib_cm_rej_reason(REJ_INVALID_PACKET_RATE)		\
104 	ib_cm_rej_reason(REJ_INVALID_ALT_GID)			\
105 	ib_cm_rej_reason(REJ_INVALID_ALT_LID)			\
106 	ib_cm_rej_reason(REJ_INVALID_ALT_SL)			\
107 	ib_cm_rej_reason(REJ_INVALID_ALT_TRAFFIC_CLASS)		\
108 	ib_cm_rej_reason(REJ_INVALID_ALT_HOP_LIMIT)		\
109 	ib_cm_rej_reason(REJ_INVALID_ALT_PACKET_RATE)		\
110 	ib_cm_rej_reason(REJ_PORT_CM_REDIRECT)			\
111 	ib_cm_rej_reason(REJ_PORT_REDIRECT)			\
112 	ib_cm_rej_reason(REJ_INVALID_MTU)			\
113 	ib_cm_rej_reason(REJ_INSUFFICIENT_RESP_RESOURCES)	\
114 	ib_cm_rej_reason(REJ_CONSUMER_DEFINED)			\
115 	ib_cm_rej_reason(REJ_INVALID_RNR_RETRY)			\
116 	ib_cm_rej_reason(REJ_DUPLICATE_LOCAL_COMM_ID)		\
117 	ib_cm_rej_reason(REJ_INVALID_CLASS_VERSION)		\
118 	ib_cm_rej_reason(REJ_INVALID_FLOW_LABEL)		\
119 	ib_cm_rej_reason(REJ_INVALID_ALT_FLOW_LABEL)		\
120 	ib_cm_rej_reason_end(REJ_VENDOR_OPTION_NOT_SUPPORTED)
121 
122 #undef  ib_cm_rej_reason
123 #undef  ib_cm_rej_reason_end
124 #define ib_cm_rej_reason(x)	TRACE_DEFINE_ENUM(IB_CM_##x);
125 #define ib_cm_rej_reason_end(x)	TRACE_DEFINE_ENUM(IB_CM_##x);
126 
127 IB_CM_REJ_REASON_LIST
128 
129 #undef  ib_cm_rej_reason
130 #undef  ib_cm_rej_reason_end
131 #define ib_cm_rej_reason(x)	{ IB_CM_##x, #x },
132 #define ib_cm_rej_reason_end(x)	{ IB_CM_##x, #x }
133 
134 #define show_ib_cm_rej_reason(x) \
135 		__print_symbolic(x, IB_CM_REJ_REASON_LIST)
136 
137 DECLARE_EVENT_CLASS(icm_id_class,
138 	TP_PROTO(
139 		const struct ib_cm_id *cm_id
140 	),
141 
142 	TP_ARGS(cm_id),
143 
144 	TP_STRUCT__entry(
145 		__field(const void *, cm_id)	/* for eBPF scripts */
146 		__field(unsigned int, local_id)
147 		__field(unsigned int, remote_id)
148 		__field(unsigned long, state)
149 		__field(unsigned long, lap_state)
150 	),
151 
152 	TP_fast_assign(
153 		__entry->cm_id = cm_id;
154 		__entry->local_id = be32_to_cpu(cm_id->local_id);
155 		__entry->remote_id = be32_to_cpu(cm_id->remote_id);
156 		__entry->state = cm_id->state;
157 		__entry->lap_state = cm_id->lap_state;
158 	),
159 
160 	TP_printk("local_id=%u remote_id=%u state=%s lap_state=%s",
161 		__entry->local_id, __entry->remote_id,
162 		show_ib_cm_state(__entry->state),
163 		show_ib_cm_lap_state(__entry->lap_state)
164 	)
165 );
166 
167 #define DEFINE_CM_SEND_EVENT(name)					\
168 		DEFINE_EVENT(icm_id_class,				\
169 				icm_send_##name,				\
170 				TP_PROTO(				\
171 					const struct ib_cm_id *cm_id	\
172 				),					\
173 				TP_ARGS(cm_id))
174 
175 DEFINE_CM_SEND_EVENT(req);
176 DEFINE_CM_SEND_EVENT(rep);
177 DEFINE_CM_SEND_EVENT(dup_req);
178 DEFINE_CM_SEND_EVENT(dup_rep);
179 DEFINE_CM_SEND_EVENT(rtu);
180 DEFINE_CM_SEND_EVENT(mra);
181 DEFINE_CM_SEND_EVENT(sidr_req);
182 DEFINE_CM_SEND_EVENT(sidr_rep);
183 DEFINE_CM_SEND_EVENT(dreq);
184 DEFINE_CM_SEND_EVENT(drep);
185 
186 TRACE_EVENT(icm_send_rej,
187 	TP_PROTO(
188 		const struct ib_cm_id *cm_id,
189 		enum ib_cm_rej_reason reason
190 	),
191 
192 	TP_ARGS(cm_id, reason),
193 
194 	TP_STRUCT__entry(
195 		__field(const void *, cm_id)
196 		__field(u32, local_id)
197 		__field(u32, remote_id)
198 		__field(unsigned long, state)
199 		__field(unsigned long, reason)
200 	),
201 
202 	TP_fast_assign(
203 		__entry->cm_id = cm_id;
204 		__entry->local_id = be32_to_cpu(cm_id->local_id);
205 		__entry->remote_id = be32_to_cpu(cm_id->remote_id);
206 		__entry->state = cm_id->state;
207 		__entry->reason = reason;
208 	),
209 
210 	TP_printk("local_id=%u remote_id=%u state=%s reason=%s",
211 		__entry->local_id, __entry->remote_id,
212 		show_ib_cm_state(__entry->state),
213 		show_ib_cm_rej_reason(__entry->reason)
214 	)
215 );
216 
217 #define DEFINE_CM_ERR_EVENT(name)					\
218 		DEFINE_EVENT(icm_id_class,				\
219 				icm_##name##_err,			\
220 				TP_PROTO(				\
221 					const struct ib_cm_id *cm_id	\
222 				),					\
223 				TP_ARGS(cm_id))
224 
225 DEFINE_CM_ERR_EVENT(send_cm_rtu);
226 DEFINE_CM_ERR_EVENT(establish);
227 DEFINE_CM_ERR_EVENT(no_listener);
228 DEFINE_CM_ERR_EVENT(send_drep);
229 DEFINE_CM_ERR_EVENT(dreq_unknown);
230 DEFINE_CM_ERR_EVENT(send_unknown_rej);
231 DEFINE_CM_ERR_EVENT(rej_unknown);
232 DEFINE_CM_ERR_EVENT(send_mra_unknown);
233 DEFINE_CM_ERR_EVENT(mra_unknown);
234 DEFINE_CM_ERR_EVENT(qp_init);
235 DEFINE_CM_ERR_EVENT(qp_rtr);
236 DEFINE_CM_ERR_EVENT(qp_rts);
237 
238 DEFINE_EVENT(icm_id_class,						\
239 	icm_dreq_skipped,						\
240 	TP_PROTO(							\
241 		const struct ib_cm_id *cm_id				\
242 	),								\
243 	TP_ARGS(cm_id)							\
244 );
245 
246 DECLARE_EVENT_CLASS(icm_local_class,
247 	TP_PROTO(
248 		unsigned int local_id,
249 		unsigned int remote_id
250 	),
251 
252 	TP_ARGS(local_id, remote_id),
253 
254 	TP_STRUCT__entry(
255 		__field(unsigned int, local_id)
256 		__field(unsigned int, remote_id)
257 	),
258 
259 	TP_fast_assign(
260 		__entry->local_id = local_id;
261 		__entry->remote_id = remote_id;
262 	),
263 
264 	TP_printk("local_id=%u remote_id=%u",
265 		__entry->local_id, __entry->remote_id
266 	)
267 );
268 
269 #define DEFINE_CM_LOCAL_EVENT(name)					\
270 		DEFINE_EVENT(icm_local_class,				\
271 				icm_##name,				\
272 				TP_PROTO(				\
273 					unsigned int local_id,			\
274 					unsigned int remote_id			\
275 				),					\
276 				TP_ARGS(local_id, remote_id))
277 
278 DEFINE_CM_LOCAL_EVENT(issue_rej);
279 DEFINE_CM_LOCAL_EVENT(issue_drep);
280 DEFINE_CM_LOCAL_EVENT(staleconn_err);
281 DEFINE_CM_LOCAL_EVENT(no_priv_err);
282 
283 DECLARE_EVENT_CLASS(icm_remote_class,
284 	TP_PROTO(
285 		u32 remote_id
286 	),
287 
288 	TP_ARGS(remote_id),
289 
290 	TP_STRUCT__entry(
291 		__field(u32, remote_id)
292 	),
293 
294 	TP_fast_assign(
295 		__entry->remote_id = remote_id;
296 	),
297 
298 	TP_printk("remote_id=%u",
299 		__entry->remote_id
300 	)
301 );
302 
303 #define DEFINE_CM_REMOTE_EVENT(name)					\
304 		DEFINE_EVENT(icm_remote_class,				\
305 				icm_##name,				\
306 				TP_PROTO(				\
307 					u32 remote_id			\
308 				),					\
309 				TP_ARGS(remote_id))
310 
311 DEFINE_CM_REMOTE_EVENT(remote_no_priv_err);
312 DEFINE_CM_REMOTE_EVENT(insert_failed_err);
313 
314 TRACE_EVENT(icm_send_rep_err,
315 	TP_PROTO(
316 		__be32 local_id,
317 		enum ib_cm_state state
318 	),
319 
320 	TP_ARGS(local_id, state),
321 
322 	TP_STRUCT__entry(
323 		__field(unsigned int, local_id)
324 		__field(unsigned long, state)
325 	),
326 
327 	TP_fast_assign(
328 		__entry->local_id = be32_to_cpu(local_id);
329 		__entry->state = state;
330 	),
331 
332 	TP_printk("local_id=%u state=%s",
333 		__entry->local_id, show_ib_cm_state(__entry->state)
334 	)
335 );
336 
337 TRACE_EVENT(icm_rep_unknown_err,
338 	TP_PROTO(
339 		unsigned int local_id,
340 		unsigned int remote_id,
341 		enum ib_cm_state state
342 	),
343 
344 	TP_ARGS(local_id, remote_id, state),
345 
346 	TP_STRUCT__entry(
347 		__field(unsigned int, local_id)
348 		__field(unsigned int, remote_id)
349 		__field(unsigned long, state)
350 	),
351 
352 	TP_fast_assign(
353 		__entry->local_id = local_id;
354 		__entry->remote_id = remote_id;
355 		__entry->state = state;
356 	),
357 
358 	TP_printk("local_id=%u remote_id=%u state=%s",
359 		__entry->local_id, __entry->remote_id,
360 		show_ib_cm_state(__entry->state)
361 	)
362 );
363 
364 TRACE_EVENT(icm_handler_err,
365 	TP_PROTO(
366 		enum ib_cm_event_type event
367 	),
368 
369 	TP_ARGS(event),
370 
371 	TP_STRUCT__entry(
372 		__field(unsigned long, event)
373 	),
374 
375 	TP_fast_assign(
376 		__entry->event = event;
377 	),
378 
379 	TP_printk("unhandled event=%s",
380 		rdma_show_ib_cm_event(__entry->event)
381 	)
382 );
383 
384 TRACE_EVENT(icm_mad_send_err,
385 	TP_PROTO(
386 		enum ib_cm_state state,
387 		enum ib_wc_status wc_status
388 	),
389 
390 	TP_ARGS(state, wc_status),
391 
392 	TP_STRUCT__entry(
393 		__field(unsigned long, state)
394 		__field(unsigned long, wc_status)
395 	),
396 
397 	TP_fast_assign(
398 		__entry->state = state;
399 		__entry->wc_status = wc_status;
400 	),
401 
402 	TP_printk("state=%s completion status=%s",
403 		show_ib_cm_state(__entry->state),
404 		rdma_show_wc_status(__entry->wc_status)
405 	)
406 );
407 
408 #endif /* _TRACE_IB_CMA_H */
409 
410 #undef TRACE_INCLUDE_PATH
411 #define TRACE_INCLUDE_PATH ../../drivers/infiniband/core
412 #define TRACE_INCLUDE_FILE cm_trace
413 
414 #include <trace/define_trace.h>
415