1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2 
3 /*
4  * Copyright (c) 2018 Intel Corporation.  All rights reserved.
5  */
6 
7 #undef TRACE_SYSTEM
8 #define TRACE_SYSTEM ib_mad
9 
10 #if !defined(_TRACE_IB_MAD_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_IB_MAD_H
12 
13 #include <linux/tracepoint.h>
14 #include <rdma/ib_mad.h>
15 
16 #ifdef CONFIG_TRACEPOINTS
17 struct trace_event_raw_ib_mad_send_template;
18 static void create_mad_addr_info(struct ib_mad_send_wr_private *mad_send_wr,
19 			  struct ib_mad_qp_info *qp_info,
20 			  struct trace_event_raw_ib_mad_send_template *entry);
21 #endif
22 
23 DECLARE_EVENT_CLASS(ib_mad_send_template,
24 	TP_PROTO(struct ib_mad_send_wr_private *wr,
25 		 struct ib_mad_qp_info *qp_info),
26 	TP_ARGS(wr, qp_info),
27 
28 	TP_STRUCT__entry(
29 		__field(u8,             base_version)
30 		__field(u8,             mgmt_class)
31 		__field(u8,             class_version)
32 		__field(u8,             port_num)
33 		__field(u32,            qp_num)
34 		__field(u8,             method)
35 		__field(u8,             sl)
36 		__field(u16,            attr_id)
37 		__field(u32,            attr_mod)
38 		__field(u64,            wrtid)
39 		__field(u64,            tid)
40 		__field(u16,            status)
41 		__field(u16,            class_specific)
42 		__field(u32,            length)
43 		__field(u32,            dlid)
44 		__field(u32,            rqpn)
45 		__field(u32,            rqkey)
46 		__field(u32,            dev_index)
47 		__field(void *,         agent_priv)
48 		__field(unsigned long,  timeout)
49 		__field(int,            retries_left)
50 		__field(int,            max_retries)
51 		__field(int,            retry)
52 	),
53 
54 	TP_fast_assign(
55 		__entry->dev_index = wr->mad_agent_priv->agent.device->index;
56 		__entry->port_num = wr->mad_agent_priv->agent.port_num;
57 		__entry->qp_num = wr->mad_agent_priv->qp_info->qp->qp_num;
58 		__entry->agent_priv = wr->mad_agent_priv;
59 		__entry->wrtid = wr->tid;
60 		__entry->max_retries = wr->max_retries;
61 		__entry->retries_left = wr->retries_left;
62 		__entry->retry = wr->retry;
63 		__entry->timeout = wr->timeout;
64 		__entry->length = wr->send_buf.hdr_len +
65 				  wr->send_buf.data_len;
66 		__entry->base_version =
67 			((struct ib_mad_hdr *)wr->send_buf.mad)->base_version;
68 		__entry->mgmt_class =
69 			((struct ib_mad_hdr *)wr->send_buf.mad)->mgmt_class;
70 		__entry->class_version =
71 			((struct ib_mad_hdr *)wr->send_buf.mad)->class_version;
72 		__entry->method =
73 			((struct ib_mad_hdr *)wr->send_buf.mad)->method;
74 		__entry->status =
75 			((struct ib_mad_hdr *)wr->send_buf.mad)->status;
76 		__entry->class_specific =
77 			((struct ib_mad_hdr *)wr->send_buf.mad)->class_specific;
78 		__entry->tid = ((struct ib_mad_hdr *)wr->send_buf.mad)->tid;
79 		__entry->attr_id =
80 			((struct ib_mad_hdr *)wr->send_buf.mad)->attr_id;
81 		__entry->attr_mod =
82 			((struct ib_mad_hdr *)wr->send_buf.mad)->attr_mod;
83 		create_mad_addr_info(wr, qp_info, __entry);
84 	),
85 
86 	TP_printk("%d:%d QP%d agent %p: " \
87 		  "wrtid 0x%llx; %d/%d retries(%d); timeout %lu length %d : " \
88 		  "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
89 		  "method 0x%x status 0x%x class_specific 0x%x tid 0x%llx " \
90 		  "attr_id 0x%x attr_mod 0x%x  => dlid 0x%08x sl %d "\
91 		  "rpqn 0x%x rqpkey 0x%x",
92 		__entry->dev_index, __entry->port_num, __entry->qp_num,
93 		__entry->agent_priv, be64_to_cpu(__entry->wrtid),
94 		__entry->retries_left, __entry->max_retries,
95 		__entry->retry, __entry->timeout, __entry->length,
96 		__entry->base_version, __entry->mgmt_class,
97 		__entry->class_version,
98 		__entry->method, be16_to_cpu(__entry->status),
99 		be16_to_cpu(__entry->class_specific),
100 		be64_to_cpu(__entry->tid), be16_to_cpu(__entry->attr_id),
101 		be32_to_cpu(__entry->attr_mod),
102 		be32_to_cpu(__entry->dlid), __entry->sl,
103 		__entry->rqpn, __entry->rqkey
104 	)
105 );
106 
107 DEFINE_EVENT(ib_mad_send_template, ib_mad_error_handler,
108 	TP_PROTO(struct ib_mad_send_wr_private *wr,
109 		 struct ib_mad_qp_info *qp_info),
110 	TP_ARGS(wr, qp_info));
111 DEFINE_EVENT(ib_mad_send_template, ib_mad_ib_send_mad,
112 	TP_PROTO(struct ib_mad_send_wr_private *wr,
113 		 struct ib_mad_qp_info *qp_info),
114 	TP_ARGS(wr, qp_info));
115 DEFINE_EVENT(ib_mad_send_template, ib_mad_send_done_resend,
116 	TP_PROTO(struct ib_mad_send_wr_private *wr,
117 		 struct ib_mad_qp_info *qp_info),
118 	TP_ARGS(wr, qp_info));
119 
120 TRACE_EVENT(ib_mad_send_done_handler,
121 	TP_PROTO(struct ib_mad_send_wr_private *wr, struct ib_wc *wc),
122 	TP_ARGS(wr, wc),
123 
124 	TP_STRUCT__entry(
125 		__field(u8,             port_num)
126 		__field(u8,             base_version)
127 		__field(u8,             mgmt_class)
128 		__field(u8,             class_version)
129 		__field(u32,            qp_num)
130 		__field(u64,            wrtid)
131 		__field(u16,            status)
132 		__field(u16,            wc_status)
133 		__field(u32,            length)
134 		__field(void *,         agent_priv)
135 		__field(unsigned long,  timeout)
136 		__field(u32,            dev_index)
137 		__field(int,            retries_left)
138 		__field(int,            max_retries)
139 		__field(int,            retry)
140 		__field(u8,             method)
141 	),
142 
143 	TP_fast_assign(
144 		__entry->dev_index = wr->mad_agent_priv->agent.device->index;
145 		__entry->port_num = wr->mad_agent_priv->agent.port_num;
146 		__entry->qp_num = wr->mad_agent_priv->qp_info->qp->qp_num;
147 		__entry->agent_priv = wr->mad_agent_priv;
148 		__entry->wrtid = wr->tid;
149 		__entry->max_retries = wr->max_retries;
150 		__entry->retries_left = wr->retries_left;
151 		__entry->retry = wr->retry;
152 		__entry->timeout = wr->timeout;
153 		__entry->base_version =
154 			((struct ib_mad_hdr *)wr->send_buf.mad)->base_version;
155 		__entry->mgmt_class =
156 			((struct ib_mad_hdr *)wr->send_buf.mad)->mgmt_class;
157 		__entry->class_version =
158 			((struct ib_mad_hdr *)wr->send_buf.mad)->class_version;
159 		__entry->method =
160 			((struct ib_mad_hdr *)wr->send_buf.mad)->method;
161 		__entry->status =
162 			((struct ib_mad_hdr *)wr->send_buf.mad)->status;
163 		__entry->wc_status = wc->status;
164 		__entry->length = wc->byte_len;
165 	),
166 
167 	TP_printk("%d:%d QP%d : SEND WC Status %d : agent %p: " \
168 		  "wrtid 0x%llx %d/%d retries(%d) timeout %lu length %d: " \
169 		  "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
170 		  "method 0x%x status 0x%x",
171 		__entry->dev_index, __entry->port_num, __entry->qp_num,
172 		__entry->wc_status,
173 		__entry->agent_priv, be64_to_cpu(__entry->wrtid),
174 		__entry->retries_left, __entry->max_retries,
175 		__entry->retry, __entry->timeout,
176 		__entry->length,
177 		__entry->base_version, __entry->mgmt_class,
178 		__entry->class_version, __entry->method,
179 		be16_to_cpu(__entry->status)
180 	)
181 );
182 
183 TRACE_EVENT(ib_mad_recv_done_handler,
184 	TP_PROTO(struct ib_mad_qp_info *qp_info, struct ib_wc *wc,
185 		 struct ib_mad_hdr *mad_hdr),
186 	TP_ARGS(qp_info, wc, mad_hdr),
187 
188 	TP_STRUCT__entry(
189 		__field(u8,             base_version)
190 		__field(u8,             mgmt_class)
191 		__field(u8,             class_version)
192 		__field(u8,             port_num)
193 		__field(u32,            qp_num)
194 		__field(u16,            status)
195 		__field(u16,            class_specific)
196 		__field(u32,            length)
197 		__field(u64,            tid)
198 		__field(u8,             method)
199 		__field(u8,             sl)
200 		__field(u16,            attr_id)
201 		__field(u32,            attr_mod)
202 		__field(u16,            src_qp)
203 		__field(u16,            wc_status)
204 		__field(u32,            slid)
205 		__field(u32,            dev_index)
206 	),
207 
208 	TP_fast_assign(
209 		__entry->dev_index = qp_info->port_priv->device->index;
210 		__entry->port_num = qp_info->port_priv->port_num;
211 		__entry->qp_num = qp_info->qp->qp_num;
212 		__entry->length = wc->byte_len;
213 		__entry->base_version = mad_hdr->base_version;
214 		__entry->mgmt_class = mad_hdr->mgmt_class;
215 		__entry->class_version = mad_hdr->class_version;
216 		__entry->method = mad_hdr->method;
217 		__entry->status = mad_hdr->status;
218 		__entry->class_specific = mad_hdr->class_specific;
219 		__entry->tid = mad_hdr->tid;
220 		__entry->attr_id = mad_hdr->attr_id;
221 		__entry->attr_mod = mad_hdr->attr_mod;
222 		__entry->slid = wc->slid;
223 		__entry->src_qp = wc->src_qp;
224 		__entry->sl = wc->sl;
225 		__entry->wc_status = wc->status;
226 	),
227 
228 	TP_printk("%d:%d QP%d : RECV WC Status %d : length %d : hdr : " \
229 		  "base_ver 0x%02x class 0x%02x class_ver 0x%02x " \
230 		  "method 0x%02x status 0x%04x class_specific 0x%04x " \
231 		  "tid 0x%016llx attr_id 0x%04x attr_mod 0x%08x " \
232 		  "slid 0x%08x src QP%d, sl %d",
233 		__entry->dev_index, __entry->port_num, __entry->qp_num,
234 		__entry->wc_status,
235 		__entry->length,
236 		__entry->base_version, __entry->mgmt_class,
237 		__entry->class_version, __entry->method,
238 		be16_to_cpu(__entry->status),
239 		be16_to_cpu(__entry->class_specific),
240 		be64_to_cpu(__entry->tid), be16_to_cpu(__entry->attr_id),
241 		be32_to_cpu(__entry->attr_mod),
242 		__entry->slid, __entry->src_qp, __entry->sl
243 	)
244 );
245 
246 DECLARE_EVENT_CLASS(ib_mad_agent_template,
247 	TP_PROTO(struct ib_mad_agent_private *agent),
248 	TP_ARGS(agent),
249 
250 	TP_STRUCT__entry(
251 		__field(u32,            dev_index)
252 		__field(u32,            hi_tid)
253 		__field(u8,             port_num)
254 		__field(u8,             mgmt_class)
255 		__field(u8,             mgmt_class_version)
256 	),
257 
258 	TP_fast_assign(
259 		__entry->dev_index = agent->agent.device->index;
260 		__entry->port_num = agent->agent.port_num;
261 		__entry->hi_tid = agent->agent.hi_tid;
262 
263 		if (agent->reg_req) {
264 			__entry->mgmt_class = agent->reg_req->mgmt_class;
265 			__entry->mgmt_class_version =
266 				agent->reg_req->mgmt_class_version;
267 		} else {
268 			__entry->mgmt_class = 0;
269 			__entry->mgmt_class_version = 0;
270 		}
271 	),
272 
273 	TP_printk("%d:%d mad agent : hi_tid 0x%08x class 0x%02x class_ver 0x%02x",
274 		__entry->dev_index, __entry->port_num,
275 		__entry->hi_tid, __entry->mgmt_class,
276 		__entry->mgmt_class_version
277 	)
278 );
279 DEFINE_EVENT(ib_mad_agent_template, ib_mad_recv_done_agent,
280 	TP_PROTO(struct ib_mad_agent_private *agent),
281 	TP_ARGS(agent));
282 DEFINE_EVENT(ib_mad_agent_template, ib_mad_send_done_agent,
283 	TP_PROTO(struct ib_mad_agent_private *agent),
284 	TP_ARGS(agent));
285 DEFINE_EVENT(ib_mad_agent_template, ib_mad_create_agent,
286 	TP_PROTO(struct ib_mad_agent_private *agent),
287 	TP_ARGS(agent));
288 DEFINE_EVENT(ib_mad_agent_template, ib_mad_unregister_agent,
289 	TP_PROTO(struct ib_mad_agent_private *agent),
290 	TP_ARGS(agent));
291 
292 
293 
294 DECLARE_EVENT_CLASS(ib_mad_opa_smi_template,
295 	TP_PROTO(struct opa_smp *smp),
296 	TP_ARGS(smp),
297 
298 	TP_STRUCT__entry(
299 		__field(u64,            mkey)
300 		__field(u32,            dr_slid)
301 		__field(u32,            dr_dlid)
302 		__field(u8,             hop_ptr)
303 		__field(u8,             hop_cnt)
304 		__array(u8,             initial_path, OPA_SMP_MAX_PATH_HOPS)
305 		__array(u8,             return_path, OPA_SMP_MAX_PATH_HOPS)
306 	),
307 
308 	TP_fast_assign(
309 		__entry->hop_ptr = smp->hop_ptr;
310 		__entry->hop_cnt = smp->hop_cnt;
311 		__entry->mkey = smp->mkey;
312 		__entry->dr_slid = smp->route.dr.dr_slid;
313 		__entry->dr_dlid = smp->route.dr.dr_dlid;
314 		memcpy(__entry->initial_path, smp->route.dr.initial_path,
315 			OPA_SMP_MAX_PATH_HOPS);
316 		memcpy(__entry->return_path, smp->route.dr.return_path,
317 			OPA_SMP_MAX_PATH_HOPS);
318 	),
319 
320 	TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
321 		  "mkey 0x%016llx dr_slid 0x%08x dr_dlid 0x%08x " \
322 		  "initial_path %*ph return_path %*ph ",
323 		__entry->hop_ptr, __entry->hop_cnt,
324 		be64_to_cpu(__entry->mkey), be32_to_cpu(__entry->dr_slid),
325 		be32_to_cpu(__entry->dr_dlid),
326 		OPA_SMP_MAX_PATH_HOPS, __entry->initial_path,
327 		OPA_SMP_MAX_PATH_HOPS, __entry->return_path
328 	)
329 );
330 
331 DEFINE_EVENT(ib_mad_opa_smi_template, ib_mad_handle_opa_smi,
332 	TP_PROTO(struct opa_smp *smp),
333 	TP_ARGS(smp));
334 DEFINE_EVENT(ib_mad_opa_smi_template, ib_mad_handle_out_opa_smi,
335 	TP_PROTO(struct opa_smp *smp),
336 	TP_ARGS(smp));
337 
338 
339 DECLARE_EVENT_CLASS(ib_mad_opa_ib_template,
340 	TP_PROTO(struct ib_smp *smp),
341 	TP_ARGS(smp),
342 
343 	TP_STRUCT__entry(
344 		__field(u64,            mkey)
345 		__field(u32,            dr_slid)
346 		__field(u32,            dr_dlid)
347 		__field(u8,             hop_ptr)
348 		__field(u8,             hop_cnt)
349 		__array(u8,             initial_path, IB_SMP_MAX_PATH_HOPS)
350 		__array(u8,             return_path, IB_SMP_MAX_PATH_HOPS)
351 	),
352 
353 	TP_fast_assign(
354 		__entry->hop_ptr = smp->hop_ptr;
355 		__entry->hop_cnt = smp->hop_cnt;
356 		__entry->mkey = smp->mkey;
357 		__entry->dr_slid = smp->dr_slid;
358 		__entry->dr_dlid = smp->dr_dlid;
359 		memcpy(__entry->initial_path, smp->initial_path,
360 			IB_SMP_MAX_PATH_HOPS);
361 		memcpy(__entry->return_path, smp->return_path,
362 			IB_SMP_MAX_PATH_HOPS);
363 	),
364 
365 	TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
366 		  "mkey 0x%016llx dr_slid 0x%04x dr_dlid 0x%04x " \
367 		  "initial_path %*ph return_path %*ph ",
368 		__entry->hop_ptr, __entry->hop_cnt,
369 		be64_to_cpu(__entry->mkey), be16_to_cpu(__entry->dr_slid),
370 		be16_to_cpu(__entry->dr_dlid),
371 		IB_SMP_MAX_PATH_HOPS, __entry->initial_path,
372 		IB_SMP_MAX_PATH_HOPS, __entry->return_path
373 	)
374 );
375 
376 DEFINE_EVENT(ib_mad_opa_ib_template, ib_mad_handle_ib_smi,
377 	TP_PROTO(struct ib_smp *smp),
378 	TP_ARGS(smp));
379 DEFINE_EVENT(ib_mad_opa_ib_template, ib_mad_handle_out_ib_smi,
380 	TP_PROTO(struct ib_smp *smp),
381 	TP_ARGS(smp));
382 
383 #endif /* _TRACE_IB_MAD_H */
384 
385 #include <trace/define_trace.h>
386