WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Non-polling trace record access
From: Rob Gardner <rob.gardner@xxxxxx>
Date: Fri, 31 Mar 2006 10:54:46 -0700
Delivery-date: Fri, 31 Mar 2006 17:57:25 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)
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@xxxxxx
# Node ID 8e3d7bce3b29841a323056defacdb1181c252282
# Parent  f0e14b4e535c7d99c56c286384b0d512c5220884

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

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


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__


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

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

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


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__
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Non-polling trace record access, Rob Gardner <=