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-changelog

[Xen-changelog] Clean up xenoprof code a bit. The main remaining TODO is

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Clean up xenoprof code a bit. The main remaining TODO is to
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 07 Apr 2006 12:08:07 +0000
Delivery-date: Fri, 07 Apr 2006 05:08:52 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 050ad9813cdbbb2b5ecb7ed5a6240cc428ef723e
# Parent  0037e3e4da08eccefc415e41749606e683916ae1
Clean up xenoprof code a bit. The main remaining TODO is to
clean up the xenoprof hypercall interface.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r 0037e3e4da08 -r 050ad9813cdb 
linux-2.6-xen-sparse/arch/i386/oprofile/Makefile
--- a/linux-2.6-xen-sparse/arch/i386/oprofile/Makefile  Fri Apr  7 08:57:36 2006
+++ b/linux-2.6-xen-sparse/arch/i386/oprofile/Makefile  Fri Apr  7 10:00:28 2006
@@ -6,7 +6,7 @@
                oprofilefs.o oprofile_stats.o  \
                timer_int.o )
 
-ifdef CONFIG_X86_XEN
+ifdef CONFIG_XEN
 oprofile-y                             := $(DRIVER_OBJS) xenoprof.o
 else 
 oprofile-y                             := $(DRIVER_OBJS) init.o backtrace.o
diff -r 0037e3e4da08 -r 050ad9813cdb 
linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile
--- a/linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile        Fri Apr  7 
08:57:36 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/oprofile/Makefile        Fri Apr  7 
10:00:28 2006
@@ -11,7 +11,7 @@
        oprofilefs.o oprofile_stats.o \
        timer_int.o )
 
-ifdef
+ifdef CONFIG_XEN
 OPROFILE-y := xenoprof.o
 else
 OPROFILE-y := init.o backtrace.o
diff -r 0037e3e4da08 -r 050ad9813cdb xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Fri Apr  7 08:57:36 2006
+++ b/xen/arch/x86/domain.c     Fri Apr  7 10:00:28 2006
@@ -915,8 +915,6 @@
     spin_unlock_recursive(&d->page_alloc_lock);
 }
 
-extern void free_xenoprof_pages(struct domain *d);
-
 void domain_relinquish_resources(struct domain *d)
 {
     struct vcpu *v;
diff -r 0037e3e4da08 -r 050ad9813cdb xen/arch/x86/oprofile/nmi_int.c
--- a/xen/arch/x86/oprofile/nmi_int.c   Fri Apr  7 08:57:36 2006
+++ b/xen/arch/x86/oprofile/nmi_int.c   Fri Apr  7 10:00:28 2006
@@ -45,31 +45,23 @@
 
 int nmi_callback(struct cpu_user_regs *regs, int cpu)
 {
-       int xen_mode = 0;
-       int ovf;
+       int xen_mode, ovf;
 
        ovf = model->check_ctrs(cpu, &cpu_msrs[cpu], regs);
        xen_mode = ring_0(regs);
-       if ( ovf )
-       {
-               if ( is_active(current->domain) )
-               {
-                       if ( !xen_mode )
-                       {
-                               send_guest_vcpu_virq(current, VIRQ_XENOPROF);
-                       } 
-               }
-       }
+       if ( ovf && is_active(current->domain) && !xen_mode )
+               send_guest_vcpu_virq(current, VIRQ_XENOPROF);
+
        return 1;
 }
  
  
-static void nmi_cpu_save_registers(struct op_msrs * msrs)
+static void nmi_cpu_save_registers(struct op_msrs *msrs)
 {
        unsigned int const nr_ctrs = model->num_counters;
        unsigned int const nr_ctrls = model->num_controls; 
-       struct op_msr * counters = msrs->counters;
-       struct op_msr * controls = msrs->controls;
+       struct op_msr *counters = msrs->counters;
+       struct op_msr *controls = msrs->controls;
        unsigned int i;
 
        for (i = 0; i < nr_ctrs; ++i) {
diff -r 0037e3e4da08 -r 050ad9813cdb xen/arch/x86/oprofile/xenoprof.c
--- a/xen/arch/x86/oprofile/xenoprof.c  Fri Apr  7 08:57:36 2006
+++ b/xen/arch/x86/oprofile/xenoprof.c  Fri Apr  7 10:00:28 2006
@@ -14,18 +14,18 @@
 
 int active_domains[MAX_OPROF_DOMAINS];
 int active_ready[MAX_OPROF_DOMAINS];
-unsigned int adomains = 0;
-unsigned int activated = 0;
-struct domain *primary_profiler = NULL;
+unsigned int adomains;
+unsigned int activated;
+struct domain *primary_profiler;
 int xenoprof_state = XENOPROF_IDLE;
 
-u64 total_samples = 0;
-u64 invalid_buffer_samples = 0;
-u64 corrupted_buffer_samples = 0;
-u64 lost_samples = 0;
-u64 active_samples = 0;
-u64 idle_samples = 0;
-u64 others_samples = 0;
+u64 total_samples;
+u64 invalid_buffer_samples;
+u64 corrupted_buffer_samples;
+u64 lost_samples;
+u64 active_samples;
+u64 idle_samples;
+u64 others_samples;
 
 
 extern int nmi_init(int *num_events, int *is_primary, char *cpu_type);
@@ -39,16 +39,8 @@
 
 int is_active(struct domain *d)
 {
-    xenoprof_t *x = d->xenoprof;
-    if ( x )
-    {
-        if ( x->domain_type == XENOPROF_DOMAIN_ACTIVE )
-            return 1;
-        else
-            return 0;
-    }
-    else
-        return 0;
+    struct xenoprof *x = d->xenoprof;
+    return ((x != NULL) && (x->domain_type == XENOPROF_DOMAIN_ACTIVE));
 }
 
 int is_profiled(struct domain *d)
@@ -65,25 +57,24 @@
     active_samples = 0;
     idle_samples = 0;
     others_samples = 0;
-
-    return;
 }
 
 static void xenoprof_reset_buf(struct domain *d)
 {
     int j;
-    xenoprof_buf_t *buf;
-
-    if ( !d->xenoprof )
-    {
-        printk("xenoprof_reset_buf: ERROR - Unexpected Xenoprof NULL pointer 
\n");
+    struct xenoprof_buf *buf;
+
+    if ( d->xenoprof == NULL )
+    {
+        printk("xenoprof_reset_buf: ERROR - Unexpected "
+               "Xenoprof NULL pointer \n");
         return;
     }
 
-    for ( j=0; j<MAX_VIRT_CPUS; j++ )
+    for ( j = 0; j < MAX_VIRT_CPUS; j++ )
     {
         buf = d->xenoprof->vcpu[j].buffer;
-        if ( buf )
+        if ( buf != NULL )
         {
             buf->event_head = 0;
             buf->event_tail = 0;
@@ -93,62 +84,57 @@
 
 int active_index(struct domain *d)
 {
-    int i;
-    int id;
-
-    id = d->domain_id;
-    for ( i=0; i<adomains; i++ )
+    int i, id = d->domain_id;
+
+    for ( i = 0; i < adomains; i++ )
         if ( active_domains[i] == id )
-        {
             return i;
-        }
+
     return -1;
 }
 
 int set_active(struct domain *d)
 {
     int ind;
-    xenoprof_t *x;
+    struct xenoprof *x;
 
     ind = active_index(d);
-    if ( ind <0 )
+    if ( ind < 0 )
         return -EPERM;
 
     x = d->xenoprof;
-    if ( x )
-    {
-        x->domain_ready = 1;
-        x->domain_type = XENOPROF_DOMAIN_ACTIVE;
-        active_ready[ind] = 1;
-        activated++;
-        return 0;
-    }
-    else
+    if ( x == NULL )
         return -EPERM;
+
+    x->domain_ready = 1;
+    x->domain_type = XENOPROF_DOMAIN_ACTIVE;
+    active_ready[ind] = 1;
+    activated++;
+
+    return 0;
 }
 
 int reset_active(struct domain *d)
 {
     int ind;
-    xenoprof_t *x;
+    struct xenoprof *x;
 
     ind = active_index(d);
-    if ( ind <0 )
+    if ( ind < 0 )
         return -EPERM;
 
     x = d->xenoprof;
-    if ( x )
-    {
-        x->domain_ready = 0;
-        x->domain_type = XENOPROF_DOMAIN_IGNORED;
-        active_ready[ind] = 0;
-        activated--;
-        if ( activated <= 0 )
-            adomains = 0;
-        return 0;
-    }
-    else
+    if ( x == NULL )
         return -EPERM;
+
+    x->domain_ready = 0;
+    x->domain_type = XENOPROF_DOMAIN_IGNORED;
+    active_ready[ind] = 0;
+    activated--;
+    if ( activated <= 0 )
+        adomains = 0;
+
+    return 0;
 }
 
 int set_active_domains(int num)
@@ -157,13 +143,13 @@
     int i;
     struct domain *d;
 
-    /* reset any existing active domains from previous runs */
-    for ( i=0; i<adomains; i++ )
+    /* Reset any existing active domains from previous runs. */
+    for ( i = 0; i < adomains; i++ )
     {
         if ( active_ready[i] )
         {
             d = find_domain_by_id(active_domains[i]);
-            if ( d )
+            if ( d != NULL )
             {
                 reset_active(d);
                 put_domain(d);
@@ -171,37 +157,33 @@
         }
     }
 
-    adomains=num;
+    adomains = num;
 
     /* Add primary profiler to list of active domains if not there yet */
     primary = active_index(primary_profiler);
     if ( primary == -1 )
     {
-        /* return if there is no space left on list */
+        /* Return if there is no space left on list. */
         if ( num >= MAX_OPROF_DOMAINS )
             return -E2BIG;
-        else
-        {
-            active_domains[num] = primary_profiler->domain_id;
-            num++;
-        }
+        active_domains[num] = primary_profiler->domain_id;
+        num++;
     }
 
     adomains = num;
     activated = 0;
 
-    for ( i=0; i<adomains; i++ )
-    {
+    for ( i = 0; i < adomains; i++ )
         active_ready[i] = 0;
-    }
 
     return 0;
 }
 
-void xenoprof_log_event(struct vcpu *vcpu, unsigned long eip, int mode, int 
event)
-{
-    xenoprof_vcpu_t *v;
-    xenoprof_buf_t *buf;
+void xenoprof_log_event(
+    struct vcpu *vcpu, unsigned long eip, int mode, int event)
+{
+    struct xenoprof_vcpu *v;
+    struct xenoprof_buf *buf;
     int head;
     int tail;
     int size;
@@ -213,14 +195,14 @@
     /* Count samples in idle separate from other unmonitored domains */
     if ( !is_profiled(vcpu->domain) )
     {
-      others_samples++;
-      return;
+        others_samples++;
+        return;
     }
 
     v = &vcpu->domain->xenoprof->vcpu[vcpu->vcpu_id];
 
     /* Sanity check. Should never happen */ 
-    if ( !v->buffer )
+    if ( v->buffer == NULL )
     {
         invalid_buffer_samples++;
         return;
@@ -269,20 +251,19 @@
     int i, order;
 
     /* allocate pages to store sample buffer shared with domain */
-    order = get_order_from_pages(npages);
-    rawbuf =  alloc_xenheap_pages(order);
-    if( rawbuf == NULL )
+    order  = get_order_from_pages(npages);
+    rawbuf = alloc_xenheap_pages(order);
+    if ( rawbuf == NULL )
     {
         printk("alloc_xenoprof_buf(): memory allocation failed\n");
         return 0;
     }
 
     /* Share pages so that kernel can map it */
-    for ( i=0; i<npages; i++ )
-    {
-        share_xen_page_with_guest(virt_to_page(rawbuf + i * PAGE_SIZE), 
-                                 d, XENSHARE_writable);
-    }
+    for ( i = 0; i < npages; i++ )
+        share_xen_page_with_guest(
+            virt_to_page(rawbuf + i * PAGE_SIZE), 
+            d, XENSHARE_writable);
 
     return rawbuf;
 }
@@ -293,9 +274,9 @@
     int nvcpu, npages, bufsize, max_bufsize;
     int i;
 
-    d->xenoprof = xmalloc(xenoprof_t);
-
-    if ( !d->xenoprof )
+    d->xenoprof = xmalloc(struct xenoprof);
+
+    if ( d->xenoprof == NULL )
     {
         printk ("alloc_xenoprof_struct(): memory "
                 "allocation (xmalloc) failed\n");
@@ -305,23 +286,23 @@
     memset(d->xenoprof, 0, sizeof(*d->xenoprof));
 
     nvcpu = 0;
-    for_each_vcpu(d, v)
+    for_each_vcpu ( d, v )
         nvcpu++;
 
     /* reduce buffer size if necessary to limit pages allocated */
-    bufsize = sizeof(xenoprof_buf_t) +
+    bufsize = sizeof(struct xenoprof_buf) +
         (max_samples - 1) * sizeof(struct event_log);
     max_bufsize = (MAX_OPROF_SHARED_PAGES * PAGE_SIZE) / nvcpu;
     if ( bufsize > max_bufsize )
     {
         bufsize = max_bufsize;
-        max_samples = ( (max_bufsize - sizeof(xenoprof_buf_t)) /
+        max_samples = ( (max_bufsize - sizeof(struct xenoprof_buf)) /
                         sizeof(struct event_log) ) + 1;
     }
 
     npages = (nvcpu * bufsize - 1) / PAGE_SIZE + 1;
     d->xenoprof->rawbuf = alloc_xenoprof_buf(d, npages);
-    if ( !d->xenoprof->rawbuf )
+    if ( d->xenoprof->rawbuf == NULL )
     {
         xfree(d->xenoprof);
         d->xenoprof = NULL;
@@ -335,12 +316,12 @@
     d->xenoprof->domain_type = XENOPROF_DOMAIN_IGNORED;
 
     /* Update buffer pointers for active vcpus */
-    i=0;
-    for_each_vcpu(d, v)
+    i = 0;
+    for_each_vcpu ( d, v )
     {
         d->xenoprof->vcpu[v->vcpu_id].event_size = max_samples;
         d->xenoprof->vcpu[v->vcpu_id].buffer =
-            (xenoprof_buf_t *)&d->xenoprof->rawbuf[i * bufsize];
+            (struct xenoprof_buf *)&d->xenoprof->rawbuf[i * bufsize];
         d->xenoprof->vcpu[v->vcpu_id].buffer->event_size = max_samples;
         d->xenoprof->vcpu[v->vcpu_id].buffer->vcpu_id = v->vcpu_id;
 
@@ -355,21 +336,21 @@
 
 void free_xenoprof_pages(struct domain *d)
 {
-    xenoprof_t *x;
+    struct xenoprof *x;
     int order;
 
     x = d->xenoprof;
-
-    if ( x )
-    {
-        if ( x->rawbuf )
-        {
-            order = get_order_from_pages(x->npages);
-            free_xenheap_pages(x->rawbuf, order);
-        }
-        xfree(x);
-        d->xenoprof = NULL;
-    }
+    if ( x == NULL )
+        return;
+
+    if ( x->rawbuf != NULL )
+    {
+        order = get_order_from_pages(x->npages);
+        free_xenheap_pages(x->rawbuf, order);
+    }
+
+    xfree(x);
+    d->xenoprof = NULL;
 }
 
 int xenoprof_init(int max_samples, xenoprof_init_result_t *init_result)
@@ -386,13 +367,13 @@
     if ( ret < 0 )
         goto err;
 
-    /* we allocate xenoprof struct and buffers only at first time 
-       xenoprof_init is called. Memory is then kept until domain is destroyed 
*/
-    if ( !d->xenoprof )
-    {
-        if ( (ret = alloc_xenoprof_struct(d, max_samples)) < 0 )
-            goto err;
-    }
+    /*
+     * We allocate xenoprof struct and buffers only at first time xenoprof_init
+     * is called. Memory is then kept until domain is destroyed.
+     */
+    if ( (d->xenoprof == NULL) &&
+         ((ret = alloc_xenoprof_struct(d, max_samples)) < 0) )
+        goto err;
 
     xenoprof_reset_buf(d);
 
@@ -420,11 +401,11 @@
     return ret;
 }
 
-#define PRIV_OP(op) ( (op == XENOPROF_set_active) \
+#define PRIV_OP(op) ( (op == XENOPROF_set_active)       \
                    || (op == XENOPROF_reserve_counters) \
-                   || (op == XENOPROF_setup_events) \
-                   || (op == XENOPROF_start) \
-                   || (op == XENOPROF_stop) \
+                   || (op == XENOPROF_setup_events)     \
+                   || (op == XENOPROF_start)            \
+                   || (op == XENOPROF_stop)             \
                    || (op == XENOPROF_release_counters) \
                    || (op == XENOPROF_shutdown))
 
@@ -432,7 +413,7 @@
 {
     int ret = 0;
 
-    if ( PRIV_OP(op) && current->domain != primary_profiler )
+    if ( PRIV_OP(op) && (current->domain != primary_profiler) )
     {
         printk("xenoprof: dom %d denied privileged operation %d\n",
                current->domain->domain_id, op);
@@ -468,9 +449,7 @@
         if ( xenoprof_state != XENOPROF_COUNTERS_RESERVED )
             return -EPERM;
         if ( adomains == 0 )
-        {
             set_active_domains(0);
-        }
 
         if ( copy_from_user((void *)&counter_config, (void *)arg1, 
                             arg2 * sizeof(struct op_counter_config)) )
@@ -491,15 +470,12 @@
         break;
 
     case XENOPROF_start:
+        ret = -EPERM;
         if ( (xenoprof_state == XENOPROF_READY) &&
              (activated == adomains) )
-        {
             ret = nmi_start();
-        }
-        else 
-            ret= -EPERM;
-
-        if ( !ret )
+
+        if ( ret == 0 )
             xenoprof_state = XENOPROF_PROFILING;
         break;
 
@@ -518,18 +494,19 @@
         break;
 
     case XENOPROF_release_counters:
+        ret = -EPERM;
         if ( (xenoprof_state == XENOPROF_COUNTERS_RESERVED) ||
              (xenoprof_state == XENOPROF_READY) )
         {
             xenoprof_state = XENOPROF_IDLE;
             nmi_release_counters();
             nmi_disable_virq();
+            ret = 0;
         }
-        else
-            ret = -EPERM;
         break;
 
     case XENOPROF_shutdown:
+        ret = -EPERM;
         if ( xenoprof_state == XENOPROF_IDLE )
         {
             activated = 0;
@@ -537,8 +514,6 @@
             primary_profiler = NULL;
             ret = 0;
         }
-        else 
-            ret = -EPERM;
         break;
 
     default:
diff -r 0037e3e4da08 -r 050ad9813cdb xen/common/event_channel.c
--- a/xen/common/event_channel.c        Fri Apr  7 08:57:36 2006
+++ b/xen/common/event_channel.c        Fri Apr  7 10:00:28 2006
@@ -57,6 +57,7 @@
     {
     case VIRQ_TIMER:
     case VIRQ_DEBUG:
+    case VIRQ_XENOPROF:
         rc = 0;
         break;
     default:
diff -r 0037e3e4da08 -r 050ad9813cdb xen/include/public/xen.h
--- a/xen/include/public/xen.h  Fri Apr  7 08:57:36 2006
+++ b/xen/include/public/xen.h  Fri Apr  7 10:00:28 2006
@@ -78,8 +78,8 @@
 #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_XENOPROF   7  /* XenOprofile interrupt: new sample available */
-#define NR_VIRQS        9
+#define VIRQ_XENOPROF   7  /* V. XenOprofile interrupt: new sample available */
+#define NR_VIRQS        8
 
 /*
  * MMU-UPDATE REQUESTS
diff -r 0037e3e4da08 -r 050ad9813cdb xen/include/public/xenoprof.h
--- a/xen/include/public/xenoprof.h     Fri Apr  7 08:57:36 2006
+++ b/xen/include/public/xenoprof.h     Fri Apr  7 10:00:28 2006
@@ -48,6 +48,7 @@
     uint64_t lost_samples;
     struct event_log event_log[1];
 } xenoprof_buf_t;
+DEFINE_GUEST_HANDLE(xenoprof_buf_t);
 
 typedef struct xenoprof_init_result {
     int32_t  num_events;
@@ -57,7 +58,17 @@
     uint64_t buf_maddr;
     char cpu_type[XENOPROF_CPU_TYPE_SIZE];
 } xenoprof_init_result_t;
+DEFINE_GUEST_HANDLE(xenoprof_init_result_t);
 
+typedef struct xenoprof_counter_config {
+    unsigned long count;
+    unsigned long enabled;
+    unsigned long event;
+    unsigned long kernel;
+    unsigned long user;
+    unsigned long unit_mask;
+} xenoprof_counter_config_t;
+DEFINE_GUEST_HANDLE(xenoprof_counter_config_t);
 
 #endif /* __XEN_PUBLIC_XENOPROF_H__ */
 
diff -r 0037e3e4da08 -r 050ad9813cdb xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Fri Apr  7 08:57:36 2006
+++ b/xen/include/xen/sched.h   Fri Apr  7 10:00:28 2006
@@ -157,8 +157,8 @@
     /* Control-plane tools handle for this domain. */
     xen_domain_handle_t handle;
 
-    /* pointer to xenoprof data (oprofile support) */
-    xenoprof_t *xenoprof;
+    /* OProfile support. */
+    struct xenoprof *xenoprof;
 };
 
 struct domain_setup_info
diff -r 0037e3e4da08 -r 050ad9813cdb xen/include/xen/xenoprof.h
--- a/xen/include/xen/xenoprof.h        Fri Apr  7 08:57:36 2006
+++ b/xen/include/xen/xenoprof.h        Fri Apr  7 10:00:28 2006
@@ -20,13 +20,12 @@
 #define XENOPROF_READY             2
 #define XENOPROF_PROFILING         3
 
+struct xenoprof_vcpu {
+    int event_size;
+    struct xenoprof_buf *buffer;
+};
 
-typedef struct xenoprof_vcpu {
-    int event_size;
-    xenoprof_buf_t *buffer;
-} xenoprof_vcpu_t;
-
-typedef struct xenoprof {
+struct xenoprof {
     char* rawbuf;
     int npages;
     int nbuf;
@@ -34,7 +33,10 @@
     int domain_type;
     int domain_ready;
     int is_primary;
-    xenoprof_vcpu_t vcpu [MAX_VIRT_CPUS];
-} xenoprof_t;
+    struct xenoprof_vcpu vcpu [MAX_VIRT_CPUS];
+};
+
+struct domain;
+void free_xenoprof_pages(struct domain *d);
 
 #endif  /* __XEN__XENOPROF_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Clean up xenoprof code a bit. The main remaining TODO is to, Xen patchbot -unstable <=