From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Gardner Subject: [PATCH] Non-polling trace record access Date: Fri, 31 Mar 2006 10:54:46 -0700 Message-ID: <442D6CE6.70704@hp.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090405090706060606050101" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------090405090706060606050101 Content-Type: multipart/alternative; boundary="------------070304080306020803060505" --------------070304080306020803060505 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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. Rob Gardner # HG changeset patch # User rob.gardner@hp.com # Node ID 8e3d7bce3b29841a323056defacdb1181c252282 # Parent f0e14b4e535c7d99c56c286384b0d512c5220884 Added trace buffer virtual irq to implement non-polling trace record access Signed-off-by: Rob Gardner diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/common/trace.c --- a/xen/common/trace.c Thu Mar 30 13:37:22 2006 +++ b/xen/common/trace.c Fri Mar 31 17:33:04 2006 @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,6 +42,10 @@ 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 +55,13 @@ /* which tracing events are enabled */ static u32 tb_event_mask = TRC_ALL; + + +static void trace_notify_guest(void) +{ + send_guest_virq(dom0->vcpu[0], VIRQ_TBUF); +} + /** * alloc_trace_bufs - performs initialization of the per-cpu trace buffers. @@ -93,6 +106,8 @@ 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; } @@ -228,6 +243,7 @@ struct t_buf *buf; struct t_rec *rec; unsigned long flags; + static uint32_t last_virq_sent = 0; BUG_ON(!tb_init_done); @@ -272,6 +288,18 @@ buf->prod++; local_irq_restore(flags); + + /* + * Notify trace buffer consumer that we've reached the high water + * point. We don't want to repeatedly send virq's, so remember + * when we sent the last one. + * + */ + if ( ((buf->prod - buf->cons) >= t_buf_highwater) + && (buf->cons > last_virq_sent)) { + last_virq_sent = buf->cons; + raise_softirq(TRACE_SOFTIRQ); + } } /* diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/public/xen.h --- a/xen/include/public/xen.h Thu Mar 30 13:37:22 2006 +++ b/xen/include/public/xen.h Fri Mar 31 17:33:04 2006 @@ -71,6 +71,7 @@ #define VIRQ_CONSOLE 2 /* (DOM0) Bytes received on emergency console. */ #define VIRQ_DOM_EXC 3 /* (DOM0) Exceptional event for some domain. */ #define VIRQ_DEBUGGER 6 /* (DOM0) A domain has paused for debugging. */ +#define VIRQ_TBUF 7 /* (DOM0) Trace buffer has records available */ #define NR_VIRQS 8 /* diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/xen/softirq.h --- a/xen/include/xen/softirq.h Thu Mar 30 13:37:22 2006 +++ b/xen/include/xen/softirq.h Fri Mar 31 17:33:04 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__ --------------070304080306020803060505 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
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.

Rob Gardner

# HG changeset patch
# User rob.gardner@hp.com
# Node ID 8e3d7bce3b29841a323056defacdb1181c252282
# Parent  f0e14b4e535c7d99c56c286384b0d512c5220884

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

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


diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/common/trace.c
--- a/xen/common/trace.c    Thu Mar 30 13:37:22 2006
+++ b/xen/common/trace.c    Fri Mar 31 17:33:04 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,10 @@
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 +55,13 @@

/* which tracing events are enabled */
static u32 tb_event_mask = TRC_ALL;
+
+
+static void trace_notify_guest(void)
+{
+    send_guest_virq(dom0->vcpu[0], VIRQ_TBUF);
+}
+

/**
 * alloc_trace_bufs - performs initialization of the per-cpu trace buffers.
@@ -93,6 +106,8 @@
        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;
}

@@ -228,6 +243,7 @@
    struct t_buf *buf;
    struct t_rec *rec;
    unsigned long flags;
+    static uint32_t last_virq_sent = 0;

    BUG_ON(!tb_init_done);

@@ -272,6 +288,18 @@
    buf->prod++;

    local_irq_restore(flags);
+
+    /*
+     * Notify trace buffer consumer that we've reached the high water
+     * point. We don't want to repeatedly send virq's, so remember
+     * when we sent the last one.
+     *
+     */
+    if ( ((buf->prod - buf->cons) >= t_buf_highwater)
+         && (buf->cons > last_virq_sent)) {
+          last_virq_sent = buf->cons;
+          raise_softirq(TRACE_SOFTIRQ);
+    }
}

/*
diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/public/xen.h
--- a/xen/include/public/xen.h    Thu Mar 30 13:37:22 2006
+++ b/xen/include/public/xen.h    Fri Mar 31 17:33:04 2006
@@ -71,6 +71,7 @@
#define VIRQ_CONSOLE    2  /* (DOM0) Bytes received on emergency console. */
#define VIRQ_DOM_EXC    3  /* (DOM0) Exceptional event for some domain.   */
#define VIRQ_DEBUGGER   6  /* (DOM0) A domain has paused for debugging.   */
+#define VIRQ_TBUF       7  /* (DOM0) Trace buffer has records available   */
#define NR_VIRQS        8

/*
diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/xen/softirq.h
--- a/xen/include/xen/softirq.h    Thu Mar 30 13:37:22 2006
+++ b/xen/include/xen/softirq.h    Fri Mar 31 17:33:04 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__


--------------070304080306020803060505-- --------------090405090706060606050101 Content-Type: text/plain; name="non-polling-trace.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="non-polling-trace.patch" # HG changeset patch # User rob.gardner@hp.com # Node ID 8e3d7bce3b29841a323056defacdb1181c252282 # Parent f0e14b4e535c7d99c56c286384b0d512c5220884 Added trace buffer virtual irq to implement non-polling trace record access Signed-off-by: Rob Gardner diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/common/trace.c --- a/xen/common/trace.c Thu Mar 30 13:37:22 2006 +++ b/xen/common/trace.c Fri Mar 31 17:33:04 2006 @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,6 +42,10 @@ 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 +55,13 @@ /* which tracing events are enabled */ static u32 tb_event_mask = TRC_ALL; + + +static void trace_notify_guest(void) +{ + send_guest_virq(dom0->vcpu[0], VIRQ_TBUF); +} + /** * alloc_trace_bufs - performs initialization of the per-cpu trace buffers. @@ -93,6 +106,8 @@ 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; } @@ -228,6 +243,7 @@ struct t_buf *buf; struct t_rec *rec; unsigned long flags; + static uint32_t last_virq_sent = 0; BUG_ON(!tb_init_done); @@ -272,6 +288,18 @@ buf->prod++; local_irq_restore(flags); + + /* + * Notify trace buffer consumer that we've reached the high water + * point. We don't want to repeatedly send virq's, so remember + * when we sent the last one. + * + */ + if ( ((buf->prod - buf->cons) >= t_buf_highwater) + && (buf->cons > last_virq_sent)) { + last_virq_sent = buf->cons; + raise_softirq(TRACE_SOFTIRQ); + } } /* diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/public/xen.h --- a/xen/include/public/xen.h Thu Mar 30 13:37:22 2006 +++ b/xen/include/public/xen.h Fri Mar 31 17:33:04 2006 @@ -71,6 +71,7 @@ #define VIRQ_CONSOLE 2 /* (DOM0) Bytes received on emergency console. */ #define VIRQ_DOM_EXC 3 /* (DOM0) Exceptional event for some domain. */ #define VIRQ_DEBUGGER 6 /* (DOM0) A domain has paused for debugging. */ +#define VIRQ_TBUF 7 /* (DOM0) Trace buffer has records available */ #define NR_VIRQS 8 /* diff -r f0e14b4e535c -r 8e3d7bce3b29 xen/include/xen/softirq.h --- a/xen/include/xen/softirq.h Thu Mar 30 13:37:22 2006 +++ b/xen/include/xen/softirq.h Fri Mar 31 17:33:04 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__ --------------090405090706060606050101 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------090405090706060606050101--