@@ -15,35 +15,41 @@
#include <xen/watchdog.h>
/* Send output direct to console, or buffer it? */
-static volatile int debugtrace_send_to_console;
+static volatile bool debugtrace_send_to_console;
-static char *debugtrace_buf; /* Debug-trace buffer */
-static unsigned int debugtrace_prd; /* Producer index */
-static unsigned int debugtrace_prd_last;
-static unsigned int debugtrace_kilobytes = 128, debugtrace_bytes;
-static unsigned int debugtrace_used;
+struct debugtrace_data {
+ unsigned long bytes; /* Size of buffer. */
+ unsigned long prd; /* Producer index. */
+ unsigned long prd_last;
+ char buf[];
+};
+
+static struct debugtrace_data *dt_data;
+
+static unsigned int debugtrace_kilobytes = 128;
+static bool debugtrace_used;
static DEFINE_SPINLOCK(debugtrace_lock);
integer_param("debugtrace", debugtrace_kilobytes);
static void debugtrace_dump_worker(void)
{
- if ( (debugtrace_bytes == 0) || !debugtrace_used )
+ if ( !debugtrace_used )
return;
printk("debugtrace_dump() starting\n");
/* Print oldest portion of the ring. */
- if ( debugtrace_buf[debugtrace_prd] != '\0' )
- console_serial_puts(&debugtrace_buf[debugtrace_prd],
- debugtrace_bytes - debugtrace_prd);
+ if ( dt_data->buf[dt_data->prd] != '\0' )
+ console_serial_puts(&dt_data->buf[dt_data->prd],
+ dt_data->bytes - dt_data->prd);
/* Print youngest portion of the ring. */
- debugtrace_buf[debugtrace_prd] = '\0';
- console_serial_puts(&debugtrace_buf[0], debugtrace_prd);
+ dt_data->buf[dt_data->prd] = '\0';
+ console_serial_puts(&dt_data->buf[0], dt_data->prd);
- memset(debugtrace_buf, '\0', debugtrace_bytes);
- debugtrace_prd = 0;
- debugtrace_prd_last = 0;
+ memset(dt_data->buf, '\0', dt_data->bytes);
+ dt_data->prd = 0;
+ dt_data->prd_last = 0;
printk("debugtrace_dump() finished\n");
}
@@ -68,7 +74,6 @@ static void debugtrace_toggle(void)
spin_unlock_irqrestore(&debugtrace_lock, flags);
watchdog_enable();
-
}
void debugtrace_dump(void)
@@ -90,9 +95,9 @@ static void debugtrace_add_to_buf(char *buf)
for ( p = buf; *p != '\0'; p++ )
{
- debugtrace_buf[debugtrace_prd++] = *p;
- if ( debugtrace_prd == debugtrace_bytes )
- debugtrace_prd = 0;
+ dt_data->buf[dt_data->prd++] = *p;
+ if ( dt_data->prd == dt_data->bytes )
+ dt_data->prd = 0;
}
}
@@ -106,10 +111,10 @@ void debugtrace_printk(const char *fmt, ...)
unsigned long flags;
unsigned int nr;
- if ( debugtrace_bytes == 0 )
+ if ( !dt_data )
return;
- debugtrace_used = 1;
+ debugtrace_used = true;
spin_lock_irqsave(&debugtrace_lock, flags);
@@ -128,14 +133,14 @@ void debugtrace_printk(const char *fmt, ...)
{
if ( strcmp(buf, last_buf) )
{
- debugtrace_prd_last = debugtrace_prd;
+ dt_data->prd_last = dt_data->prd;
last_count = ++count;
safe_strcpy(last_buf, buf);
snprintf(cntbuf, sizeof(cntbuf), "%u ", count);
}
else
{
- debugtrace_prd = debugtrace_prd_last;
+ dt_data->prd = dt_data->prd_last;
snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count);
}
debugtrace_add_to_buf(cntbuf);
@@ -153,7 +158,8 @@ static void debugtrace_key(unsigned char key)
static int __init debugtrace_init(void)
{
int order;
- unsigned int kbytes, bytes;
+ unsigned long kbytes, bytes;
+ struct debugtrace_data *data;
/* Round size down to next power of two. */
while ( (kbytes = (debugtrace_kilobytes & (debugtrace_kilobytes-1))) != 0 )
@@ -164,12 +170,15 @@ static int __init debugtrace_init(void)
return 0;
order = get_order_from_bytes(bytes);
- debugtrace_buf = alloc_xenheap_pages(order, 0);
- ASSERT(debugtrace_buf != NULL);
+ data = alloc_xenheap_pages(order, 0);
+ if ( !data )
+ return -ENOMEM;
- memset(debugtrace_buf, '\0', bytes);
+ bytes = PAGE_SIZE << order;
+ memset(data, '\0', bytes);
- debugtrace_bytes = bytes;
+ data->bytes = bytes - sizeof(*data);
+ dt_data = data;
register_keyhandler('T', debugtrace_key,
"toggle debugtrace to console/buffer", 0);
As a preparation for per-cpu buffers do a little refactoring of the debugtrace data: put the needed buffer admin data into the buffer as it will be needed for each buffer. While at it switch debugtrace_send_to_console and debugtrace_used to bool and delete an empty line. Signed-off-by: Juergen Gross <jgross@suse.com> --- V4: - renamed struct debugtrace_data_s (Jan Beulich) - renamed debtr_data (Jan Beulich) - remove unneeded condition (Jan Beulich) - recalc debugtrace_bytes (Jan Beulich) --- xen/common/debugtrace.c | 65 ++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 28 deletions(-)