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

[Xen-changelog] [xen-unstable] Enable compatibility mode operation for HYPERVISOR_xenoprof_op.



# HG changeset patch
# User Emmanuel Ackaouy <ack@xxxxxxxxxxxxx>
# Date 1168018477 0
# Node ID 62f3df867d0e48827cfdb4191530015fbebbe096
# Parent  56cd6d6691513a9c4eb40b7c571348e7be3e9865
Enable compatibility mode operation for HYPERVISOR_xenoprof_op.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
 xen/arch/x86/x86_64/compat/entry.S |    1 
 xen/common/Makefile                |    1 
 xen/common/compat/xenoprof.c       |   40 +++++++++++++++++++++
 xen/common/xenoprof.c              |   70 +++++++++++++++++++++++--------------
 xen/include/public/xenoprof.h      |    2 +
 xen/include/xen/xenoprof.h         |   26 +++++++++++++
 xen/include/xlat.lst               |    2 +
 7 files changed, 114 insertions(+), 28 deletions(-)

diff -r 56cd6d669151 -r 62f3df867d0e xen/arch/x86/x86_64/compat/entry.S
--- a/xen/arch/x86/x86_64/compat/entry.S        Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/arch/x86/x86_64/compat/entry.S        Fri Jan 05 17:34:37 2007 +0000
@@ -278,7 +278,6 @@ CFIX14:
 
 .section .rodata, "a", @progbits
 
-#define compat_xenoprof_op domain_crash_synchronous
 #define compat_sysctl domain_crash_synchronous
 #define compat_domctl domain_crash_synchronous
 
diff -r 56cd6d669151 -r 62f3df867d0e xen/common/Makefile
--- a/xen/common/Makefile       Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/common/Makefile       Fri Jan 05 17:34:37 2007 +0000
@@ -45,4 +45,5 @@ acm_ops.o: compat/acm_ops.c
 acm_ops.o: compat/acm_ops.c
 grant_table.o: compat/grant_table.c
 schedule.o: compat/schedule.c
+xenoprof.o: compat/xenoprof.c
 endif
diff -r 56cd6d669151 -r 62f3df867d0e xen/common/compat/xenoprof.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/common/compat/xenoprof.c      Fri Jan 05 17:34:37 2007 +0000
@@ -0,0 +1,40 @@
+/*
+ * compat/xenoprof.c
+ */
+
+#include <compat/xenoprof.h>
+
+#define COMPAT
+
+#define do_xenoprof_op compat_xenoprof_op
+
+#define xen_oprof_init xenoprof_init
+CHECK_oprof_init;
+#undef xen_oprof_init
+
+#define xenoprof_get_buffer compat_oprof_get_buffer
+#define xenoprof_op_get_buffer compat_oprof_op_get_buffer
+
+#define xen_domid_t domid_t
+#define compat_domid_t domid_compat_t
+CHECK_TYPE(domid);
+#undef compat_domid_t
+#undef xen_domid_t
+
+#define xen_oprof_passive xenoprof_passive
+CHECK_oprof_passive;
+#undef xen_oprof_passive
+
+#define xenoprof_counter compat_oprof_counter
+
+#include "../xenoprof.c"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 56cd6d669151 -r 62f3df867d0e xen/common/xenoprof.c
--- a/xen/common/xenoprof.c     Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/common/xenoprof.c     Fri Jan 05 17:34:37 2007 +0000
@@ -9,6 +9,7 @@
  *                    VA Linux Systems Japan K.K.
  */
 
+#ifndef COMPAT
 #include <xen/guest_access.h>
 #include <xen/sched.h>
 #include <public/xenoprof.h>
@@ -72,7 +73,7 @@ static void xenoprof_reset_buf(struct do
 static void xenoprof_reset_buf(struct domain *d)
 {
     int j;
-    struct xenoprof_buf *buf;
+    xenoprof_buf_t *buf;
 
     if ( d->xenoprof == NULL )
     {
@@ -86,8 +87,8 @@ static void xenoprof_reset_buf(struct do
         buf = d->xenoprof->vcpu[j].buffer;
         if ( buf != NULL )
         {
-            buf->event_head = 0;
-            buf->event_tail = 0;
+            xenoprof_buf(d, buf, event_head) = 0;
+            xenoprof_buf(d, buf, event_tail) = 0;
         }
     }
 }
@@ -166,15 +167,24 @@ static int alloc_xenoprof_struct(
     for_each_vcpu ( d, v )
         nvcpu++;
 
+    bufsize = sizeof(struct xenoprof_buf);
+    i = sizeof(struct event_log);
+#ifdef CONFIG_COMPAT
+    d->xenoprof->is_compat = IS_COMPAT(is_passive ? dom0 : d);
+    if ( XENOPROF_COMPAT(d->xenoprof) )
+    {
+        bufsize = sizeof(struct compat_oprof_buf);
+        i = sizeof(struct compat_event_log);
+    }
+#endif
+
     /* reduce max_samples if necessary to limit pages allocated */
     max_bufsize = (MAX_OPROF_SHARED_PAGES * PAGE_SIZE) / nvcpu;
-    max_max_samples = ( (max_bufsize - sizeof(struct xenoprof_buf)) /
-                        sizeof(struct event_log) ) + 1;
+    max_max_samples = ( (max_bufsize - bufsize) / i ) + 1;
     if ( (unsigned)max_samples > max_max_samples )
         max_samples = max_max_samples;
 
-    bufsize = sizeof(struct xenoprof_buf) +
-        (max_samples - 1) * sizeof(struct event_log);
+    bufsize += (max_samples - 1) * i;
     npages = (nvcpu * bufsize - 1) / PAGE_SIZE + 1;
 
     d->xenoprof->rawbuf = alloc_xenheap_pages(get_order_from_pages(npages));
@@ -195,11 +205,12 @@ static int alloc_xenoprof_struct(
     i = 0;
     for_each_vcpu ( d, v )
     {
+        xenoprof_buf_t *buf = (xenoprof_buf_t *)&d->xenoprof->rawbuf[i * 
bufsize];
+
         d->xenoprof->vcpu[v->vcpu_id].event_size = max_samples;
-        d->xenoprof->vcpu[v->vcpu_id].buffer =
-            (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;
+        d->xenoprof->vcpu[v->vcpu_id].buffer = buf;
+        xenoprof_buf(d, buf, event_size) = max_samples;
+        xenoprof_buf(d, buf, vcpu_id) = v->vcpu_id;
 
         i++;
         /* in the unlikely case that the number of active vcpus changes */
@@ -406,8 +417,9 @@ void xenoprof_log_event(
 void xenoprof_log_event(
     struct vcpu *vcpu, unsigned long eip, int mode, int event)
 {
+    struct domain *d = vcpu->domain;
     struct xenoprof_vcpu *v;
-    struct xenoprof_buf *buf;
+    xenoprof_buf_t *buf;
     int head;
     int tail;
     int size;
@@ -417,13 +429,13 @@ void xenoprof_log_event(
 
     /* ignore samples of un-monitored domains */
     /* Count samples in idle separate from other unmonitored domains */
-    if ( !is_profiled(vcpu->domain) )
+    if ( !is_profiled(d) )
     {
         others_samples++;
         return;
     }
 
-    v = &vcpu->domain->xenoprof->vcpu[vcpu->vcpu_id];
+    v = &d->xenoprof->vcpu[vcpu->vcpu_id];
 
     /* Sanity check. Should never happen */ 
     if ( v->buffer == NULL )
@@ -432,10 +444,10 @@ void xenoprof_log_event(
         return;
     }
 
-    buf = vcpu->domain->xenoprof->vcpu[vcpu->vcpu_id].buffer;
-
-    head = buf->event_head;
-    tail = buf->event_tail;
+    buf = v->buffer;
+
+    head = xenoprof_buf(d, buf, event_head);
+    tail = xenoprof_buf(d, buf, event_tail);
     size = v->event_size;
 
     /* make sure indexes in shared buffer are sane */
@@ -447,28 +459,28 @@ void xenoprof_log_event(
 
     if ( (head == tail - 1) || (head == size - 1 && tail == 0) )
     {
-        buf->lost_samples++;
+        xenoprof_buf(d, buf, lost_samples)++;
         lost_samples++;
     }
     else
     {
-        buf->event_log[head].eip = eip;
-        buf->event_log[head].mode = mode;
-        buf->event_log[head].event = event;
+        xenoprof_buf(d, buf, event_log[head].eip) = eip;
+        xenoprof_buf(d, buf, event_log[head].mode) = mode;
+        xenoprof_buf(d, buf, event_log[head].event) = event;
         head++;
         if ( head >= size )
             head = 0;
-        buf->event_head = head;
+        xenoprof_buf(d, buf, event_head) = head;
         if ( is_active(vcpu->domain) )
             active_samples++;
         else
             passive_samples++;
         if ( mode == 0 )
-            buf->user_samples++;
+            xenoprof_buf(d, buf, user_samples)++;
         else if ( mode == 1 )
-            buf->kernel_samples++;
+            xenoprof_buf(d, buf, kernel_samples)++;
         else
-            buf->xen_samples++;
+            xenoprof_buf(d, buf, xen_samples)++;
     }
 }
 
@@ -493,6 +505,8 @@ static int xenoprof_op_init(XEN_GUEST_HA
 
     return 0;
 }
+
+#endif /* !COMPAT */
 
 static int xenoprof_op_get_buffer(XEN_GUEST_HANDLE(void) arg)
 {
@@ -732,6 +746,10 @@ int do_xenoprof_op(int op, XEN_GUEST_HAN
     return ret;
 }
 
+#if defined(CONFIG_COMPAT) && !defined(COMPAT)
+#include "compat/xenoprof.c"
+#endif
+
 /*
  * Local variables:
  * mode: C
diff -r 56cd6d669151 -r 62f3df867d0e xen/include/public/xenoprof.h
--- a/xen/include/public/xenoprof.h     Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/include/public/xenoprof.h     Fri Jan 05 17:34:37 2007 +0000
@@ -74,8 +74,10 @@ struct xenoprof_buf {
     uint64_t lost_samples;
     struct event_log event_log[1];
 };
+#ifndef __XEN__
 typedef struct xenoprof_buf xenoprof_buf_t;
 DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t);
+#endif
 
 struct xenoprof_init {
     int32_t  num_events;
diff -r 56cd6d669151 -r 62f3df867d0e xen/include/xen/xenoprof.h
--- a/xen/include/xen/xenoprof.h        Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/include/xen/xenoprof.h        Fri Jan 05 17:34:37 2007 +0000
@@ -10,6 +10,7 @@
 #ifndef __XEN_XENOPROF_H__
 #define __XEN_XENOPROF_H__
 
+#include <xen/config.h>
 #include <public/xenoprof.h>
 #include <asm/xenoprof.h>
 
@@ -22,9 +23,19 @@
 #define XENOPROF_READY             2
 #define XENOPROF_PROFILING         3
 
+#ifndef CONFIG_COMPAT
+typedef struct xenoprof_buf xenoprof_buf_t;
+#else
+#include <compat/xenoprof.h>
+typedef union {
+       struct xenoprof_buf native;
+       struct compat_oprof_buf compat;
+} xenoprof_buf_t;
+#endif
+
 struct xenoprof_vcpu {
     int event_size;
-    struct xenoprof_buf *buffer;
+    xenoprof_buf_t *buffer;
 };
 
 struct xenoprof {
@@ -35,8 +46,21 @@ struct xenoprof {
     int domain_type;
     int domain_ready;
     int is_primary;
+#ifdef CONFIG_COMPAT
+    int is_compat;
+#endif
     struct xenoprof_vcpu vcpu [MAX_VIRT_CPUS];
 };
+
+#ifndef CONFIG_COMPAT
+#define XENOPROF_COMPAT(x) 0
+#define xenoprof_buf(d, b, field) ((b)->field)
+#else
+#define XENOPROF_COMPAT(x) ((x)->is_compat)
+#define xenoprof_buf(d, b, field) (*(!(d)->xenoprof->is_compat ? \
+                                       &(b)->native.field : \
+                                       &(b)->compat.field))
+#endif
 
 struct domain;
 void free_xenoprof_pages(struct domain *d);
diff -r 56cd6d669151 -r 62f3df867d0e xen/include/xlat.lst
--- a/xen/include/xlat.lst      Fri Jan 05 17:34:37 2007 +0000
+++ b/xen/include/xlat.lst      Fri Jan 05 17:34:37 2007 +0000
@@ -38,3 +38,5 @@
 ?      sched_remote_shutdown           sched.h
 ?      sched_shutdown                  sched.h
 !      vcpu_runstate_info              vcpu.h
+?      xenoprof_init                   xenoprof.h
+?      xenoprof_passive                xenoprof.h

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


 


Rackspace

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