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] Re: Fix xentrace to initialise the trace buffers if

To: Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Re: Fix xentrace to initialise the trace buffers if they are not set up.
From: John Levon <levon@xxxxxxxxxxxxxxxxx>
Date: Tue, 16 May 2006 01:04:52 +0100
Cc: sakaia@xxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Mon, 15 May 2006 17:05:17 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <a0b30de7a1b8c90504975478e0164d05@xxxxxxxxxxxx>
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>
References: <E1FfNdJ-0005Qn-Hd@xxxxxxxxxxxxxxxxxxxxx> <20060515161915.GB11792@xxxxxxxxxxxxxxxxxxxx> <a0b30de7a1b8c90504975478e0164d05@xxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.9i
On Mon, May 15, 2006 at 05:30:37PM +0100, Keir Fraser wrote:

> I think there is some infrastructure common to both xentrace and xenmon 
> that needs moving into xc_tbuf.c. That will remove duplicated code and 

Here's a patch that does that. BTW, there seems to be little point to
'setsize' and 'tbctl'. They have to be invoked in a particular order. We
could cut even more code here if we got rid of them. Is there a reason
they exist?

Next on the list is xsd_kva and its friends, followed by adding a proper
evtchn interface instead of explicit ioctl()s.

thanks,
john

PS next person to misuse xc_private.h gets a rap on the knuckles from me
   now.

# HG changeset patch
# User john.levon@xxxxxxx
# Node ID 627b79e3f0223d703f2e56857069227f93a6702a
# Parent  dc213d745642690b4bbc34af951e57f0d04c2d04
Use common code for enabling tracing via xenmon and xentrace, also fixing
the last two remaining xc_private.h users outside of libxc.

Signed-off-by: John Levon <john.levon@xxxxxxx>

diff -r dc213d745642 -r 627b79e3f022 tools/libxc/xc_tbuf.c
--- a/tools/libxc/xc_tbuf.c     Mon May 15 16:32:09 2006 +0100
+++ b/tools/libxc/xc_tbuf.c     Mon May 15 08:16:01 2006 -0700
@@ -16,7 +16,7 @@
 
 #include "xc_private.h"
 
-int xc_tbuf_enable(int xc_handle, int enable)
+static int tbuf_enable(int xc_handle, int enable)
 {
   DECLARE_DOM0_OP;
 
@@ -30,7 +30,7 @@ int xc_tbuf_enable(int xc_handle, int en
   return xc_dom0_op(xc_handle, &op);
 }
 
-int xc_tbuf_set_size(int xc_handle, uint32_t size)
+int xc_tbuf_set_size(int xc_handle, unsigned long size)
 {
   DECLARE_DOM0_OP;
 
@@ -42,7 +42,7 @@ int xc_tbuf_set_size(int xc_handle, uint
   return xc_dom0_op(xc_handle, &op);
 }
 
-int xc_tbuf_get_size(int xc_handle, uint32_t *size)
+int xc_tbuf_get_size(int xc_handle, unsigned long *size)
 {
   int rc;
   DECLARE_DOM0_OP;
@@ -57,10 +57,17 @@ int xc_tbuf_get_size(int xc_handle, uint
   return rc;
 }
 
-int xc_tbuf_get_mfn(int xc_handle, unsigned long *mfn)
+int xc_tbuf_enable(int xc_handle, size_t cnt, unsigned long *mfn,
+    unsigned long *size)
 {
+    DECLARE_DOM0_OP;
     int rc;
-    DECLARE_DOM0_OP;
+
+    if ( xc_tbuf_set_size(xc_handle, cnt) != 0 )
+        return -1;
+
+    if ( tbuf_enable(xc_handle, 1) != 0 )
+        return -1;
 
     op.cmd = DOM0_TBUFCONTROL;
     op.interface_version = DOM0_INTERFACE_VERSION;
@@ -68,8 +75,17 @@ int xc_tbuf_get_mfn(int xc_handle, unsig
 
     rc = xc_dom0_op(xc_handle, &op);
     if ( rc == 0 )
-      *mfn = op.u.tbufcontrol.buffer_mfn;
-    return rc;
+    {
+        *size = op.u.tbufcontrol.size;
+        *mfn = op.u.tbufcontrol.buffer_mfn;
+    }
+
+    return 0;
+}
+
+int xc_tbuf_disable(int xc_handle)
+{
+    return tbuf_enable(xc_handle, 0);
 }
 
 int xc_tbuf_set_cpu_mask(int xc_handle, uint32_t mask)
@@ -95,3 +111,4 @@ int xc_tbuf_set_evt_mask(int xc_handle, 
 
     return do_dom0_op(xc_handle, &op);
 }
+
diff -r dc213d745642 -r 627b79e3f022 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Mon May 15 16:32:09 2006 +0100
+++ b/tools/libxc/xenctrl.h     Mon May 15 08:16:01 2006 -0700
@@ -529,15 +529,23 @@ long xc_get_tot_pages(int xc_handle, uin
  */
 
 /**
- * This function enables or disables tracing. Trace buffer memory must
- * be already allocated by setting the size to a non-zero value, otherwise
- * tracing cannot be enabled.
- *
- * @parm xc_handle a handle to an open hypervisor interface
- * @parm enable the desired action, 1 for enable, 0 for disable
- * @return 0 on success, -1 on failure.
- */
-int xc_tbuf_enable(int xc_handle, int enable);
+ * xc_tbuf_enable - enable tracing buffers
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm cnt size of tracing buffers to create (in pages)
+ * @parm mfn location to store mfn of the trace buffers to
+ * @parm size location to store the size (in bytes) of a trace buffer to
+ *
+ * Gets the machine address of the trace pointer area and the size of the
+ * per CPU buffers.
+ */
+int xc_tbuf_enable(int xc_handle, size_t cnt, unsigned long *mfn,
+    unsigned long *size);
+
+/*
+ * Disable tracing buffers.
+ */
+int xc_tbuf_disable(int xc_handle);
 
 /**
  * This function sets the size of the trace buffers. Setting the size
@@ -549,7 +557,7 @@ int xc_tbuf_enable(int xc_handle, int en
  * @parm size the size in pages per cpu for the trace buffers
  * @return 0 on success, -1 on failure.
  */
-int xc_tbuf_set_size(int xc_handle, uint32_t size);
+int xc_tbuf_set_size(int xc_handle, unsigned long size);
 
 /**
  * This function retrieves the current size of the trace buffers.
@@ -559,16 +567,7 @@ int xc_tbuf_set_size(int xc_handle, uint
  * @parm size will contain the size in bytes for the trace buffers
  * @return 0 on success, -1 on failure.
  */
-int xc_tbuf_get_size(int xc_handle, uint32_t *size);
-
-/**
- * This function retrieves the machine frame of the trace buffer.
-
- * @parm xc_handle a handle to an open hypervisor interface
- * @parm mfn will contain the machine frame of the buffer.
- * @return 0 on success, -1 on failure.
- */
-int xc_tbuf_get_mfn(int xc_handle, unsigned long *mfn);
+int xc_tbuf_get_size(int xc_handle, unsigned long *size);
 
 int xc_tbuf_set_cpu_mask(int xc_handle, uint32_t mask);
 
diff -r dc213d745642 -r 627b79e3f022 tools/xenmon/xenbaked.c
--- a/tools/xenmon/xenbaked.c   Mon May 15 16:32:09 2006 +0100
+++ b/tools/xenmon/xenbaked.c   Mon May 15 08:16:01 2006 -0700
@@ -35,6 +35,7 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
@@ -46,7 +47,14 @@
 #include <sys/select.h>
 #include <xen/linux/evtchn.h>
 
-#include "xc_private.h"
+#define PERROR(_m, _a...)                                       \
+do {                                                            \
+    int __saved_errno = errno;                                  \
+    fprintf(stderr, "ERROR: " _m " (%d = %s)\n" , ## _a ,       \
+            __saved_errno, strerror(__saved_errno));            \
+    errno = __saved_errno;                                      \
+} while (0)
+
 typedef struct { int counter; } atomic_t;
 #define _atomic_read(v)                ((v).counter)
 
@@ -326,77 +334,32 @@ void wait_for_event(void)
   }
 }
 
-void enable_tracing_or_die(int xc_handle) 
-{
-  int enable = 1;
-  int tbsize = DEFAULT_TBUF_SIZE;
-  
-  if (xc_tbuf_enable(xc_handle, enable) != 0) {
-    if (xc_tbuf_set_size(xc_handle, tbsize) != 0) {
-      perror("set_size Hypercall failure");
-      exit(1);
-    }
-    printf("Set default trace buffer allocation (%d pages)\n", tbsize);
-    if (xc_tbuf_enable(xc_handle, enable) != 0) {
-      perror("Could not enable trace buffers\n");
-      exit(1);
-    }
-  }
-  else
-    printf("Tracing enabled\n");
-}
-
-void disable_tracing(void)
-{
-  int enable = 0;
-  int xc_handle = xc_interface_open();
-    
-  xc_tbuf_enable(xc_handle, enable);
-  xc_interface_close(xc_handle);
-}
-
-
-/**
- * get_tbufs - get pointer to and size of the trace buffers
- * @mfn:  location to store mfn of the trace buffers to
- * @size: location to store the size of a trace buffer to
- *
- * Gets the machine address of the trace pointer area and the size of the
- * per CPU buffers.
- */
-void get_tbufs(unsigned long *mfn, unsigned long *size)
-{
+static void get_tbufs(unsigned long *mfn, unsigned long *size)
+{
+    int xc_handle = xc_interface_open();
     int ret;
-    dom0_op_t op;                        /* dom0 op we'll build             */
-    int xc_handle = xc_interface_open(); /* for accessing control interface */
-    unsigned int tbsize;
-
-    enable_tracing_or_die(xc_handle);
-
-    if (xc_tbuf_get_size(xc_handle, &tbsize) != 0) {
-      perror("Failure to get tbuf info from Xen. Guess size is 0?");
-      exit(1);
-    }
-    else
-      printf("Current tbuf size: 0x%x\n", tbsize);
-    
-
-    op.cmd = DOM0_TBUFCONTROL;
-    op.interface_version = DOM0_INTERFACE_VERSION;
-    op.u.tbufcontrol.op  = DOM0_TBUF_GET_INFO;
-
-    ret = do_dom0_op(xc_handle, &op);
-
-    xc_interface_close(xc_handle);
+
+    if ( xc_handle < 0 ) 
+    {
+        exit(EXIT_FAILURE);
+    }
+
+    ret = xc_tbuf_enable(xc_handle, DEFAULT_TBUF_SIZE, mfn, size);
 
     if ( ret != 0 )
     {
-        PERROR("Failure to get trace buffer pointer from Xen");
-        exit(EXIT_FAILURE);
-    }
-
-    *mfn  = op.u.tbufcontrol.buffer_mfn;
-    *size = op.u.tbufcontrol.size;
+        perror("Couldn't enable trace buffers");
+        exit(1);
+    }
+
+    xc_interface_close(xc_handle);
+}
+
+void disable_tracing(void)
+{
+  int xc_handle = xc_interface_open();
+  xc_tbuf_disable(xc_handle);  
+  xc_interface_close(xc_handle);
 }
 
 /**
diff -r dc213d745642 -r 627b79e3f022 tools/xentrace/xentrace.c
--- a/tools/xentrace/xentrace.c Mon May 15 16:32:09 2006 +0100
+++ b/tools/xentrace/xentrace.c Mon May 15 08:16:01 2006 -0700
@@ -28,8 +28,6 @@
 
 #include <xenctrl.h>
 
-#include "xc_private.h"
-
 #define PERROR(_m, _a...)                                       \
 do {                                                            \
     int __saved_errno = errno;                                  \
@@ -103,67 +101,25 @@ void write_rec(unsigned int cpu, struct 
     }
 }
 
-void enable_tracing_or_die(int xc_handle) 
-{
-  int enable = 1;
-  int tbsize = DEFAULT_TBUF_SIZE;
-  
-  if (xc_tbuf_enable(xc_handle, enable) != 0) {
-    if (xc_tbuf_set_size(xc_handle, tbsize) != 0) {
-      perror("set_size Hypercall failure");
-      exit(1);
-    }
-    printf("Set default trace buffer allocation (%d pages)\n", tbsize);
-    if (xc_tbuf_enable(xc_handle, enable) != 0) {
-      perror("Could not enable trace buffers\n");
-      exit(1);
-    }
-  }
-  else
-    printf("Tracing enabled\n");
-}
-
-/**
- * get_tbufs - get pointer to and size of the trace buffers
- * @mfn:  location to store mfn of the trace buffers to
- * @size: location to store the size of a trace buffer to
- *
- * Gets the machine address of the trace pointer area and the size of the
- * per CPU buffers.
- */
-void get_tbufs(unsigned long *mfn, unsigned long *size)
-{
+static void get_tbufs(unsigned long *mfn, unsigned long *size)
+{
+    int xc_handle = xc_interface_open();
     int ret;
-    dom0_op_t op;                        /* dom0 op we'll build             */
-    int xc_handle = xc_interface_open(); /* for accessing control interface */
-    unsigned int tbsize;
-
-    enable_tracing_or_die(xc_handle);
-
-    if (xc_tbuf_get_size(xc_handle, &tbsize) != 0) {
-      perror("Failure to get tbuf info from Xen. Guess size is 0?");
-      exit(1);
-    }
-    else
-      printf("Current tbuf size: 0x%x\n", tbsize);
-    
-
-    op.cmd = DOM0_TBUFCONTROL;
-    op.interface_version = DOM0_INTERFACE_VERSION;
-    op.u.tbufcontrol.op  = DOM0_TBUF_GET_INFO;
-
-    ret = do_dom0_op(xc_handle, &op);
+
+    if ( xc_handle < 0 ) 
+    {
+        exit(EXIT_FAILURE);
+    }
+
+    ret = xc_tbuf_enable(xc_handle, DEFAULT_TBUF_SIZE, mfn, size);
+
+    if ( ret != 0 )
+    {
+        perror("Couldn't enable trace buffers");
+        exit(1);
+    }
 
     xc_interface_close(xc_handle);
-
-    if ( ret != 0 )
-    {
-        PERROR("Failure to get trace buffer pointer from Xen");
-        exit(EXIT_FAILURE);
-    }
-
-    *mfn  = op.u.tbufcontrol.buffer_mfn;
-    *size = op.u.tbufcontrol.size;
 }
 
 /**

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