From 5eb5fb6b40c45b1c140f46b00f5de9f73fc0bab6 Mon Sep 17 00:00:00 2001 From: Sheng Yang <[EMAIL PROTECTED]> Date: Wed, 25 Jun 2008 16:37:31 +0800 Subject: [PATCH] KVM: trace: Add event mask support.
Allow user space application to specify one or morefilter masks to limit the events being captured via it. Signed-off-by: Feng (Eric) Liu <[EMAIL PROTECTED]> Signed-off-by: Sheng Yang <[EMAIL PROTECTED]> --- include/linux/kvm.h | 7 +++++++ virt/kvm/kvm_trace.c | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-) diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 0ea064c..f1d3d9e 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -18,6 +18,9 @@ struct kvm_user_trace_setup { __u32 buf_size; /* sub_buffer size of each per-cpu */ __u32 buf_nr; /* the number of sub_buffers of each per-cpu */ + __u16 cat_mask; /* the tracing categories are enabled */ + __u16 pad1[3]; + __u64 act_bitmap[16]; /* the actions are enabled for each category */ }; /* for KVM_CREATE_MEMORY_REGION */ @@ -292,6 +295,7 @@ struct kvm_s390_interrupt { }; #define KVM_TRC_SHIFT 16 +#define KVM_TRC_CAT_NR_BITS 12 /* * kvm trace categories */ @@ -305,6 +309,9 @@ struct kvm_s390_interrupt { #define KVM_TRC_VMEXIT (KVM_TRC_ENTRYEXIT + 0x02) #define KVM_TRC_PAGE_FAULT (KVM_TRC_HANDLER + 0x01) +#define KVM_TRC_CAT(evt) (((evt) >> KVM_TRC_SHIFT) & 0x0fff) +#define KVM_TRC_ACT(evt) ((evt) & (~0u >> KVM_TRC_SHIFT)) + #define KVM_TRC_HEAD_SIZE 12 #define KVM_TRC_CYCLE_SIZE 8 #define KVM_TRC_EXTRA_MAX 7 diff --git a/virt/kvm/kvm_trace.c b/virt/kvm/kvm_trace.c index 58141f3..179e11f 100644 --- a/virt/kvm/kvm_trace.c +++ b/virt/kvm/kvm_trace.c @@ -26,6 +26,8 @@ struct kvm_trace { int trace_state; + u16 cat_mask; + u64 act_bitmap[16]; struct rchan *rchan; struct dentry *lost_file; atomic_t lost_records; @@ -39,6 +41,23 @@ struct kvm_trace_probe { marker_probe_func *probe_func; }; +static inline int check_event_mask(struct kvm_trace *kt, u32 event) +{ + unsigned long category; + int i; + + category = KVM_TRC_CAT(event); + if (!(category & kt->cat_mask)) + return 1; + + i = find_first_bit(&category, KVM_TRC_CAT_NR_BITS); + + if (!test_bit(KVM_TRC_ACT(event), &kt->act_bitmap[i])) + return 1; + + return 0; +} + static inline int calc_rec_size(int cycle, int extra) { int rec_size = KVM_TRC_HEAD_SIZE; @@ -60,6 +79,9 @@ static void kvm_add_trace(void *probe_private, void *call_data, return; rec.event = va_arg(*args, u32); + if (check_event_mask(kt, rec.event)) + return; + vcpu = va_arg(*args, struct kvm_vcpu *); rec.pid = current->tgid; rec.vcpu_id = vcpu->vcpu_id; @@ -175,6 +197,8 @@ static int do_kvm_trace_enable(struct kvm_user_trace_setup *kuts) if (!kt->rchan) goto err; + kt->cat_mask = kuts->cat_mask; + memcpy(kt->act_bitmap, kuts->act_bitmap, sizeof(kuts->act_bitmap)); kvm_trace = kt; for (i = 0; i < ARRAY_SIZE(kvm_trace_probes); i++) { -- 1.5.5
From 5eb5fb6b40c45b1c140f46b00f5de9f73fc0bab6 Mon Sep 17 00:00:00 2001 From: Sheng Yang <[EMAIL PROTECTED]> Date: Wed, 25 Jun 2008 16:37:31 +0800 Subject: [PATCH] KVM: trace: Add event mask support. Allow user space application to specify one or morefilter masks to limit the events being captured via it. Signed-off-by: Feng (Eric) Liu <[EMAIL PROTECTED]> Signed-off-by: Sheng Yang <[EMAIL PROTECTED]> --- include/linux/kvm.h | 7 +++++++ virt/kvm/kvm_trace.c | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-) diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 0ea064c..f1d3d9e 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -18,6 +18,9 @@ struct kvm_user_trace_setup { __u32 buf_size; /* sub_buffer size of each per-cpu */ __u32 buf_nr; /* the number of sub_buffers of each per-cpu */ + __u16 cat_mask; /* the tracing categories are enabled */ + __u16 pad1[3]; + __u64 act_bitmap[16]; /* the actions are enabled for each category */ }; /* for KVM_CREATE_MEMORY_REGION */ @@ -292,6 +295,7 @@ struct kvm_s390_interrupt { }; #define KVM_TRC_SHIFT 16 +#define KVM_TRC_CAT_NR_BITS 12 /* * kvm trace categories */ @@ -305,6 +309,9 @@ struct kvm_s390_interrupt { #define KVM_TRC_VMEXIT (KVM_TRC_ENTRYEXIT + 0x02) #define KVM_TRC_PAGE_FAULT (KVM_TRC_HANDLER + 0x01) +#define KVM_TRC_CAT(evt) (((evt) >> KVM_TRC_SHIFT) & 0x0fff) +#define KVM_TRC_ACT(evt) ((evt) & (~0u >> KVM_TRC_SHIFT)) + #define KVM_TRC_HEAD_SIZE 12 #define KVM_TRC_CYCLE_SIZE 8 #define KVM_TRC_EXTRA_MAX 7 diff --git a/virt/kvm/kvm_trace.c b/virt/kvm/kvm_trace.c index 58141f3..179e11f 100644 --- a/virt/kvm/kvm_trace.c +++ b/virt/kvm/kvm_trace.c @@ -26,6 +26,8 @@ struct kvm_trace { int trace_state; + u16 cat_mask; + u64 act_bitmap[16]; struct rchan *rchan; struct dentry *lost_file; atomic_t lost_records; @@ -39,6 +41,23 @@ struct kvm_trace_probe { marker_probe_func *probe_func; }; +static inline int check_event_mask(struct kvm_trace *kt, u32 event) +{ + unsigned long category; + int i; + + category = KVM_TRC_CAT(event); + if (!(category & kt->cat_mask)) + return 1; + + i = find_first_bit(&category, KVM_TRC_CAT_NR_BITS); + + if (!test_bit(KVM_TRC_ACT(event), &kt->act_bitmap[i])) + return 1; + + return 0; +} + static inline int calc_rec_size(int cycle, int extra) { int rec_size = KVM_TRC_HEAD_SIZE; @@ -60,6 +79,9 @@ static void kvm_add_trace(void *probe_private, void *call_data, return; rec.event = va_arg(*args, u32); + if (check_event_mask(kt, rec.event)) + return; + vcpu = va_arg(*args, struct kvm_vcpu *); rec.pid = current->tgid; rec.vcpu_id = vcpu->vcpu_id; @@ -175,6 +197,8 @@ static int do_kvm_trace_enable(struct kvm_user_trace_setup *kuts) if (!kt->rchan) goto err; + kt->cat_mask = kuts->cat_mask; + memcpy(kt->act_bitmap, kuts->act_bitmap, sizeof(kuts->act_bitmap)); kvm_trace = kt; for (i = 0; i < ARRAY_SIZE(kvm_trace_probes); i++) { -- 1.5.5