mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@sun.com>
This commit is contained in:
1 parent
1c9887d59b
commit
b152f0ed7a
4 files changed
+78
-143
No files matched your search
+24
-7
@@ -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 enable)
|
||||
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, uint32_t size)
|
||||
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, uint32_t *size)
|
||||
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)
|
||||
{
|
||||
int rc;
|
||||
DECLARE_DOM0_OP;
|
||||
int rc;
|
||||
|
||||
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, unsigned long *mfn)
|
||||
|
||||
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, uint32_t mask)
|
||||
|
||||
return do_dom0_op(xc_handle, &op);
|
||||
}
|
||||
|
||||
+16
-17
@@ -529,15 +529,23 @@ long xc_get_tot_pages(int xc_handle, uint32_t domid);
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* xc_tbuf_enable - enable tracing buffers
|
||||
*
|
||||
* @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.
|
||||
* @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, int enable);
|
||||
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 enable);
|
||||
* @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, uint32_t size);
|
||||
* @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);
|
||||
|
||||
|
||||
+26
-63
@@ -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,79 +334,34 @@ void wait_for_event(void)
|
||||
}
|
||||
}
|
||||
|
||||
void enable_tracing_or_die(int xc_handle)
|
||||
static void get_tbufs(unsigned long *mfn, unsigned long *size)
|
||||
{
|
||||
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);
|
||||
int xc_handle = xc_interface_open();
|
||||
int ret;
|
||||
|
||||
if ( xc_handle < 0 )
|
||||
{
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
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);
|
||||
|
||||
ret = xc_tbuf_enable(xc_handle, DEFAULT_TBUF_SIZE, mfn, size);
|
||||
|
||||
if ( ret != 0 )
|
||||
{
|
||||
perror("Couldn't enable trace buffers");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
printf("Tracing enabled\n");
|
||||
|
||||
xc_interface_close(xc_handle);
|
||||
}
|
||||
|
||||
void disable_tracing(void)
|
||||
{
|
||||
int enable = 0;
|
||||
int xc_handle = xc_interface_open();
|
||||
|
||||
xc_tbuf_enable(xc_handle, enable);
|
||||
xc_tbuf_disable(xc_handle);
|
||||
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)
|
||||
{
|
||||
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 ( 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* map_tbufs - memory map Xen trace buffers into user space
|
||||
* @tbufs_mfn: mfn of the trace buffers
|
||||
|
||||
+12
-56
@@ -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 t_rec *rec, FILE *out)
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
xc_interface_close(xc_handle);
|
||||
|
||||
if ( ret != 0 )
|
||||
if ( xc_handle < 0 )
|
||||
{
|
||||
PERROR("Failure to get trace buffer pointer from Xen");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
*mfn = op.u.tbufcontrol.buffer_mfn;
|
||||
*size = op.u.tbufcontrol.size;
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||