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] [xen-unstable] Enable compatibility mode operation for H

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Enable compatibility mode operation for HYPERVISOR_xenoprof_op.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 05 Jan 2007 12:55:31 -0800
Delivery-date: Fri, 05 Jan 2007 14:02:21 -0800
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 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Enable compatibility mode operation for HYPERVISOR_xenoprof_op., Xen patchbot-unstable <=