KVM: trace: Add event mask support
PATCH 1/2 KVM: trace: Add event mask support
From bb7cc3fd1e549d38d6bda10a06feda9339de9d3e Mon Sep 17 00:00:00 2001
From: Sheng Yang <[email protected]>
Date: Wed, 13 Aug 2008 14:29:43 +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.
--- include/linux/kvm.h | 7 +++++++ virt/kvm/kvm_trace.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-)
include/linux/kvm.h +3 -0
@@ -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
virt/kvm/kvm_trace.c +19 -0
@@ -27,6 +27,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;
@@ -40,6 +42,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 timestamp,int extra) {int rec_size =KVM_TRC_HEAD_SIZE ;
@@ -56,12 +75,15 @@ static void kvm_add_trace(void *probe_private,
void *call_data,
struct kvm_trace_rec rec;
struct kvm_vcpu *vcpu;
int i, size; - u32 extra; + u32 extra, event;
if (unlikely(kt->trace_state != KVM_TRACE_STATE_RUNNING))
return;
- rec.rec_val = TRACE_REC_EVENT_ID(va_arg(*args, u32));
+ event = TRACE_REC_EVENT_ID(va_arg(*args, u32));
+ if (check_event_mask(kt, event))
+ return;
+
vcpu = va_arg(*args, struct kvm_vcpu *);
rec.pid = current->tgid;
rec.vcpu_id = vcpu->vcpu_id;
@@ -70,7 +92,7 @@ static void kvm_add_trace(void *probe_private, void *call_data,
WARN_ON(!(extra <= KVM_TRC_EXTRA_MAX));
extra = min_t(u32, extra, KVM_TRC_EXTRA_MAX);
- rec.rec_val |= TRACE_REC_TCS(p->timestamp_in)
+ rec.rec_val = event | TRACE_REC_TCS(p->timestamp_in)
| TRACE_REC_NUM_DATA_ARGS(extra);
if (p->timestamp_in) {
@@ -177,6 +199,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.6
From bb7cc3fd1e549d38d6bda10a06feda9339de9d3e Mon Sep 17 00:00:00 2001
From: Sheng Yang <[email protected]>
Date: Wed, 13 Aug 2008 14:29:43 +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.
--- include/linux/kvm.h | 7 +++++++ virt/kvm/kvm_trace.c | 30 +++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-)
include/linux/kvm.h +7 -0
@@ -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
virt/kvm/kvm_trace.c +27 -3
@@ -27,6 +27,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;
@@ -40,6 +42,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 timestamp,int extra) {int rec_size =KVM_TRC_HEAD_SIZE ;
@@ -56,12 +75,15 @@ static void kvm_add_trace(void *probe_private, void *call_data,struct kvm_trace_rec rec;struct kvm_vcpu *vcpu;int i, size; -u32 extra; +u32 extra, event;if (unlikely (kt->trace_state !=KVM_TRACE_STATE_RUNNING ))return ; - rec.rec_val =TRACE_REC_EVENT_ID (va_arg (*args, u32)); + event =TRACE_REC_EVENT_ID (va_arg (*args, u32)); +if (check_event_mask (kt, event)) +return ; + vcpu = va_arg(*args, struct kvm_vcpu *); rec.pid = current->tgid; rec.vcpu_id = vcpu->vcpu_id;
@@ -70,7 +92,7 @@ static void kvm_add_trace(void *probe_private, void *call_data,WARN_ON (!(extra <=KVM_TRC_EXTRA_MAX )); extra =min_t (u32, extra,KVM_TRC_EXTRA_MAX ); - rec.rec_val |=TRACE_REC_TCS (p->timestamp_in) + rec.rec_val = event |TRACE_REC_TCS (p->timestamp_in) |TRACE_REC_NUM_DATA_ARGS (extra);if (p->timestamp_in) {
@@ -177,6 +199,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++) {
Signature · 1 line
1.5.6
Quoted 8 lines · Sheng
From
bb7cc3fd1e549d38d6bda10a06feda9339de9d3eMon Sep 17 00:00:00 2001
From: Sheng Yang <[email protected]>
Date: Wed, 13 Aug 2008 14:29:43 +0800
Subject: [PATCH] KVM: trace: Add event mask supportAllow user space application to specify one or morefilter masks to limit the events being captured via it.
Sorry about not responding to this earlier. In light of the ltt-ng discussion, it looks like almost all of kvmtrace can be moved to common code, with only the trace markers themselves remaining.
So I'd like to wait with this until we've made the transition (and afterwards, we'll either have the functionality automatically, or we'll need to make the changes to core code).
Signature · 1 line
error compiling committee.c: too many arguments to function
Quoted 9 lines · On Wednesday 13 August 2008 16:04:59 Avi Kivity wrote:
Quoted 7 lines · Sheng
From
bb7cc3fd1e549d38d6bda10a06feda9339de9d3eMon Sep 17 00:00:00 2001 From: Sheng Yang <[email protected]>
Date: Wed, 13 Aug 2008 14:29:43 +0800
Subject: [PATCH] KVM: trace: Add event mask supportAllow user space application to specify one or morefilter masks to limit the events being captured via it.
Quoted 7 lines
Sorry about not responding to this earlier. In light of the ltt-ng discussion, it looks like almost all of kvmtrace can be moved to common code, with only the trace markers themselves remaining.
So I'd like to wait with this until we've made the transition (and afterwards, we'll either have the functionality automatically, or we'll need to make the changes to core code).
OK, that's fine. Looking forward to it. :)
Signature · 2 lines
regards Yang, Sheng