From: Rob Gardner <rob.gardner@hp.com>
To: xen-devel <xen-devel@lists.xensource.com>
Subject: [PATCH] Non-polling trace record access
Date: Fri, 31 Mar 2006 10:54:46 -0700 [thread overview]
Message-ID: <442D6CE6.70704@hp.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 3547 bytes --]
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__
[-- Attachment #1.2: Type: text/html, Size: 5901 bytes --]
[-- Attachment #2: non-polling-trace.patch --]
[-- Type: text/plain, Size: 3169 bytes --]
# 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__
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2006-03-31 17:54 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-31 17:54 Rob Gardner [this message]
2006-04-06 9:27 ` [PATCH] Non-polling trace record access Keir Fraser
-- strict thread matches above, loose matches on Subject: below --
2006-04-06 20:44 Rob Gardner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=442D6CE6.70704@hp.com \
--to=rob.gardner@hp.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.