1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
4 * Copyright (c) 2018 Intel Corporation. All rights reserved.
8 #define TRACE_SYSTEM ib_mad
10 #if !defined(_TRACE_IB_MAD_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_IB_MAD_H
13 #include <linux/tracepoint.h>
14 #include <rdma/ib_mad.h>
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
);
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
),
29 __field(u8
, base_version
)
30 __field(u8
, mgmt_class
)
31 __field(u8
, class_version
)
37 __field(u32
, attr_mod
)
41 __field(u16
, class_specific
)
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
)
56 __entry
->dev_index
= wr
->mad_agent_priv
->agent
.device
->index
;
57 __entry
->port_num
= wr
->mad_agent_priv
->agent
.port_num
;
58 __entry
->qp_num
= wr
->mad_agent_priv
->qp_info
->qp
->qp_num
;
59 __entry
->agent_priv
= wr
->mad_agent_priv
;
60 __entry
->wrtid
= wr
->tid
;
61 __entry
->max_retries
= wr
->max_retries
;
62 __entry
->retries_left
= wr
->retries_left
;
63 __entry
->retry
= wr
->retry
;
64 __entry
->timeout
= wr
->timeout
;
65 __entry
->length
= wr
->send_buf
.hdr_len
+
66 wr
->send_buf
.data_len
;
67 __entry
->base_version
=
68 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->base_version
;
70 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->mgmt_class
;
71 __entry
->class_version
=
72 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->class_version
;
74 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->method
;
76 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->status
;
77 __entry
->class_specific
=
78 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->class_specific
;
79 __entry
->tid
= ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->tid
;
81 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->attr_id
;
83 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->attr_mod
;
84 create_mad_addr_info(wr
, qp_info
, __entry
);
87 TP_printk("%d:%d QP%d agent %p: " \
88 "wrtid 0x%llx; %d/%d retries(%d); timeout %lu length %d : " \
89 "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
90 "method 0x%x status 0x%x class_specific 0x%x tid 0x%llx " \
91 "attr_id 0x%x attr_mod 0x%x => dlid 0x%08x sl %d "\
92 "pkey 0x%x rpqn 0x%x rqpkey 0x%x",
93 __entry
->dev_index
, __entry
->port_num
, __entry
->qp_num
,
94 __entry
->agent_priv
, be64_to_cpu(__entry
->wrtid
),
95 __entry
->retries_left
, __entry
->max_retries
,
96 __entry
->retry
, __entry
->timeout
, __entry
->length
,
97 __entry
->base_version
, __entry
->mgmt_class
,
98 __entry
->class_version
,
99 __entry
->method
, be16_to_cpu(__entry
->status
),
100 be16_to_cpu(__entry
->class_specific
),
101 be64_to_cpu(__entry
->tid
), be16_to_cpu(__entry
->attr_id
),
102 be32_to_cpu(__entry
->attr_mod
),
103 be32_to_cpu(__entry
->dlid
), __entry
->sl
, __entry
->pkey
,
104 __entry
->rqpn
, __entry
->rqkey
108 DEFINE_EVENT(ib_mad_send_template
, ib_mad_error_handler
,
109 TP_PROTO(struct ib_mad_send_wr_private
*wr
,
110 struct ib_mad_qp_info
*qp_info
),
111 TP_ARGS(wr
, qp_info
));
112 DEFINE_EVENT(ib_mad_send_template
, ib_mad_ib_send_mad
,
113 TP_PROTO(struct ib_mad_send_wr_private
*wr
,
114 struct ib_mad_qp_info
*qp_info
),
115 TP_ARGS(wr
, qp_info
));
116 DEFINE_EVENT(ib_mad_send_template
, ib_mad_send_done_resend
,
117 TP_PROTO(struct ib_mad_send_wr_private
*wr
,
118 struct ib_mad_qp_info
*qp_info
),
119 TP_ARGS(wr
, qp_info
));
121 TRACE_EVENT(ib_mad_send_done_handler
,
122 TP_PROTO(struct ib_mad_send_wr_private
*wr
, struct ib_wc
*wc
),
126 __field(u8
, port_num
)
127 __field(u8
, base_version
)
128 __field(u8
, mgmt_class
)
129 __field(u8
, class_version
)
133 __field(u16
, wc_status
)
135 __field(void *, agent_priv
)
136 __field(unsigned long, timeout
)
137 __field(u32
, dev_index
)
138 __field(int, retries_left
)
139 __field(int, max_retries
)
145 __entry
->dev_index
= wr
->mad_agent_priv
->agent
.device
->index
;
146 __entry
->port_num
= wr
->mad_agent_priv
->agent
.port_num
;
147 __entry
->qp_num
= wr
->mad_agent_priv
->qp_info
->qp
->qp_num
;
148 __entry
->agent_priv
= wr
->mad_agent_priv
;
149 __entry
->wrtid
= wr
->tid
;
150 __entry
->max_retries
= wr
->max_retries
;
151 __entry
->retries_left
= wr
->retries_left
;
152 __entry
->retry
= wr
->retry
;
153 __entry
->timeout
= wr
->timeout
;
154 __entry
->base_version
=
155 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->base_version
;
156 __entry
->mgmt_class
=
157 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->mgmt_class
;
158 __entry
->class_version
=
159 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->class_version
;
161 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->method
;
163 ((struct ib_mad_hdr
*)wr
->send_buf
.mad
)->status
;
164 __entry
->wc_status
= wc
->status
;
165 __entry
->length
= wc
->byte_len
;
168 TP_printk("%d:%d QP%d : SEND WC Status %d : agent %p: " \
169 "wrtid 0x%llx %d/%d retries(%d) timeout %lu length %d: " \
170 "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
171 "method 0x%x status 0x%x",
172 __entry
->dev_index
, __entry
->port_num
, __entry
->qp_num
,
174 __entry
->agent_priv
, be64_to_cpu(__entry
->wrtid
),
175 __entry
->retries_left
, __entry
->max_retries
,
176 __entry
->retry
, __entry
->timeout
,
178 __entry
->base_version
, __entry
->mgmt_class
,
179 __entry
->class_version
, __entry
->method
,
180 be16_to_cpu(__entry
->status
)
184 TRACE_EVENT(ib_mad_recv_done_handler
,
185 TP_PROTO(struct ib_mad_qp_info
*qp_info
, struct ib_wc
*wc
,
186 struct ib_mad_hdr
*mad_hdr
),
187 TP_ARGS(qp_info
, wc
, mad_hdr
),
190 __field(u8
, base_version
)
191 __field(u8
, mgmt_class
)
192 __field(u8
, class_version
)
193 __field(u8
, port_num
)
196 __field(u16
, class_specific
)
201 __field(u16
, attr_id
)
202 __field(u32
, attr_mod
)
204 __field(u16
, wc_status
)
206 __field(u32
, dev_index
)
211 __entry
->dev_index
= qp_info
->port_priv
->device
->index
;
212 __entry
->port_num
= qp_info
->port_priv
->port_num
;
213 __entry
->qp_num
= qp_info
->qp
->qp_num
;
214 __entry
->length
= wc
->byte_len
;
215 __entry
->base_version
= mad_hdr
->base_version
;
216 __entry
->mgmt_class
= mad_hdr
->mgmt_class
;
217 __entry
->class_version
= mad_hdr
->class_version
;
218 __entry
->method
= mad_hdr
->method
;
219 __entry
->status
= mad_hdr
->status
;
220 __entry
->class_specific
= mad_hdr
->class_specific
;
221 __entry
->tid
= mad_hdr
->tid
;
222 __entry
->attr_id
= mad_hdr
->attr_id
;
223 __entry
->attr_mod
= mad_hdr
->attr_mod
;
224 __entry
->slid
= wc
->slid
;
225 __entry
->src_qp
= wc
->src_qp
;
226 __entry
->sl
= wc
->sl
;
227 ib_query_pkey(qp_info
->port_priv
->device
,
228 qp_info
->port_priv
->port_num
,
229 wc
->pkey_index
, &__entry
->pkey
);
230 __entry
->wc_status
= wc
->status
;
233 TP_printk("%d:%d QP%d : RECV WC Status %d : length %d : hdr : " \
234 "base_ver 0x%02x class 0x%02x class_ver 0x%02x " \
235 "method 0x%02x status 0x%04x class_specific 0x%04x " \
236 "tid 0x%016llx attr_id 0x%04x attr_mod 0x%08x " \
237 "slid 0x%08x src QP%d, sl %d pkey 0x%04x",
238 __entry
->dev_index
, __entry
->port_num
, __entry
->qp_num
,
241 __entry
->base_version
, __entry
->mgmt_class
,
242 __entry
->class_version
, __entry
->method
,
243 be16_to_cpu(__entry
->status
),
244 be16_to_cpu(__entry
->class_specific
),
245 be64_to_cpu(__entry
->tid
), be16_to_cpu(__entry
->attr_id
),
246 be32_to_cpu(__entry
->attr_mod
),
247 __entry
->slid
, __entry
->src_qp
, __entry
->sl
, __entry
->pkey
251 DECLARE_EVENT_CLASS(ib_mad_agent_template
,
252 TP_PROTO(struct ib_mad_agent_private
*agent
),
256 __field(u32
, dev_index
)
258 __field(u8
, port_num
)
259 __field(u8
, mgmt_class
)
260 __field(u8
, mgmt_class_version
)
264 __entry
->dev_index
= agent
->agent
.device
->index
;
265 __entry
->port_num
= agent
->agent
.port_num
;
266 __entry
->hi_tid
= agent
->agent
.hi_tid
;
268 if (agent
->reg_req
) {
269 __entry
->mgmt_class
= agent
->reg_req
->mgmt_class
;
270 __entry
->mgmt_class_version
=
271 agent
->reg_req
->mgmt_class_version
;
273 __entry
->mgmt_class
= 0;
274 __entry
->mgmt_class_version
= 0;
278 TP_printk("%d:%d mad agent : hi_tid 0x%08x class 0x%02x class_ver 0x%02x",
279 __entry
->dev_index
, __entry
->port_num
,
280 __entry
->hi_tid
, __entry
->mgmt_class
,
281 __entry
->mgmt_class_version
284 DEFINE_EVENT(ib_mad_agent_template
, ib_mad_recv_done_agent
,
285 TP_PROTO(struct ib_mad_agent_private
*agent
),
287 DEFINE_EVENT(ib_mad_agent_template
, ib_mad_send_done_agent
,
288 TP_PROTO(struct ib_mad_agent_private
*agent
),
290 DEFINE_EVENT(ib_mad_agent_template
, ib_mad_create_agent
,
291 TP_PROTO(struct ib_mad_agent_private
*agent
),
293 DEFINE_EVENT(ib_mad_agent_template
, ib_mad_unregister_agent
,
294 TP_PROTO(struct ib_mad_agent_private
*agent
),
299 DECLARE_EVENT_CLASS(ib_mad_opa_smi_template
,
300 TP_PROTO(struct opa_smp
*smp
),
305 __field(u32
, dr_slid
)
306 __field(u32
, dr_dlid
)
309 __array(u8
, initial_path
, OPA_SMP_MAX_PATH_HOPS
)
310 __array(u8
, return_path
, OPA_SMP_MAX_PATH_HOPS
)
314 __entry
->hop_ptr
= smp
->hop_ptr
;
315 __entry
->hop_cnt
= smp
->hop_cnt
;
316 __entry
->mkey
= smp
->mkey
;
317 __entry
->dr_slid
= smp
->route
.dr
.dr_slid
;
318 __entry
->dr_dlid
= smp
->route
.dr
.dr_dlid
;
319 memcpy(__entry
->initial_path
, smp
->route
.dr
.initial_path
,
320 OPA_SMP_MAX_PATH_HOPS
);
321 memcpy(__entry
->return_path
, smp
->route
.dr
.return_path
,
322 OPA_SMP_MAX_PATH_HOPS
);
325 TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
326 "mkey 0x%016llx dr_slid 0x%08x dr_dlid 0x%08x " \
327 "initial_path %*ph return_path %*ph ",
328 __entry
->hop_ptr
, __entry
->hop_cnt
,
329 be64_to_cpu(__entry
->mkey
), be32_to_cpu(__entry
->dr_slid
),
330 be32_to_cpu(__entry
->dr_dlid
),
331 OPA_SMP_MAX_PATH_HOPS
, __entry
->initial_path
,
332 OPA_SMP_MAX_PATH_HOPS
, __entry
->return_path
336 DEFINE_EVENT(ib_mad_opa_smi_template
, ib_mad_handle_opa_smi
,
337 TP_PROTO(struct opa_smp
*smp
),
339 DEFINE_EVENT(ib_mad_opa_smi_template
, ib_mad_handle_out_opa_smi
,
340 TP_PROTO(struct opa_smp
*smp
),
344 DECLARE_EVENT_CLASS(ib_mad_opa_ib_template
,
345 TP_PROTO(struct ib_smp
*smp
),
350 __field(u32
, dr_slid
)
351 __field(u32
, dr_dlid
)
354 __array(u8
, initial_path
, IB_SMP_MAX_PATH_HOPS
)
355 __array(u8
, return_path
, IB_SMP_MAX_PATH_HOPS
)
359 __entry
->hop_ptr
= smp
->hop_ptr
;
360 __entry
->hop_cnt
= smp
->hop_cnt
;
361 __entry
->mkey
= smp
->mkey
;
362 __entry
->dr_slid
= smp
->dr_slid
;
363 __entry
->dr_dlid
= smp
->dr_dlid
;
364 memcpy(__entry
->initial_path
, smp
->initial_path
,
365 IB_SMP_MAX_PATH_HOPS
);
366 memcpy(__entry
->return_path
, smp
->return_path
,
367 IB_SMP_MAX_PATH_HOPS
);
370 TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
371 "mkey 0x%016llx dr_slid 0x%04x dr_dlid 0x%04x " \
372 "initial_path %*ph return_path %*ph ",
373 __entry
->hop_ptr
, __entry
->hop_cnt
,
374 be64_to_cpu(__entry
->mkey
), be16_to_cpu(__entry
->dr_slid
),
375 be16_to_cpu(__entry
->dr_dlid
),
376 IB_SMP_MAX_PATH_HOPS
, __entry
->initial_path
,
377 IB_SMP_MAX_PATH_HOPS
, __entry
->return_path
381 DEFINE_EVENT(ib_mad_opa_ib_template
, ib_mad_handle_ib_smi
,
382 TP_PROTO(struct ib_smp
*smp
),
384 DEFINE_EVENT(ib_mad_opa_ib_template
, ib_mad_handle_out_ib_smi
,
385 TP_PROTO(struct ib_smp
*smp
),
388 #endif /* _TRACE_IB_MAD_H */
390 #include <trace/define_trace.h>