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
17struct trace_event_raw_ib_mad_send_template;
18static 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
23DECLARE_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
107DEFINE_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));
111DEFINE_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));
115DEFINE_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
120TRACE_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
183TRACE_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
246DECLARE_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);
279DEFINE_EVENT(ib_mad_agent_template, ib_mad_recv_done_agent,
280 TP_PROTO(struct ib_mad_agent_private *agent),
281 TP_ARGS(agent));
282DEFINE_EVENT(ib_mad_agent_template, ib_mad_send_done_agent,
283 TP_PROTO(struct ib_mad_agent_private *agent),
284 TP_ARGS(agent));
285DEFINE_EVENT(ib_mad_agent_template, ib_mad_create_agent,
286 TP_PROTO(struct ib_mad_agent_private *agent),
287 TP_ARGS(agent));
288DEFINE_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
294DECLARE_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
331DEFINE_EVENT(ib_mad_opa_smi_template, ib_mad_handle_opa_smi,
332 TP_PROTO(struct opa_smp *smp),
333 TP_ARGS(smp));
334DEFINE_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
339DECLARE_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
376DEFINE_EVENT(ib_mad_opa_ib_template, ib_mad_handle_ib_smi,
377 TP_PROTO(struct ib_smp *smp),
378 TP_ARGS(smp));
379DEFINE_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

source code of linux/include/trace/events/ib_mad.h