Add ability for KVM TRACE to work on other archs
PATCH 1/1 Add ability for KVM TRACE to work on other archs
This set of patches allows KVM TRACE to work on other architectures by moving definitions to common places and changing how variables in data structures are used.
5 files changed, 66 insertions(+), 51 deletions(-) include/asm-x86/kvm.h | 22 --------------------- include/asm-x86/kvm_host.h | 18 ----------------- include/linux/kvm.h | 10 ++++++--- include/linux/kvm_host.h | 45 ++++++++++++++++++++++++++++++++++++++++++++ virt/kvm/kvm_trace.c | 22 +++++++++++++--------
PATCH 1/1 Remove use of bit fields in kvm trace structure
2 files changed, 21 insertions(+), 11 deletions(-) include/linux/kvm.h | 10 +++++++--- virt/kvm/kvm_trace.c | 22 ++++++++++++++--------
This patch fixes kvmtrace use on big endian systems. When using bit fields the compiler will lay data out in the wrong order expected when laid down into a file. This fixes it by using one variable instead of using bit fields.
include/linux/kvm.h +7 -3
@@ -311,9 +311,13 @@ struct kvm_s390_interrupt {/* This structure represents a single trace buffer record. */ struct kvm_trace_rec { -__u32 event:28 ; -__u32 extra_u32:3 ; -__u32 cycle_in:1 ; +/* variable rec_val +* is split into: +* bits 0 - 27 -> event id +* bits 28 -30 -> number of extra data args of size u32 +* bits 31 -> binary indicator for if tsc is in record +*/ +__u32 rec_val;__u32 pid;__u32 vcpu_id;union {
virt/kvm/kvm_trace.c +14 -8
@@ -54,12 +54,15 @@ static void kvm_add_trace(void *probe_prstruct kvm_trace *kt = kvm_trace;struct kvm_trace_rec rec;struct kvm_vcpu *vcpu; -int i, extra, size; +int i, size; +u32 extra;if (unlikely (kt->trace_state !=KVM_TRACE_STATE_RUNNING ))return ; + +/* set event id */ + rec.rec_val =0x0fffffff &va_arg (*args, u32); - rec.event =va_arg (*args, u32); vcpu = va_arg(*args, struct kvm_vcpu *); rec.pid = current->tgid; rec.vcpu_id = vcpu->vcpu_id;
@@ -67,21 +70,24 @@ static void kvm_add_trace(void *probe_pr extra =va_arg (*args, u32);WARN_ON (!(extra <=KVM_TRC_EXTRA_MAX )); extra =min_t (u32, extra,KVM_TRC_EXTRA_MAX ); - rec.extra_u32 = extra; - rec.cycle_in = p->cycle_in; +/* set inidicator for tcs record */ + rec.rec_val |=0x80000000 & (p->cycle_in <<31 ); + +/* set extra data num */ + rec.rec_val |=0x70000000 & (extra <<28 ); -if (rec.cycle_in) { +if (p->cycle_in) { rec.u.cycle.cycle_u64 =get_cycles (); -for (i =0 ; i < rec.extra_u32; i++) +for (i =0 ; i < extra; i++) rec.u.cycle.extra_u32[i] =va_arg (*args, u32); }else { -for (i =0 ; i < rec.extra_u32; i++) +for (i =0 ; i < extra; i++) rec.u.nocycle.extra_u32[i] =va_arg (*args, u32); } - size =calc_rec_size (rec.cycle_in, rec.extra_u32 *sizeof (u32)); + size =calc_rec_size (p->cycle_in, extra *sizeof (u32));relay_write (kt->rchan, &rec, size); }
Re: [PATCH 1 of 3] Remove use of bit fields in kvm trace structure
Slightly unconventional coding style, but Acked-by: Hollis Blanchard <[email protected]>
Eric, as I mentioned previously, bitfields cannot be used in portable binary formats.
Avi, would you apply please?

Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
Quoted 85 lines · Jerone Young
2 files changed, 21 insertions(+), 11 deletions(-) include/linux/kvm.h | 10 +++++++--- virt/kvm/kvm_trace.c | 22 ++++++++++++++--------This patch fixes kvmtrace use on big endian systems. When using bit fields the compiler will lay data out in the wrong order expected when laid down into a file. This fixes it by using one variable instead of using bit fields.
Signed-off-by Jerone Young <[email protected]>include/linux/kvm.h +7
-3@@ -311,9 +311,13 @@ struct kvm_s390_interrupt {/* This structure represents a single trace buffer record. */ struct kvm_trace_rec { -__u32 event:28 ; -__u32 extra_u32:3 ; -__u32 cycle_in:1 ; +/* variable rec_val +* is split into: +* bits 0 - 27 -> event id +* bits 28 -30 -> number of extra data args of size u32 +* bits 31 -> binary indicator for if tsc is in record +*/ +__u32 rec_val;__u32 pid;__u32 vcpu_id;union {virt/kvm/kvm_trace.c +14
-9@@ -54,12 +54,15 @@ static void kvm_add_trace(void *probe_prstruct kvm_trace *kt = kvm_trace;struct kvm_trace_rec rec;struct kvm_vcpu *vcpu; -int i, extra, size; +int i, size; +u32 extra;if (unlikely (kt->trace_state !=KVM_TRACE_STATE_RUNNING ))return ; + +/* set event id */ + rec.rec_val =0x0fffffff &va_arg (*args, u32); - rec.event =va_arg (*args, u32); vcpu = va_arg(*args, struct kvm_vcpu *); rec.pid = current->tgid; rec.vcpu_id = vcpu->vcpu_id;@@ -67,21 +70,24 @@ static void kvm_add_trace(void *probe_pr extra =va_arg (*args, u32);WARN_ON (!(extra <=KVM_TRC_EXTRA_MAX )); extra =min_t (u32, extra,KVM_TRC_EXTRA_MAX ); - rec.extra_u32 = extra; - rec.cycle_in = p->cycle_in; +/* set inidicator for tcs record */ + rec.rec_val |=0x80000000 & (p->cycle_in <<31 ); + +/* set extra data num */ + rec.rec_val |=0x70000000 & (extra <<28 ); -if (rec.cycle_in) { +if (p->cycle_in) { rec.u.cycle.cycle_u64 =get_cycles (); -for (i =0 ; i < rec.extra_u32; i++) +for (i =0 ; i < extra; i++) rec.u.cycle.extra_u32[i] =va_arg (*args, u32); }else { -for (i =0 ; i < rec.extra_u32; i++) +for (i =0 ; i < extra; i++) rec.u.nocycle.extra_u32[i] =va_arg (*args, u32); } - size =calc_rec_size (rec.cycle_in, rec.extra_u32 *sizeof (u32)); + size =calc_rec_size (p->cycle_in, extra *sizeof (u32));relay_write (kt->rchan, &rec, size); } --To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1 of 3] Remove use of bit fields in kvm trace structure
In reply to Jerone YoungQuoted 13 lines · Jerone Young
This patch fixes kvmtrace use on big endian systems. When using bit fields the compiler will lay data out in the wrong order expected when laid down into a file. This fixes it by using one variable instead of using bit fields.
Signed-off-by Jerone Young <[email protected]>include/linux/kvm.h +0
-1@@ -311,9 +311,13 @@ struct kvm_s390_interrupt {/* This structure represents a single trace buffer record. */ struct kvm_trace_rec { -__u32 event:28 ;
include/linux/kvm.h struct kvm_s390_interrupt { · line 321
Quoted 10 lines
include/linux/kvm.h +7
-2- __u32 extra_u32:3; - __u32 cycle_in:1; +/* variable rec_val +* is split into: +* bits 0 - 27 -> event id +* bits 28 -30 -> number of extra data args of size u32 +* bits 31 -> binary indicator for if tsc is in record +*/ +__u32 rec_val;
Please use #defines for shifts and masks instead of open-coding. These #defines would be part of the public interface.
Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
PATCH 1/1 Move KVM TRACE DEFINITIONS to common header
In reply to Jerone Young3 files changed, 40 insertions(+), 40 deletions(-) include/asm-x86/kvm.h | 22 ---------------------- include/asm-x86/kvm_host.h | 18 ------------------ include/linux/kvm_host.h | 40 ++++++++++++++++++++++++++++++++++++++++
This patch moves moves definitions required to use kvm trace from x86 specific kvm headers to common kvm headers.
include/asm-x86/kvm.h +0 -22
@@ -208,26 +208,4 @@ struct kvm_pit_state {struct kvm_pit_state {struct kvm_pit_channel_state channels[3 ]; }; - -#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) -#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) -#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) -#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) -#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) -#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) -#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) -#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) -#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) -#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) -#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) -#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) -#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) -#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) -#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) -#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) -#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) -#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) -#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) -#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) -#endif
include/asm-x86/kvm_host.h +0 -18
@@ -683,24 +683,6 @@ enum { TASK_SWITCH_GATE = 3, }; -#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 5, d1, d2, d3, d4, d5) -#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 4, d1, d2, d3, d4, 0) -#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 3, d1, d2, d3, 0, 0) -#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 2, d1, d2, 0, 0, 0) -#define KVMTRACE_1D (evt, vcpu, d1, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 1, d1, 0, 0, 0, 0) -#define KVMTRACE_0D (evt, vcpu, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 0, 0, 0, 0, 0, 0)#ifdef CONFIG_64BIT #define KVM_EX_ENTRY ".quad"
include/linux/kvm_host.h +40 -0
@@ -322,6 +322,46 @@ extern struct dentry *kvm_debugfs_dir;#ifdef CONFIG_KVM_TRACE int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg);void kvm_trace_cleanup (void ); + +#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 5, d1, d2, d3, d4, d5) +#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 4, d1, d2, d3, d4, 0) +#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 3, d1, d2, d3, 0, 0) +#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 2, d1, d2, 0, 0, 0) +#define KVMTRACE_1D (evt, vcpu, d1, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 1, d1, 0, 0, 0, 0) +#define KVMTRACE_0D (evt, vcpu, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 0, 0, 0, 0, 0, 0) + +#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) +#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) +#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) +#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) +#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) +#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) +#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) +#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) +#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) +#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) +#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) +#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) +#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) +#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) +#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) +#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) +#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) +#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) +#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) +#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15)#else static inline int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg)
Re: [PATCH 2 of 3] Move KVM TRACE DEFINITIONS to common header
Quoted 9 lines · Jerone Young
3 files changed, 40 insertions(+), 40 deletions(-) include/asm-x86/kvm.h | 22 ---------------------- include/asm-x86/kvm_host.h | 18 ------------------ include/linux/kvm_host.h | 40 ++++++++++++++++++++++++++++++++++++++++This patch moves moves definitions required to use kvm trace from x86 specific kvm headers to common kvm headers.
I applied patch 1, but:
Quoted 25 lines
vcpu, 0, 0, 0, 0, 0, 0)#ifdef
CONFIG_64BIT
#defineKVM_EX_ENTRY".quad"include/linux/kvm_host.h +13
-0@@ -322,6 +322,46 @@ extern struct dentry *kvm_debugfs_dir;#ifdef CONFIG_KVM_TRACE int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg);void kvm_trace_cleanup (void ); +#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) +#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) +#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) +#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) +#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) +#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) +#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) +#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) +#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) +#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) +#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) +#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) +#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E)
include/linux/kvm_host.h extern struct dentry *kvm_debugfs_dir; · line 347
Quoted 10 lines
include/linux/kvm_host.h +7
-0+#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) +#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) +#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) +#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) +#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) +#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) +#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15)#else static inline int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg)
This hides the defines from the public interface. The KVM_TRC_* constants should be in kvm.h.
Signature · 1 line
error compiling committee.c: too many arguments to function
PATCH 1/1 Move KVM TRACE DEFINITIONS to common header
Move KVM trace definitions from x86 specific kvm headers to common kvm headers to create a cross-architecture numbering scheme for trace events. This means the kvmtrace_format userspace tool won't need to know which architecture produced the log file being processed.
---
Avi, you said you already applied #1, and this is the revised #2. There is no need to apply #3; I've combined those macro definitions with the PowerPC-specific patches that use them.
include/asm-x86/kvm.h +0 -22
@@ -208,26 +208,4 @@ struct kvm_pit_state {struct kvm_pit_state {struct kvm_pit_channel_state channels[3 ]; }; - -#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) -#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) -#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) -#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) -#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) -#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) -#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) -#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) -#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) -#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) -#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) -#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) -#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) -#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) -#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) -#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) -#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) -#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) -#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) -#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) -#endif
include/asm-x86/kvm_host.h +0 -18
@@ -685,24 +685,6 @@ enum { TASK_SWITCH_GATE = 3, }; -#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 5, d1, d2, d3, d4, d5) -#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 4, d1, d2, d3, d4, 0) -#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 3, d1, d2, d3, 0, 0) -#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 2, d1, d2, 0, 0, 0) -#define KVMTRACE_1D (evt, vcpu, d1, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 1, d1, 0, 0, 0, 0) -#define KVMTRACE_0D (evt, vcpu, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 0, 0, 0, 0, 0, 0)#ifdef CONFIG_64BIT #define KVM_EX_ENTRY ".quad"
include/linux/kvm.h +21 -0
@@ -450,4 +450,25 @@ struct kvm_trace_rec {#define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state)#define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) +#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) +#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) +#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) +#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) +#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) +#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) +#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) +#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) +#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) +#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) +#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) +#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) +#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) +#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) +#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) +#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) +#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) +#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) +#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) +#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) +#endif
include/linux/kvm_host.h +20 -0
@@ -322,6 +322,26 @@ extern struct dentry *kvm_debugfs_dir;#ifdef CONFIG_KVM_TRACE int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg);void kvm_trace_cleanup (void ); + +#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 5, d1, d2, d3, d4, d5) +#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 4, d1, d2, d3, d4, 0) +#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 3, d1, d2, d3, 0, 0) +#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 2, d1, d2, 0, 0, 0) +#define KVMTRACE_1D (evt, vcpu, d1, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 1, d1, 0, 0, 0, 0) +#define KVMTRACE_0D (evt, vcpu, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 0, 0, 0, 0, 0, 0) +#else static inline int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg)
Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
PATCH v2 1/1 Move KVM TRACE DEFINITIONS to common header
Move KVM trace definitions from x86 specific kvm headers to common kvm headers to create a cross-architecture numbering scheme for trace events. This means the kvmtrace_format userspace tool won't need to know which architecture produced the log file being processed.
---
The previous versions of this patch would not build when CONFIG_KVM_TRACE was not enabled. Please use this patch instead.
include/asm-x86/kvm.h +0 -22
@@ -208,26 +208,4 @@ struct kvm_pit_state {struct kvm_pit_state {struct kvm_pit_channel_state channels[3 ]; }; - -#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) -#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) -#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) -#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) -#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) -#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) -#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) -#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) -#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) -#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) -#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) -#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) -#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) -#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) -#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) -#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) -#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) -#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) -#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) -#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) -#endif
include/asm-x86/kvm_host.h +0 -18
@@ -685,24 +685,6 @@ enum { TASK_SWITCH_GATE = 3, }; -#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 5, d1, d2, d3, d4, d5) -#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 4, d1, d2, d3, d4, 0) -#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 3, d1, d2, d3, 0, 0) -#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 2, d1, d2, 0, 0, 0) -#define KVMTRACE_1D (evt, vcpu, d1, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 1, d1, 0, 0, 0, 0) -#define KVMTRACE_0D (evt, vcpu, name) \ - trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ - vcpu, 0, 0, 0, 0, 0, 0)#ifdef CONFIG_64BIT #define KVM_EX_ENTRY ".quad"
include/linux/kvm.h +21 -0
@@ -450,4 +450,25 @@ struct kvm_trace_rec {#define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state)#define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) +#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) +#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) +#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04) +#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05) +#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06) +#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07) +#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08) +#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09) +#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A) +#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B) +#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C) +#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D) +#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E) +#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F) +#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10) +#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11) +#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) +#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) +#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) +#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) +#endif
include/linux/kvm_host.h +19 -0
@@ -319,6 +319,25 @@ extern struct kvm_stats_debugfs_item debextern struct kvm_stats_debugfs_item debugfs_entries[];extern struct dentry *kvm_debugfs_dir; +#define KVMTRACE_5D (evt, vcpu, d1, d2, d3, d4, d5, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 5, d1, d2, d3, d4, d5) +#define KVMTRACE_4D (evt, vcpu, d1, d2, d3, d4, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 4, d1, d2, d3, d4, 0) +#define KVMTRACE_3D (evt, vcpu, d1, d2, d3, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 3, d1, d2, d3, 0, 0) +#define KVMTRACE_2D (evt, vcpu, d1, d2, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 2, d1, d2, 0, 0, 0) +#define KVMTRACE_1D (evt, vcpu, d1, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 1, d1, 0, 0, 0, 0) +#define KVMTRACE_0D (evt, vcpu, name) \ + trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ + vcpu, 0, 0, 0, 0, 0, 0) +#ifdef CONFIG_KVM_TRACE int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg);void kvm_trace_cleanup (void );
Signature · 2 lines
Hollis Blanchard IBM Linux Technology Center
Avi Kivity
AppliedRe: [PATCH 2 of 3] [v2] Move KVM TRACE DEFINITIONS to common header
Quoted 6 lines · Hollis Blanchard
Move KVM trace definitions from x86 specific kvm headers to common kvm headers to create a cross-architecture numbering scheme for trace events. This means the
kvmtrace_formatuserspace tool won't need to know which architecture produced the log file being processed.
Applied, thanks.
Signature · 2 lines
I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.
PATCH 1/1 Add new KVM TRACE events
In reply to Jerone Young1 file changed, 5 insertions(+)
include/linux/kvm_host.h | 5 +++++
Add new kvm trace events.
- context switch
- TLB write
- TLB invalidate
- guest TLB write
- shadow TLB write
include/linux/kvm_host.h +5 -0
@@ -362,6 +362,11 @@ void kvm_trace_cleanup(void);#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13)#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14)#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) +#define KVM_TRC_CONT_SWITCH (KVM_TRC_HANDLER + 0x16)/* context switch */ +#define KVM_TRC_TLB_WRITE (KVM_TRC_HANDLER + 0x17)/* TLB write */ +#define KVM_TRC_TLB_INVAL (KVM_TRC_HANDLER + 0x18)/* TLB invalidate */ +#define KVM_TRC_GTLB_WRITE (KVM_TRC_HANDLER + 0x19)/* guest TLB write */ +#define KVM_TRC_STLB_WRITE (KVM_TRC_HANDLER + 0x20)/* shadow TLB write */ #else static inline int kvm_trace_ioctl (unsigned int ioctl,unsigned long arg)