xref: /linux/drivers/hv/mshv_trace.h (revision 8fd12b03c7c888303c3c45559d8c3e270a916f9f)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2026, Microsoft Corporation.
4  *
5  * Tracepoint declarations for mshv driver.
6  */
7 
8 #undef TRACE_SYSTEM
9 #define TRACE_SYSTEM mshv
10 
11 #if !defined(__MSHV_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
12 #define _MSHV_TRACE_H_
13 
14 #include <linux/tracepoint.h>
15 #include <hyperv/hvhdk.h>
16 
17 #undef TRACE_INCLUDE_PATH
18 #define TRACE_INCLUDE_PATH ../../drivers/hv
19 
20 #undef TRACE_INCLUDE_FILE
21 #define TRACE_INCLUDE_FILE mshv_trace
22 
23 TRACE_EVENT(mshv_create_partition,
24 	    TP_PROTO(u64 partition_id, int vm_fd),
25 	    TP_ARGS(partition_id, vm_fd),
26 	    TP_STRUCT__entry(
27 		    __field(u64, partition_id)
28 		    __field(int, vm_fd)
29 	    ),
30 	    TP_fast_assign(
31 		    __entry->partition_id = partition_id;
32 		    __entry->vm_fd = vm_fd;
33 	    ),
34 	    TP_printk("partition_id=%llu vm_fd=%d",
35 		    __entry->partition_id,
36 		    __entry->vm_fd
37 	    )
38 );
39 
40 TRACE_EVENT(mshv_hvcall_create_partition,
41 	    TP_PROTO(u64 flags, s64 partition_id),
42 	    TP_ARGS(flags, partition_id),
43 	    TP_STRUCT__entry(
44 		    __field(u64, flags)
45 		    __field(s64, partition_id)
46 	    ),
47 	    TP_fast_assign(
48 		    __entry->flags = flags;
49 		    __entry->partition_id = partition_id;
50 	    ),
51 	    TP_printk("flags=%#llx partition_id=%lld",
52 		    __entry->flags,
53 		    __entry->partition_id
54 	    )
55 );
56 
57 TRACE_EVENT(mshv_hvcall_initialize_partition,
58 	    TP_PROTO(u64 partition_id, u64 status),
59 	    TP_ARGS(partition_id, status),
60 	    TP_STRUCT__entry(
61 		    __field(u64, partition_id)
62 		    __field(u64, status)
63 	    ),
64 	    TP_fast_assign(
65 		    __entry->partition_id = partition_id;
66 		    __entry->status = status;
67 	    ),
68 	    TP_printk("partition_id=%llu status=%#llx",
69 		    __entry->partition_id,
70 		    __entry->status
71 	    )
72 );
73 
74 TRACE_EVENT(mshv_partition_release,
75 	    TP_PROTO(u64 partition_id),
76 	    TP_ARGS(partition_id),
77 	    TP_STRUCT__entry(
78 		    __field(u64, partition_id)
79 	    ),
80 	    TP_fast_assign(
81 		    __entry->partition_id = partition_id;
82 	    ),
83 	    TP_printk("partition_id=%llu",
84 		    __entry->partition_id
85 	    )
86 );
87 
88 TRACE_EVENT(mshv_destroy_partition,
89 	    TP_PROTO(u64 partition_id),
90 	    TP_ARGS(partition_id),
91 	    TP_STRUCT__entry(
92 		    __field(u64, partition_id)
93 	    ),
94 	    TP_fast_assign(
95 		    __entry->partition_id = partition_id;
96 	    ),
97 	    TP_printk("partition_id=%llu",
98 		    __entry->partition_id
99 	    )
100 );
101 
102 TRACE_EVENT(mshv_hvcall_finalize_partition,
103 	    TP_PROTO(u64 partition_id, u64 status),
104 	    TP_ARGS(partition_id, status),
105 	    TP_STRUCT__entry(
106 		    __field(u64, partition_id)
107 		    __field(u64, status)
108 	    ),
109 	    TP_fast_assign(
110 		    __entry->partition_id = partition_id;
111 		    __entry->status = status;
112 	    ),
113 	    TP_printk("partition_id=%llu status=%#llx ",
114 		    __entry->partition_id,
115 		    __entry->status
116 	    )
117 );
118 
119 TRACE_EVENT(mshv_hvcall_withdraw_memory,
120 	    TP_PROTO(u64 partition_id, u64 withdrawn, u64 status),
121 	    TP_ARGS(partition_id, withdrawn, status),
122 	    TP_STRUCT__entry(
123 		    __field(u64, partition_id)
124 		    __field(u64, withdrawn)
125 		    __field(u64, status)
126 	    ),
127 	    TP_fast_assign(
128 		    __entry->partition_id = partition_id;
129 		    __entry->withdrawn = withdrawn;
130 		    __entry->status = status;
131 	    ),
132 	    TP_printk("partition_id=%llu withdrawn=%llu status=%#llx",
133 		    __entry->partition_id,
134 		    __entry->withdrawn,
135 		    __entry->status
136 	    )
137 );
138 
139 TRACE_EVENT(mshv_hvcall_delete_partition,
140 	    TP_PROTO(u64 partition_id, u64 status),
141 	    TP_ARGS(partition_id, status),
142 	    TP_STRUCT__entry(
143 		    __field(u64, partition_id)
144 		    __field(u64, status)
145 	    ),
146 	    TP_fast_assign(
147 		    __entry->partition_id = partition_id;
148 		    __entry->status = status;
149 	    ),
150 	    TP_printk("partition_id=%llu status=%#llx",
151 		    __entry->partition_id,
152 		    __entry->status
153 	    )
154 );
155 
156 TRACE_EVENT(mshv_create_vp,
157 	    TP_PROTO(u64 partition_id, u32 vp_index, long vp_fd),
158 	    TP_ARGS(partition_id, vp_index, vp_fd),
159 	    TP_STRUCT__entry(
160 		    __field(u64, partition_id)
161 		    __field(u32, vp_index)
162 		    __field(long, vp_fd)
163 	    ),
164 	    TP_fast_assign(
165 		    __entry->partition_id = partition_id;
166 		    __entry->vp_index = vp_index;
167 		    __entry->vp_fd = vp_fd;
168 	    ),
169 	    TP_printk("partition_id=%llu vp_index=%u vp_fd=%ld",
170 		    __entry->partition_id,
171 		    __entry->vp_index,
172 		    __entry->vp_fd
173 	    )
174 );
175 
176 TRACE_EVENT(mshv_hvcall_map_vp_state_page,
177 	    TP_PROTO(u64 partition_id, u32 vp_index, u32 page_type, u64 status),
178 	    TP_ARGS(partition_id, vp_index, page_type, status),
179 	    TP_STRUCT__entry(
180 		    __field(u64, partition_id)
181 		    __field(u32, vp_index)
182 		    __field(u32, page_type)
183 		    __field(u64, status)
184 	    ),
185 	    TP_fast_assign(
186 		    __entry->partition_id = partition_id;
187 		    __entry->vp_index = vp_index;
188 		    __entry->page_type = page_type;
189 		    __entry->status = status;
190 	    ),
191 	    TP_printk("partition_id=%llu vp_index=%u page_type=%u status=%#llx",
192 		    __entry->partition_id,
193 		    __entry->vp_index,
194 		    __entry->page_type,
195 		    __entry->status
196 	    )
197 );
198 
199 TRACE_EVENT(mshv_drain_vp_signals,
200 	    TP_PROTO(u64 partition_id, u32 vp_index),
201 	    TP_ARGS(partition_id, vp_index),
202 	    TP_STRUCT__entry(
203 		    __field(u64, partition_id)
204 		    __field(u32, vp_index)
205 	    ),
206 	    TP_fast_assign(
207 		    __entry->partition_id = partition_id;
208 		    __entry->vp_index = vp_index;
209 	    ),
210 	    TP_printk("partition_id=%llu vp_index=%u",
211 		    __entry->partition_id,
212 		    __entry->vp_index
213 	    )
214 );
215 
216 TRACE_EVENT(mshv_disable_vp_dispatch,
217 	    TP_PROTO(u64 partition_id, u32 vp_index, int ret),
218 	    TP_ARGS(partition_id, vp_index, ret),
219 	    TP_STRUCT__entry(
220 		    __field(u64, partition_id)
221 		    __field(u32, vp_index)
222 		    __field(int, ret)
223 	    ),
224 	    TP_fast_assign(
225 		    __entry->partition_id = partition_id;
226 		    __entry->vp_index = vp_index;
227 		    __entry->ret = ret;
228 	    ),
229 	    TP_printk("partition_id=%llu vp_index=%u ret=%d",
230 		    __entry->partition_id,
231 		    __entry->vp_index,
232 		    __entry->ret
233 	    )
234 );
235 
236 TRACE_EVENT(mshv_vp_release,
237 	    TP_PROTO(u64 partition_id, u32 vp_index),
238 	    TP_ARGS(partition_id, vp_index),
239 	    TP_STRUCT__entry(
240 		    __field(u64, partition_id)
241 		    __field(u32, vp_index)
242 	    ),
243 	    TP_fast_assign(
244 		    __entry->partition_id = partition_id;
245 		    __entry->vp_index = vp_index;
246 	    ),
247 	    TP_printk("partition_id=%llu vp_index=%u",
248 		    __entry->partition_id,
249 		    __entry->vp_index
250 	    )
251 );
252 
253 TRACE_EVENT(mshv_run_vp_entry,
254 	    TP_PROTO(u64 partition_id, u32 vp_index),
255 	    TP_ARGS(partition_id, vp_index),
256 	    TP_STRUCT__entry(
257 		    __field(u64, partition_id)
258 		    __field(u32, vp_index)
259 	    ),
260 	    TP_fast_assign(
261 		    __entry->partition_id = partition_id;
262 		    __entry->vp_index = vp_index;
263 	    ),
264 	    TP_printk("partition_id=%llu vp_index=%u",
265 		    __entry->partition_id,
266 		    __entry->vp_index
267 	    )
268 );
269 
270 TRACE_EVENT(mshv_run_vp_exit,
271 	    TP_PROTO(u64 partition_id, u32 vp_index, u64 hv_message_type, long ret),
272 	    TP_ARGS(partition_id, vp_index, hv_message_type, ret),
273 	    TP_STRUCT__entry(
274 		    __field(u64, partition_id)
275 		    __field(u32, vp_index)
276 		    __field(u64, hv_message_type)
277 		    __field(long, ret)
278 	    ),
279 	    TP_fast_assign(
280 		    __entry->partition_id = partition_id;
281 		    __entry->vp_index = vp_index;
282 		    __entry->hv_message_type = hv_message_type;
283 		    __entry->ret = ret;
284 	    ),
285 	    TP_printk("partition_id=%llu vp_index=%u hv_message_type=%#llx ret=%ld",
286 		    __entry->partition_id,
287 		    __entry->vp_index,
288 		    __entry->hv_message_type,
289 		    __entry->ret
290 	    )
291 );
292 
293 TRACE_EVENT(mshv_vp_clear_explicit_suspend,
294 	    TP_PROTO(u64 partition_id, u32 vp_index, int ret),
295 	    TP_ARGS(partition_id, vp_index, ret),
296 	    TP_STRUCT__entry(
297 		    __field(u64, partition_id)
298 		    __field(u32, vp_index)
299 		    __field(int, ret)
300 	    ),
301 	    TP_fast_assign(
302 		    __entry->partition_id = partition_id;
303 		    __entry->vp_index = vp_index;
304 		    __entry->ret = ret;
305 	    ),
306 	    TP_printk("partition_id=%llu vp_index=%u ret=%d",
307 		    __entry->partition_id,
308 		    __entry->vp_index,
309 		    __entry->ret
310 	    )
311 );
312 
313 TRACE_EVENT(mshv_xfer_to_guest_mode_work,
314 	    TP_PROTO(u64 partition_id, u32 vp_index, unsigned long thread_info_flag, long ret),
315 	    TP_ARGS(partition_id, vp_index, thread_info_flag, ret),
316 	    TP_STRUCT__entry(
317 		    __field(u64, partition_id)
318 		    __field(u32, vp_index)
319 		    __field(unsigned long, thread_info_flag)
320 		    __field(long, ret)
321 	    ),
322 	    TP_fast_assign(
323 		    __entry->partition_id = partition_id;
324 		    __entry->vp_index = vp_index;
325 		    __entry->thread_info_flag = thread_info_flag;
326 		    __entry->ret = ret;
327 	    ),
328 	    TP_printk("partition_id=%llu vp_index=%u thread_info_flag=%#lx ret=%ld",
329 		    __entry->partition_id,
330 		    __entry->vp_index,
331 		    __entry->thread_info_flag,
332 		    __entry->ret
333 	    )
334 );
335 
336 TRACE_EVENT(mshv_hvcall_dispatch_vp,
337 	    TP_PROTO(u64 partition_id, u32 vp_index, u32 flags,
338 		     u32 dispatch_state, u32 dispatch_event, u64 irq_vectors, u64 status),
339 	    TP_ARGS(partition_id, vp_index, flags, dispatch_state, dispatch_event, irq_vectors,
340 		    status),
341 	    TP_STRUCT__entry(
342 		    __field(u64, partition_id)
343 		    __field(u32, vp_index)
344 		    __field(u32, flags)
345 		    __field(u32, dispatch_state)
346 		    __field(u32, dispatch_event)
347 		    __field(u64, irq_vectors)
348 		    __field(u64, status)
349 	    ),
350 	    TP_fast_assign(
351 		    __entry->partition_id = partition_id;
352 		    __entry->vp_index = vp_index;
353 		    __entry->flags = flags;
354 		    __entry->dispatch_state = dispatch_state;
355 		    __entry->dispatch_event = dispatch_event;
356 		    __entry->irq_vectors = irq_vectors;
357 		    __entry->status = status;
358 	    ),
359 	    TP_printk("partition_id=%llu vp_index=%u flags=%#x dispatch_state=%#x dispatch_event=%#x irq_vectors=%#016llx status=%#llx",
360 		    __entry->partition_id,
361 		    __entry->vp_index,
362 		    __entry->flags,
363 		    __entry->dispatch_state,
364 		    __entry->dispatch_event,
365 		    __entry->irq_vectors,
366 		    __entry->status
367 	     )
368 );
369 
370 TRACE_EVENT(mshv_update_routing_table,
371 	    TP_PROTO(u64 partition_id, void *old, void *new, u32 numents),
372 	    TP_ARGS(partition_id, old, new, numents),
373 	    TP_STRUCT__entry(
374 		    __field(u64, partition_id)
375 		    __field(struct mshv_girq_routing_table *, old)
376 		    __field(struct mshv_girq_routing_table *, new)
377 		    __field(u32, numents)
378 	    ),
379 	    TP_fast_assign(
380 		    __entry->partition_id = partition_id;
381 		    __entry->old = old;
382 		    __entry->new = new;
383 		    __entry->numents = numents;
384 	    ),
385 	    TP_printk("partition_id=%llu old=%p new=%p numents=%u",
386 		    __entry->partition_id,
387 		    __entry->old,
388 		    __entry->new,
389 		    __entry->numents
390 	    )
391 );
392 
393 TRACE_EVENT(mshv_map_user_memory,
394 	    TP_PROTO(u64 partition_id, u64 start_uaddr, u64 start_gfn, u64 nr_pages, u32 map_flags,
395 		     long ret),
396 	    TP_ARGS(partition_id, start_uaddr, start_gfn, nr_pages, map_flags, ret),
397 	    TP_STRUCT__entry(
398 		    __field(u64, partition_id)
399 		    __field(u64, start_uaddr)
400 		    __field(u64, start_gfn)
401 		    __field(u64, nr_pages)
402 		    __field(u32, map_flags)
403 		    __field(long, ret)
404 	    ),
405 	    TP_fast_assign(
406 		    __entry->partition_id = partition_id;
407 		    __entry->start_uaddr = start_uaddr;
408 		    __entry->start_gfn = start_gfn;
409 		    __entry->nr_pages = nr_pages;
410 		    __entry->map_flags = map_flags;
411 		    __entry->ret = ret;
412 	    ),
413 	    TP_printk("partition_id=%llu start_uaddr=%#llx start_gfn=%#llx nr_pages=%llu map_flags=%#x ret=%ld",
414 		    __entry->partition_id,
415 		    __entry->start_uaddr,
416 		    __entry->start_gfn,
417 		    __entry->nr_pages,
418 		    __entry->map_flags,
419 		    __entry->ret
420 	     )
421 );
422 
423 TRACE_EVENT(mshv_assign_ioeventfd,
424 	    TP_PROTO(u64 partition_id, u64 addr, u64 length, u64 datamatch, bool wildcard,
425 		     void *eventfd, int ret),
426 	    TP_ARGS(partition_id, addr, length, datamatch, wildcard, eventfd, ret),
427 	    TP_STRUCT__entry(
428 		    __field(u64, partition_id)
429 		    __field(u64, addr)
430 		    __field(u64, length)
431 		    __field(u64, datamatch)
432 		    __field(bool, wildcard)
433 		    __field(struct eventfd_ctx *, eventfd)
434 		    __field(int, ret)
435 	    ),
436 	    TP_fast_assign(
437 		    __entry->partition_id = partition_id;
438 		    __entry->addr = addr;
439 		    __entry->length = length;
440 		    __entry->datamatch = datamatch;
441 		    __entry->wildcard = wildcard;
442 		    __entry->eventfd = eventfd;
443 		    __entry->ret = ret;
444 	    ),
445 	    TP_printk("partition_id=%llu addr=%#016llx length=%#llx datamatch=%#llx wildcard=%d eventfd=%p ret=%d",
446 		    __entry->partition_id,
447 		    __entry->addr,
448 		    __entry->length,
449 		    __entry->datamatch,
450 		    __entry->wildcard,
451 		    __entry->eventfd,
452 		    __entry->ret
453 	     )
454 );
455 
456 TRACE_EVENT(mshv_deassign_ioeventfd,
457 	    TP_PROTO(u64 partition_id, u64 addr, u64 length, u64 datamatch, bool wildcard,
458 		     void *eventfd),
459 	    TP_ARGS(partition_id, addr, length, datamatch, wildcard, eventfd),
460 	    TP_STRUCT__entry(
461 		    __field(u64, partition_id)
462 		    __field(u64, addr)
463 		    __field(u64, length)
464 		    __field(u64, datamatch)
465 		    __field(bool, wildcard)
466 		    __field(struct eventfd_ctx *, eventfd)
467 	    ),
468 	    TP_fast_assign(
469 		    __entry->partition_id = partition_id;
470 		    __entry->addr = addr;
471 		    __entry->length = length;
472 		    __entry->datamatch = datamatch;
473 		    __entry->wildcard = wildcard;
474 		    __entry->eventfd = eventfd;
475 	    ),
476 	    TP_printk("partition_id=%llu addr=%#016llx length=%#llx datamatch=%#llx wildcard=%d eventfd=%p",
477 		    __entry->partition_id,
478 		    __entry->addr,
479 		    __entry->length,
480 		    __entry->datamatch,
481 		    __entry->wildcard,
482 		    __entry->eventfd
483 	     )
484 );
485 
486 TRACE_EVENT(mshv_vp_wait_for_hv_kick,
487 	    TP_PROTO(u64 partition_id, u32 vp_index, bool kicked_by_hv, bool blocked,
488 		     bool irq_pending),
489 	    TP_ARGS(partition_id, vp_index, kicked_by_hv, blocked, irq_pending),
490 	    TP_STRUCT__entry(
491 		    __field(u64, partition_id)
492 		    __field(u32, vp_index)
493 		    __field(bool, kicked_by_hv)
494 		    __field(bool, blocked)
495 		    __field(bool, irq_pending)
496 	    ),
497 	    TP_fast_assign(
498 		    __entry->partition_id = partition_id;
499 		    __entry->vp_index = vp_index;
500 		    __entry->kicked_by_hv = kicked_by_hv;
501 		    __entry->blocked = blocked;
502 		    __entry->irq_pending = irq_pending;
503 	    ),
504 	    TP_printk("partition_id=%llu vp_index=%u kicked_by_hv=%d blocked=%d irq_pending=%d",
505 		    __entry->partition_id,
506 		    __entry->vp_index,
507 		    __entry->kicked_by_hv,
508 		    __entry->blocked,
509 		    __entry->irq_pending
510 	    )
511 );
512 
513 TRACE_EVENT(mshv_handle_gpa_intercept,
514 	    TP_PROTO(u64 partition_id, u32 vp_index, u64 gfn, u8 access_type, bool handled),
515 	    TP_ARGS(partition_id, vp_index, gfn, access_type, handled),
516 	    TP_STRUCT__entry(
517 		    __field(u64, partition_id)
518 		    __field(u32, vp_index)
519 		    __field(u64, gfn)
520 		    __field(u8, access_type)
521 		    __field(bool, handled)
522 	    ),
523 	    TP_fast_assign(
524 		    __entry->partition_id = partition_id;
525 		    __entry->vp_index = vp_index;
526 		    __entry->gfn = gfn;
527 		    __entry->access_type = access_type == HV_INTERCEPT_ACCESS_READ ? 'R' :
528 					   (access_type == HV_INTERCEPT_ACCESS_WRITE ? 'W' :
529 					    (access_type == HV_INTERCEPT_ACCESS_EXECUTE ? 'X' : '?'));
530 		    __entry->handled = handled;
531 	    ),
532 	    TP_printk("partition_id=%llu vp_index=%u gfn=0x%llx access_type=%c handled=%d",
533 		    __entry->partition_id,
534 		    __entry->vp_index,
535 		    __entry->gfn,
536 		    __entry->access_type,
537 		    __entry->handled
538 	    )
539 );
540 
541 #endif /* _MSHV_TRACE_H_ */
542 
543 /* This part must be outside protection */
544 #include <trace/define_trace.h>
545