public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] KVM: trace: Add event mask support
@ 2008-08-13  7:54 Yang, Sheng
  2008-08-13  8:04 ` Avi Kivity
  0 siblings, 1 reply; 3+ messages in thread
From: Yang, Sheng @ 2008-08-13  7:54 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm

[-- Attachment #1: Type: text/plain, Size: 3763 bytes --]

From bb7cc3fd1e549d38d6bda10a06feda9339de9d3e Mon Sep 17 00:00:00 2001
From: Sheng Yang <sheng.yang@intel.com>
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.

Signed-off-by: Feng (Eric) Liu <eric.e.liu@intel.com>
Signed-off-by: Sheng Yang <sheng.yang@intel.com>
---
 include/linux/kvm.h  |    7 +++++++
 virt/kvm/kvm_trace.c |   30 +++++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index d9ef7d3..05713f2 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 41dcc84..bb4046c 100644
--- a/virt/kvm/kvm_trace.c
+++ b/virt/kvm/kvm_trace.c
@@ -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


[-- Attachment #2: 0001-KVM-trace-Add-event-mask-support.patch --]
[-- Type: text/x-diff, Size: 3767 bytes --]

From bb7cc3fd1e549d38d6bda10a06feda9339de9d3e Mon Sep 17 00:00:00 2001
From: Sheng Yang <sheng.yang@intel.com>
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.

Signed-off-by: Feng (Eric) Liu <eric.e.liu@intel.com>
Signed-off-by: Sheng Yang <sheng.yang@intel.com>
---
 include/linux/kvm.h  |    7 +++++++
 virt/kvm/kvm_trace.c |   30 +++++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index d9ef7d3..05713f2 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 41dcc84..bb4046c 100644
--- a/virt/kvm/kvm_trace.c
+++ b/virt/kvm/kvm_trace.c
@@ -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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-08-13  8:10 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-13  7:54 [PATCH 1/2] KVM: trace: Add event mask support Yang, Sheng
2008-08-13  8:04 ` Avi Kivity
2008-08-13  8:13   ` Yang, Sheng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox