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/misc/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
47IB_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
73IB_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
127IB_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
137DECLARE_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
175DEFINE_CM_SEND_EVENT(req);
176DEFINE_CM_SEND_EVENT(rep);
177DEFINE_CM_SEND_EVENT(dup_req);
178DEFINE_CM_SEND_EVENT(dup_rep);
179DEFINE_CM_SEND_EVENT(rtu);
180DEFINE_CM_SEND_EVENT(mra);
181DEFINE_CM_SEND_EVENT(sidr_req);
182DEFINE_CM_SEND_EVENT(sidr_rep);
183DEFINE_CM_SEND_EVENT(dreq);
184DEFINE_CM_SEND_EVENT(drep);
185
186TRACE_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
225DEFINE_CM_ERR_EVENT(send_cm_rtu);
226DEFINE_CM_ERR_EVENT(establish);
227DEFINE_CM_ERR_EVENT(no_listener);
228DEFINE_CM_ERR_EVENT(send_drep);
229DEFINE_CM_ERR_EVENT(dreq_unknown);
230DEFINE_CM_ERR_EVENT(send_unknown_rej);
231DEFINE_CM_ERR_EVENT(rej_unknown);
232DEFINE_CM_ERR_EVENT(send_mra_unknown);
233DEFINE_CM_ERR_EVENT(mra_unknown);
234DEFINE_CM_ERR_EVENT(qp_init);
235DEFINE_CM_ERR_EVENT(qp_rtr);
236DEFINE_CM_ERR_EVENT(qp_rts);
237
238DEFINE_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
246DECLARE_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
278DEFINE_CM_LOCAL_EVENT(issue_rej);
279DEFINE_CM_LOCAL_EVENT(issue_drep);
280DEFINE_CM_LOCAL_EVENT(staleconn_err);
281DEFINE_CM_LOCAL_EVENT(no_priv_err);
282
283DECLARE_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
311DEFINE_CM_REMOTE_EVENT(remote_no_priv_err);
312DEFINE_CM_REMOTE_EVENT(insert_failed_err);
313
314TRACE_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
337TRACE_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
364TRACE_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
384TRACE_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