[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Non-polling trace record access


  • To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Rob Gardner <rob.gardner@xxxxxx>
  • Date: Thu, 06 Apr 2006 14:44:53 -0600
  • Delivery-date: Thu, 06 Apr 2006 13:45:15 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

This is the kernel side code to implement a virtual irq that gets sent when the xen trace buffers become half-full. This allows userland tools such as xentrace and xenmon to avoid polling for new trace records. A future patch will include support for this in XenMon, along with various other enhancements and bug fixes.

This patch has been tested on x86, x86-64, and x86 SMP machines.

Keir: The code has been re-synced with current tip, and your suggested changes made.

Rob Gardner

# HG changeset patch
# User rob.gardner@xxxxxx
# Node ID a2f24cf7585929ade7d846049bfc0544298bf8d0
# Parent  67de34c062b5897d1e82995b171be081f976558e

Added trace buffer virtual irq to implement non-polling trace record access

Signed-off-by: Rob Gardner <rob.gardner@xxxxxx>

diff -r 67de34c062b5 -r a2f24cf75859 xen/common/trace.c
--- a/xen/common/trace.c    Thu Apr  6 11:03:53 2006
+++ b/xen/common/trace.c    Thu Apr  6 20:38:58 2006
@@ -27,6 +27,8 @@
#include <xen/smp.h>
#include <xen/trace.h>
#include <xen/errno.h>
+#include <xen/event.h>
+#include <xen/softirq.h>
#include <xen/init.h>
#include <asm/atomic.h>
#include <public/dom0_ops.h>
@@ -40,6 +42,11 @@
static struct t_rec *t_recs[NR_CPUS];
static int nr_recs;

+/* High water mark for trace buffers; */
+/* Send virtual interrupt when buffer level reaches this point */
+static int t_buf_highwater;
+
+
/* a flag recording whether initialization has been done */
/* or more properly, if the tbuf subsystem is enabled right now */
int tb_init_done;
@@ -49,6 +56,12 @@

/* which tracing events are enabled */
static u32 tb_event_mask = TRC_ALL;
+
+static void trace_notify_guest(void)
+{
+    send_guest_global_virq(dom0, VIRQ_TBUF);
+}
+

/**
 * alloc_trace_bufs - performs initialization of the per-cpu trace buffers.
@@ -92,6 +105,9 @@
        buf->cons = buf->prod = 0;
        t_recs[i] = (struct t_rec *)(buf + 1);
    }
+
+    t_buf_highwater = nr_recs >> 1; /* 50% high water */
+    open_softirq(TRACE_SOFTIRQ, trace_notify_guest);

    return 0;
}
@@ -272,6 +288,13 @@
    buf->prod++;

    local_irq_restore(flags);
+
+    /*
+     * Notify trace buffer consumer that we've reached the high water mark.
+     *
+     */
+    if ( (buf->prod - buf->cons) == t_buf_highwater )
+        raise_softirq(TRACE_SOFTIRQ);
}

/*
diff -r 67de34c062b5 -r a2f24cf75859 xen/include/public/xen.h
--- a/xen/include/public/xen.h    Thu Apr  6 11:03:53 2006
+++ b/xen/include/public/xen.h    Thu Apr  6 20:38:58 2006
@@ -77,6 +77,7 @@
#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */ #define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */ #define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */ +#define VIRQ_TBUF 7 /* G. (DOM0) Trace buffer has records available */
#define NR_VIRQS        8

/*
diff -r 67de34c062b5 -r a2f24cf75859 xen/include/xen/softirq.h
--- a/xen/include/xen/softirq.h    Thu Apr  6 11:03:53 2006
+++ b/xen/include/xen/softirq.h    Thu Apr  6 20:38:58 2006
@@ -9,7 +9,8 @@
#define NMI_SOFTIRQ                       4
#define PAGE_SCRUB_SOFTIRQ                5
#define DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ  6
-#define NR_SOFTIRQS                       7
+#define TRACE_SOFTIRQ                     7
+#define NR_SOFTIRQS                       8

#ifndef __ASSEMBLY__


# HG changeset patch
# User rob.gardner@xxxxxx
# Node ID a2f24cf7585929ade7d846049bfc0544298bf8d0
# Parent  67de34c062b5897d1e82995b171be081f976558e

Added trace buffer virtual irq to implement non-polling trace record access

Signed-off-by: Rob Gardner <rob.gardner@xxxxxx>

diff -r 67de34c062b5 -r a2f24cf75859 xen/common/trace.c
--- a/xen/common/trace.c        Thu Apr  6 11:03:53 2006
+++ b/xen/common/trace.c        Thu Apr  6 20:38:58 2006
@@ -27,6 +27,8 @@
 #include <xen/smp.h>
 #include <xen/trace.h>
 #include <xen/errno.h>
+#include <xen/event.h>
+#include <xen/softirq.h>
 #include <xen/init.h>
 #include <asm/atomic.h>
 #include <public/dom0_ops.h>
@@ -40,6 +42,11 @@
 static struct t_rec *t_recs[NR_CPUS];
 static int nr_recs;
 
+/* High water mark for trace buffers; */
+/* Send virtual interrupt when buffer level reaches this point */
+static int t_buf_highwater;
+
+
 /* a flag recording whether initialization has been done */
 /* or more properly, if the tbuf subsystem is enabled right now */
 int tb_init_done;
@@ -49,6 +56,12 @@
 
 /* which tracing events are enabled */
 static u32 tb_event_mask = TRC_ALL;
+
+static void trace_notify_guest(void)
+{
+    send_guest_global_virq(dom0, VIRQ_TBUF);
+}
+
 
 /**
  * alloc_trace_bufs - performs initialization of the per-cpu trace buffers.
@@ -92,6 +105,9 @@
         buf->cons = buf->prod = 0;
         t_recs[i] = (struct t_rec *)(buf + 1);
     }
+
+    t_buf_highwater = nr_recs >> 1; /* 50% high water */
+    open_softirq(TRACE_SOFTIRQ, trace_notify_guest);
 
     return 0;
 }
@@ -272,6 +288,13 @@
     buf->prod++;
 
     local_irq_restore(flags);
+
+    /*
+     * Notify trace buffer consumer that we've reached the high water mark.
+     *
+     */
+    if ( (buf->prod - buf->cons) == t_buf_highwater )
+        raise_softirq(TRACE_SOFTIRQ);
 }
 
 /*
diff -r 67de34c062b5 -r a2f24cf75859 xen/include/public/xen.h
--- a/xen/include/public/xen.h  Thu Apr  6 11:03:53 2006
+++ b/xen/include/public/xen.h  Thu Apr  6 20:38:58 2006
@@ -77,6 +77,7 @@
 #define VIRQ_CONSOLE    2  /* G. (DOM0) Bytes received on emergency console. */
 #define VIRQ_DOM_EXC    3  /* G. (DOM0) Exceptional event for some domain.   */
 #define VIRQ_DEBUGGER   6  /* G. (DOM0) A domain has paused for debugging.   */
+#define VIRQ_TBUF       7  /* G. (DOM0) Trace buffer has records available   */
 #define NR_VIRQS        8
 
 /*
diff -r 67de34c062b5 -r a2f24cf75859 xen/include/xen/softirq.h
--- a/xen/include/xen/softirq.h Thu Apr  6 11:03:53 2006
+++ b/xen/include/xen/softirq.h Thu Apr  6 20:38:58 2006
@@ -9,7 +9,8 @@
 #define NMI_SOFTIRQ                       4
 #define PAGE_SCRUB_SOFTIRQ                5
 #define DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ  6
-#define NR_SOFTIRQS                       7
+#define TRACE_SOFTIRQ                     7
+#define NR_SOFTIRQS                       8
 
 #ifndef __ASSEMBLY__
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.