>From a1b062cfd4d1a91c447b680ac9a2250fe55119ec Mon Sep 17 00:00:00 2001
From: Feng (Eric) Liu <[EMAIL PROTECTED]>
Date: Wed, 16 Apr 2008 05:29:37 -0400
Subject: [PATCH] KVM: trace: Add event mask support.

Allow user space application to specify one or more
filter masks to limit the events being captured via it.

Signed-off-by: Feng (Eric) Liu <[EMAIL PROTECTED]>
---
 include/linux/kvm.h  |    6 ++++++
 virt/kvm/kvm_trace.c |   24 ++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index c5675e8..12ec084 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -18,6 +18,8 @@
 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 */
+       __u64 act_bitmap[16]; /* the actions are enabled for each
category */
 };
 
 /* for KVM_CREATE_MEMORY_REGION */
@@ -261,6 +263,7 @@ struct kvm_s390_interrupt {
 };
 
 #define KVM_TRC_SHIFT           16
+#define KVM_TRC_CAT_NR_BITS     12
 /*
  * kvm trace categories
  */
@@ -274,6 +277,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 5425440..dfa4162 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;
@@ -169,6 +191,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++) {

--Eric (Liu, Feng)

Attachment: 0001-KVM-trace-Add-event-mask-support.patch
Description: 0001-KVM-trace-Add-event-mask-support.patch

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to