brintos

brintos / linux-shallow public Read only

0
0
Text · 10.9 KiB · 74e40d5 Raw
496 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#if !defined(_TRACE_KVM_MAIN_H) || defined(TRACE_HEADER_MULTI_READ)3#define _TRACE_KVM_MAIN_H4 5#include <linux/tracepoint.h>6 7#undef TRACE_SYSTEM8#define TRACE_SYSTEM kvm9 10#define ERSN(x) { KVM_EXIT_##x, "KVM_EXIT_" #x }11 12#define kvm_trace_exit_reason						\13	ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL),	\14	ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN),	\15	ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR),	\16	ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\17	ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL),	\18	ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH), ERSN(EPR),\19	ERSN(SYSTEM_EVENT), ERSN(S390_STSI), ERSN(IOAPIC_EOI),          \20	ERSN(HYPERV), ERSN(ARM_NISV), ERSN(X86_RDMSR), ERSN(X86_WRMSR)21 22TRACE_EVENT(kvm_userspace_exit,23	    TP_PROTO(__u32 reason, int errno),24	    TP_ARGS(reason, errno),25 26	TP_STRUCT__entry(27		__field(	__u32,		reason		)28		__field(	int,		errno		)29	),30 31	TP_fast_assign(32		__entry->reason		= reason;33		__entry->errno		= errno;34	),35 36	TP_printk("reason %s (%d)",37		  __entry->errno < 0 ?38		  (__entry->errno == -EINTR ? "restart" : "error") :39		  __print_symbolic(__entry->reason, kvm_trace_exit_reason),40		  __entry->errno < 0 ? -__entry->errno : __entry->reason)41);42 43TRACE_EVENT(kvm_vcpu_wakeup,44	    TP_PROTO(__u64 ns, bool waited, bool valid),45	    TP_ARGS(ns, waited, valid),46 47	TP_STRUCT__entry(48		__field(	__u64,		ns		)49		__field(	bool,		waited		)50		__field(	bool,		valid		)51	),52 53	TP_fast_assign(54		__entry->ns		= ns;55		__entry->waited		= waited;56		__entry->valid		= valid;57	),58 59	TP_printk("%s time %lld ns, polling %s",60		  __entry->waited ? "wait" : "poll",61		  __entry->ns,62		  __entry->valid ? "valid" : "invalid")63);64 65#if defined(CONFIG_HAVE_KVM_IRQCHIP)66TRACE_EVENT(kvm_set_irq,67	TP_PROTO(unsigned int gsi, int level, int irq_source_id),68	TP_ARGS(gsi, level, irq_source_id),69 70	TP_STRUCT__entry(71		__field(	unsigned int,	gsi		)72		__field(	int,		level		)73		__field(	int,		irq_source_id	)74	),75 76	TP_fast_assign(77		__entry->gsi		= gsi;78		__entry->level		= level;79		__entry->irq_source_id	= irq_source_id;80	),81 82	TP_printk("gsi %u level %d source %d",83		  __entry->gsi, __entry->level, __entry->irq_source_id)84);85#endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */86 87#if defined(__KVM_HAVE_IOAPIC)88#define kvm_deliver_mode		\89	{0x0, "Fixed"},			\90	{0x1, "LowPrio"},		\91	{0x2, "SMI"},			\92	{0x3, "Res3"},			\93	{0x4, "NMI"},			\94	{0x5, "INIT"},			\95	{0x6, "SIPI"},			\96	{0x7, "ExtINT"}97 98TRACE_EVENT(kvm_ioapic_set_irq,99	    TP_PROTO(__u64 e, int pin, bool coalesced),100	    TP_ARGS(e, pin, coalesced),101 102	TP_STRUCT__entry(103		__field(	__u64,		e		)104		__field(	int,		pin		)105		__field(	bool,		coalesced	)106	),107 108	TP_fast_assign(109		__entry->e		= e;110		__entry->pin		= pin;111		__entry->coalesced	= coalesced;112	),113 114	TP_printk("pin %u dst %x vec %u (%s|%s|%s%s)%s",115		  __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e,116		  __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),117		  (__entry->e & (1<<11)) ? "logical" : "physical",118		  (__entry->e & (1<<15)) ? "level" : "edge",119		  (__entry->e & (1<<16)) ? "|masked" : "",120		  __entry->coalesced ? " (coalesced)" : "")121);122 123TRACE_EVENT(kvm_ioapic_delayed_eoi_inj,124	    TP_PROTO(__u64 e),125	    TP_ARGS(e),126 127	TP_STRUCT__entry(128		__field(	__u64,		e		)129	),130 131	TP_fast_assign(132		__entry->e		= e;133	),134 135	TP_printk("dst %x vec %u (%s|%s|%s%s)",136		  (u8)(__entry->e >> 56), (u8)__entry->e,137		  __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode),138		  (__entry->e & (1<<11)) ? "logical" : "physical",139		  (__entry->e & (1<<15)) ? "level" : "edge",140		  (__entry->e & (1<<16)) ? "|masked" : "")141);142 143TRACE_EVENT(kvm_msi_set_irq,144	    TP_PROTO(__u64 address, __u64 data),145	    TP_ARGS(address, data),146 147	TP_STRUCT__entry(148		__field(	__u64,		address		)149		__field(	__u64,		data		)150	),151 152	TP_fast_assign(153		__entry->address	= address;154		__entry->data		= data;155	),156 157	TP_printk("dst %llx vec %u (%s|%s|%s%s)",158		  (u8)(__entry->address >> 12) | ((__entry->address >> 32) & 0xffffff00),159		  (u8)__entry->data,160		  __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode),161		  (__entry->address & (1<<2)) ? "logical" : "physical",162		  (__entry->data & (1<<15)) ? "level" : "edge",163		  (__entry->address & (1<<3)) ? "|rh" : "")164);165 166#define kvm_irqchips						\167	{KVM_IRQCHIP_PIC_MASTER,	"PIC master"},		\168	{KVM_IRQCHIP_PIC_SLAVE,		"PIC slave"},		\169	{KVM_IRQCHIP_IOAPIC,		"IOAPIC"}170 171#endif /* defined(__KVM_HAVE_IOAPIC) */172 173#if defined(CONFIG_HAVE_KVM_IRQCHIP)174 175#ifdef kvm_irqchips176#define kvm_ack_irq_string "irqchip %s pin %u"177#define kvm_ack_irq_parm  __print_symbolic(__entry->irqchip, kvm_irqchips), __entry->pin178#else179#define kvm_ack_irq_string "irqchip %d pin %u"180#define kvm_ack_irq_parm  __entry->irqchip, __entry->pin181#endif182 183TRACE_EVENT(kvm_ack_irq,184	TP_PROTO(unsigned int irqchip, unsigned int pin),185	TP_ARGS(irqchip, pin),186 187	TP_STRUCT__entry(188		__field(	unsigned int,	irqchip		)189		__field(	unsigned int,	pin		)190	),191 192	TP_fast_assign(193		__entry->irqchip	= irqchip;194		__entry->pin		= pin;195	),196 197	TP_printk(kvm_ack_irq_string, kvm_ack_irq_parm)198);199 200#endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */201 202 203 204#define KVM_TRACE_MMIO_READ_UNSATISFIED 0205#define KVM_TRACE_MMIO_READ 1206#define KVM_TRACE_MMIO_WRITE 2207 208#define kvm_trace_symbol_mmio \209	{ KVM_TRACE_MMIO_READ_UNSATISFIED, "unsatisfied-read" }, \210	{ KVM_TRACE_MMIO_READ, "read" }, \211	{ KVM_TRACE_MMIO_WRITE, "write" }212 213TRACE_EVENT(kvm_mmio,214	TP_PROTO(int type, int len, u64 gpa, void *val),215	TP_ARGS(type, len, gpa, val),216 217	TP_STRUCT__entry(218		__field(	u32,	type		)219		__field(	u32,	len		)220		__field(	u64,	gpa		)221		__field(	u64,	val		)222	),223 224	TP_fast_assign(225		__entry->type		= type;226		__entry->len		= len;227		__entry->gpa		= gpa;228		__entry->val		= 0;229		if (val)230			memcpy(&__entry->val, val,231			       min_t(u32, sizeof(__entry->val), len));232	),233 234	TP_printk("mmio %s len %u gpa 0x%llx val 0x%llx",235		  __print_symbolic(__entry->type, kvm_trace_symbol_mmio),236		  __entry->len, __entry->gpa, __entry->val)237);238 239#define kvm_fpu_load_symbol	\240	{0, "unload"},		\241	{1, "load"}242 243TRACE_EVENT(kvm_fpu,244	TP_PROTO(int load),245	TP_ARGS(load),246 247	TP_STRUCT__entry(248		__field(	u32,	        load		)249	),250 251	TP_fast_assign(252		__entry->load		= load;253	),254 255	TP_printk("%s", __print_symbolic(__entry->load, kvm_fpu_load_symbol))256);257 258#ifdef CONFIG_KVM_ASYNC_PF259DECLARE_EVENT_CLASS(kvm_async_get_page_class,260 261	TP_PROTO(u64 gva, u64 gfn),262 263	TP_ARGS(gva, gfn),264 265	TP_STRUCT__entry(266		__field(__u64, gva)267		__field(u64, gfn)268	),269 270	TP_fast_assign(271		__entry->gva = gva;272		__entry->gfn = gfn;273	),274 275	TP_printk("gva = %#llx, gfn = %#llx", __entry->gva, __entry->gfn)276);277 278DEFINE_EVENT(kvm_async_get_page_class, kvm_try_async_get_page,279 280	TP_PROTO(u64 gva, u64 gfn),281 282	TP_ARGS(gva, gfn)283);284 285DEFINE_EVENT(kvm_async_get_page_class, kvm_async_pf_repeated_fault,286 287	TP_PROTO(u64 gva, u64 gfn),288 289	TP_ARGS(gva, gfn)290);291 292DECLARE_EVENT_CLASS(kvm_async_pf_nopresent_ready,293 294	TP_PROTO(u64 token, u64 gva),295 296	TP_ARGS(token, gva),297 298	TP_STRUCT__entry(299		__field(__u64, token)300		__field(__u64, gva)301	),302 303	TP_fast_assign(304		__entry->token = token;305		__entry->gva = gva;306	),307 308	TP_printk("token %#llx gva %#llx", __entry->token, __entry->gva)309 310);311 312DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_not_present,313 314	TP_PROTO(u64 token, u64 gva),315 316	TP_ARGS(token, gva)317);318 319DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_ready,320 321	TP_PROTO(u64 token, u64 gva),322 323	TP_ARGS(token, gva)324);325 326TRACE_EVENT(327	kvm_async_pf_completed,328	TP_PROTO(unsigned long address, u64 gva),329	TP_ARGS(address, gva),330 331	TP_STRUCT__entry(332		__field(unsigned long, address)333		__field(u64, gva)334		),335 336	TP_fast_assign(337		__entry->address = address;338		__entry->gva = gva;339		),340 341	TP_printk("gva %#llx address %#lx",  __entry->gva,342		  __entry->address)343);344 345#endif346 347TRACE_EVENT(kvm_halt_poll_ns,348	TP_PROTO(bool grow, unsigned int vcpu_id, unsigned int new,349		 unsigned int old),350	TP_ARGS(grow, vcpu_id, new, old),351 352	TP_STRUCT__entry(353		__field(bool, grow)354		__field(unsigned int, vcpu_id)355		__field(unsigned int, new)356		__field(unsigned int, old)357	),358 359	TP_fast_assign(360		__entry->grow           = grow;361		__entry->vcpu_id        = vcpu_id;362		__entry->new            = new;363		__entry->old            = old;364	),365 366	TP_printk("vcpu %u: halt_poll_ns %u (%s %u)",367			__entry->vcpu_id,368			__entry->new,369			__entry->grow ? "grow" : "shrink",370			__entry->old)371);372 373#define trace_kvm_halt_poll_ns_grow(vcpu_id, new, old) \374	trace_kvm_halt_poll_ns(true, vcpu_id, new, old)375#define trace_kvm_halt_poll_ns_shrink(vcpu_id, new, old) \376	trace_kvm_halt_poll_ns(false, vcpu_id, new, old)377 378TRACE_EVENT(kvm_dirty_ring_push,379	TP_PROTO(struct kvm_dirty_ring *ring, u32 slot, u64 offset),380	TP_ARGS(ring, slot, offset),381 382	TP_STRUCT__entry(383		__field(int, index)384		__field(u32, dirty_index)385		__field(u32, reset_index)386		__field(u32, slot)387		__field(u64, offset)388	),389 390	TP_fast_assign(391		__entry->index          = ring->index;392		__entry->dirty_index    = ring->dirty_index;393		__entry->reset_index    = ring->reset_index;394		__entry->slot           = slot;395		__entry->offset         = offset;396	),397 398	TP_printk("ring %d: dirty 0x%x reset 0x%x "399		  "slot %u offset 0x%llx (used %u)",400		  __entry->index, __entry->dirty_index,401		  __entry->reset_index,  __entry->slot, __entry->offset,402		  __entry->dirty_index - __entry->reset_index)403);404 405TRACE_EVENT(kvm_dirty_ring_reset,406	TP_PROTO(struct kvm_dirty_ring *ring),407	TP_ARGS(ring),408 409	TP_STRUCT__entry(410		__field(int, index)411		__field(u32, dirty_index)412		__field(u32, reset_index)413	),414 415	TP_fast_assign(416		__entry->index          = ring->index;417		__entry->dirty_index    = ring->dirty_index;418		__entry->reset_index    = ring->reset_index;419	),420 421	TP_printk("ring %d: dirty 0x%x reset 0x%x (used %u)",422		  __entry->index, __entry->dirty_index, __entry->reset_index,423		  __entry->dirty_index - __entry->reset_index)424);425 426TRACE_EVENT(kvm_dirty_ring_exit,427	TP_PROTO(struct kvm_vcpu *vcpu),428	TP_ARGS(vcpu),429 430	TP_STRUCT__entry(431	    __field(int, vcpu_id)432	),433 434	TP_fast_assign(435	    __entry->vcpu_id = vcpu->vcpu_id;436	),437 438	TP_printk("vcpu %d", __entry->vcpu_id)439);440 441TRACE_EVENT(kvm_unmap_hva_range,442	TP_PROTO(unsigned long start, unsigned long end),443	TP_ARGS(start, end),444 445	TP_STRUCT__entry(446		__field(	unsigned long,	start		)447		__field(	unsigned long,	end		)448	),449 450	TP_fast_assign(451		__entry->start		= start;452		__entry->end		= end;453	),454 455	TP_printk("mmu notifier unmap range: %#016lx -- %#016lx",456		  __entry->start, __entry->end)457);458 459TRACE_EVENT(kvm_age_hva,460	TP_PROTO(unsigned long start, unsigned long end),461	TP_ARGS(start, end),462 463	TP_STRUCT__entry(464		__field(	unsigned long,	start		)465		__field(	unsigned long,	end		)466	),467 468	TP_fast_assign(469		__entry->start		= start;470		__entry->end		= end;471	),472 473	TP_printk("mmu notifier age hva: %#016lx -- %#016lx",474		  __entry->start, __entry->end)475);476 477TRACE_EVENT(kvm_test_age_hva,478	TP_PROTO(unsigned long hva),479	TP_ARGS(hva),480 481	TP_STRUCT__entry(482		__field(	unsigned long,	hva		)483	),484 485	TP_fast_assign(486		__entry->hva		= hva;487	),488 489	TP_printk("mmu notifier test age hva: %#016lx", __entry->hva)490);491 492#endif /* _TRACE_KVM_MAIN_H */493 494/* This part must be outside protection */495#include <trace/define_trace.h>496