From nobody Sat Apr 27 16:23:31 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1566979314; cv=none; d=zoho.com; s=zohoarc; b=hQ3pzUg/Ank2x8ul9lOLkWYvOLqB4wD0zMspSMZBdJp0qzec7rwoz+zgb8yC9R+NUY79xGIsUF8RHVziLSnmK5iN0dLzQzmIYXkt19pEBkNN4XVpqKMPAMu8TF7sKXoxCCtrstCxHML5ZezoGemKjtpFrhYA4fdzMcYqHGbZxCo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1566979314; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=NhLnEbpvIVsDXt9zhKQ7Kf0gNLkzzwZDaLcMAM1o3+I=; b=Mlnp07pXtfhHhx1bPJ1yAJd4rVYY+6MROeAObWg5ZeQOL3uz58T4H77ya7KPIX5CXOm1EwpP3MzB6qp0JbWQttHyyERPh3ui0lnmmGfltK3c/j+FB5hfmR9+FuzBjQIlKxHTlt9DQAjId8Ey+K+o2tuR9ayEZaYFeUACBuzrofE= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1566979314403934.0103434019488; Wed, 28 Aug 2019 01:01:54 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssr-0001kM-LX; Wed, 28 Aug 2019 08:00:49 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssq-0001kD-QU for xen-devel@lists.xenproject.org; Wed, 28 Aug 2019 08:00:48 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id eb240aff-c969-11e9-ae43-12813bfff9fa; Wed, 28 Aug 2019 08:00:37 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id E53AAAD79; Wed, 28 Aug 2019 08:00:35 +0000 (UTC) X-Inumbo-ID: eb240aff-c969-11e9-ae43-12813bfff9fa X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Wed, 28 Aug 2019 10:00:25 +0200 Message-Id: <20190828080028.18205-2-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190828080028.18205-1-jgross@suse.com> References: <20190828080028.18205-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v3 1/4] xen: use common output function in debugtrace X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Today dumping the debugtrace buffers is done via sercon_puts(), while direct printing of trace entries (after toggling output to the console) is using serial_puts(). Use sercon_puts() in both cases, as the difference between both is not really making sense. In order to prepare moving debugtrace functionality to an own source file rename sercon_puts() to console_serial_puts() and make it globally visible. Signed-off-by: Juergen Gross Reviewed-by: Jan Beulich --- xen/drivers/char/console.c | 18 +++++++++--------- xen/include/xen/console.h | 3 +++ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index d67e1993f2..f49c6f29a8 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -346,7 +346,7 @@ void console_giveback(int id) serial_steal_fn =3D NULL; } =20 -static void sercon_puts(const char *s, size_t nr) +void console_serial_puts(const char *s, size_t nr) { if ( serial_steal_fn !=3D NULL ) serial_steal_fn(s, nr); @@ -388,7 +388,7 @@ static void dump_console_ring_key(unsigned char key) c +=3D len; } =20 - sercon_puts(buf, sofar); + console_serial_puts(buf, sofar); video_puts(buf, sofar); =20 free_xenheap_pages(buf, order); @@ -547,7 +547,7 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(= char) buffer, /* Use direct console output as it could be interactive */ spin_lock_irq(&console_lock); =20 - sercon_puts(kbuf, kcount); + console_serial_puts(kbuf, kcount); video_puts(kbuf, kcount); =20 #ifdef CONFIG_X86 @@ -674,7 +674,7 @@ static void __putstr(const char *str) =20 ASSERT(spin_is_locked(&console_lock)); =20 - sercon_puts(str, len); + console_serial_puts(str, len); video_puts(str, len); =20 #ifdef CONFIG_X86 @@ -1186,12 +1186,12 @@ static void debugtrace_dump_worker(void) /* Print oldest portion of the ring. */ ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); if ( debugtrace_buf[debugtrace_prd] !=3D '\0' ) - sercon_puts(&debugtrace_buf[debugtrace_prd], - debugtrace_bytes - debugtrace_prd - 1); + console_serial_puts(&debugtrace_buf[debugtrace_prd], + debugtrace_bytes - debugtrace_prd - 1); =20 /* Print youngest portion of the ring. */ debugtrace_buf[debugtrace_prd] =3D '\0'; - sercon_puts(&debugtrace_buf[0], debugtrace_prd); + console_serial_puts(&debugtrace_buf[0], debugtrace_prd); =20 memset(debugtrace_buf, '\0', debugtrace_bytes); =20 @@ -1274,8 +1274,8 @@ void debugtrace_printk(const char *fmt, ...) { unsigned int n =3D scnprintf(cntbuf, sizeof(cntbuf), "%u ", ++coun= t); =20 - serial_puts(sercon_handle, cntbuf, n); - serial_puts(sercon_handle, buf, nr); + console_serial_puts(cntbuf, n); + console_serial_puts(buf, nr); } else { diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index ba914f9e5b..53c56191ba 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -46,6 +46,9 @@ void console_giveback(int id); int console_suspend(void); int console_resume(void); =20 +/* Emit a string via the serial console. */ +void console_serial_puts(const char *s, size_t nr); + extern int8_t opt_console_xen; =20 #endif /* __CONSOLE_H__ */ --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Sat Apr 27 16:23:31 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1566979311; cv=none; d=zoho.com; s=zohoarc; b=SkepRdbeSdy01rfY+gibs9lEuFoAtYsPzX1ET2StuD5PClp2Jc/A81EAoedkC3pdZMg/QgyY0k7YJs7u7CROV+PFtsycVkayLTdNLopFqw8QRWK5ymKzMs7SECWGn0xCNWbWBLhV7M0Nd1ANRHLYpKqIiCX8iKq2tK1PL13KAXg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1566979311; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Ae0XmobKNDf1EDXDrTuvnvepJZK0sDwpP6fIHawtsOg=; b=c9xav64BJEYfcaNFehkvIP7RZosvBwYEeSmI8WMzLWSjwbmitTOJHcnJvP8R4ku+0wAE14Xjj4eTgt2oQ3ibMPUpdU1ZAl6EKgqQMTGHjqlaK6vd/MDJzRAGwK8bwkV0Kpzwfkf9r2L76JAdnyniaSx6EhRSVzJNI3wpOty9jQk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1566979311310607.1825755611706; Wed, 28 Aug 2019 01:01:51 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssi-0001iN-Uv; Wed, 28 Aug 2019 08:00:40 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssh-0001iB-B7 for xen-devel@lists.xenproject.org; Wed, 28 Aug 2019 08:00:39 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id eb238b24-c969-11e9-8980-bc764e2007e4; Wed, 28 Aug 2019 08:00:37 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 2CCCBAC7F; Wed, 28 Aug 2019 08:00:36 +0000 (UTC) X-Inumbo-ID: eb238b24-c969-11e9-8980-bc764e2007e4 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Wed, 28 Aug 2019 10:00:26 +0200 Message-Id: <20190828080028.18205-3-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190828080028.18205-1-jgross@suse.com> References: <20190828080028.18205-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v3 2/4] xen: move debugtrace coding to common/debugtrace.c X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Instead of living in drivers/char/console.c move the debugtrace related coding to a new file common/debugtrace.c No functional change, code movement only. Signed-off-by: Juergen Gross Acked-by: Jan Beulich --- xen/common/Makefile | 1 + xen/common/debugtrace.c | 181 +++++++++++++++++++++++++++++++++++++++++= ++++ xen/drivers/char/console.c | 178 +----------------------------------------= --- 3 files changed, 183 insertions(+), 177 deletions(-) create mode 100644 xen/common/debugtrace.c diff --git a/xen/common/Makefile b/xen/common/Makefile index eddda5daa6..62b34e69e9 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -4,6 +4,7 @@ obj-y +=3D bsearch.o obj-$(CONFIG_CORE_PARKING) +=3D core_parking.o obj-y +=3D cpu.o obj-y +=3D cpupool.o +obj-$(CONFIG_DEBUG_TRACE) +=3D debugtrace.o obj-$(CONFIG_HAS_DEVICE_TREE) +=3D device_tree.o obj-y +=3D domctl.o obj-y +=3D domain.o diff --git a/xen/common/debugtrace.c b/xen/common/debugtrace.c new file mode 100644 index 0000000000..a2fab0d72c --- /dev/null +++ b/xen/common/debugtrace.c @@ -0,0 +1,181 @@ +/*************************************************************************= ***** + * debugtrace.c + * + * Debugtrace for Xen + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Send output direct to console, or buffer it? */ +static volatile int debugtrace_send_to_console; + +static char *debugtrace_buf; /* Debug-trace buffer */ +static unsigned int debugtrace_prd; /* Producer index */ +static unsigned int debugtrace_kilobytes =3D 128, debugtrace_bytes; +static unsigned int debugtrace_used; +static DEFINE_SPINLOCK(debugtrace_lock); +integer_param("debugtrace", debugtrace_kilobytes); + +static void debugtrace_dump_worker(void) +{ + if ( (debugtrace_bytes =3D=3D 0) || !debugtrace_used ) + return; + + printk("debugtrace_dump() starting\n"); + + /* Print oldest portion of the ring. */ + ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); + if ( debugtrace_buf[debugtrace_prd] !=3D '\0' ) + console_serial_puts(&debugtrace_buf[debugtrace_prd], + debugtrace_bytes - debugtrace_prd - 1); + + /* Print youngest portion of the ring. */ + debugtrace_buf[debugtrace_prd] =3D '\0'; + console_serial_puts(&debugtrace_buf[0], debugtrace_prd); + + memset(debugtrace_buf, '\0', debugtrace_bytes); + + printk("debugtrace_dump() finished\n"); +} + +static void debugtrace_toggle(void) +{ + unsigned long flags; + + watchdog_disable(); + spin_lock_irqsave(&debugtrace_lock, flags); + + /* + * Dump the buffer *before* toggling, in case the act of dumping the + * buffer itself causes more printk() invocations. + */ + printk("debugtrace_printk now writing to %s.\n", + !debugtrace_send_to_console ? "console": "buffer"); + if ( !debugtrace_send_to_console ) + debugtrace_dump_worker(); + + debugtrace_send_to_console =3D !debugtrace_send_to_console; + + spin_unlock_irqrestore(&debugtrace_lock, flags); + watchdog_enable(); + +} + +void debugtrace_dump(void) +{ + unsigned long flags; + + watchdog_disable(); + spin_lock_irqsave(&debugtrace_lock, flags); + + debugtrace_dump_worker(); + + spin_unlock_irqrestore(&debugtrace_lock, flags); + watchdog_enable(); +} + +static void debugtrace_add_to_buf(char *buf) +{ + char *p; + + for ( p =3D buf; *p !=3D '\0'; p++ ) + { + debugtrace_buf[debugtrace_prd++] =3D *p; + /* Always leave a nul byte at the end of the buffer. */ + if ( debugtrace_prd =3D=3D (debugtrace_bytes - 1) ) + debugtrace_prd =3D 0; + } +} + +void debugtrace_printk(const char *fmt, ...) +{ + static char buf[1024], last_buf[1024]; + static unsigned int count, last_count, last_prd; + + char cntbuf[24]; + va_list args; + unsigned long flags; + unsigned int nr; + + if ( debugtrace_bytes =3D=3D 0 ) + return; + + debugtrace_used =3D 1; + + spin_lock_irqsave(&debugtrace_lock, flags); + + ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); + + va_start(args, fmt); + nr =3D vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + if ( debugtrace_send_to_console ) + { + unsigned int n =3D scnprintf(cntbuf, sizeof(cntbuf), "%u ", ++coun= t); + + console_serial_puts(cntbuf, n); + console_serial_puts(buf, nr); + } + else + { + if ( strcmp(buf, last_buf) ) + { + last_prd =3D debugtrace_prd; + last_count =3D ++count; + safe_strcpy(last_buf, buf); + snprintf(cntbuf, sizeof(cntbuf), "%u ", count); + } + else + { + debugtrace_prd =3D last_prd; + snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count= ); + } + debugtrace_add_to_buf(cntbuf); + debugtrace_add_to_buf(buf); + } + + spin_unlock_irqrestore(&debugtrace_lock, flags); +} + +static void debugtrace_key(unsigned char key) +{ + debugtrace_toggle(); +} + +static int __init debugtrace_init(void) +{ + int order; + unsigned int kbytes, bytes; + + /* Round size down to next power of two. */ + while ( (kbytes =3D (debugtrace_kilobytes & (debugtrace_kilobytes-1)))= !=3D 0 ) + debugtrace_kilobytes =3D kbytes; + + bytes =3D debugtrace_kilobytes << 10; + if ( bytes =3D=3D 0 ) + return 0; + + order =3D get_order_from_bytes(bytes); + debugtrace_buf =3D alloc_xenheap_pages(order, 0); + ASSERT(debugtrace_buf !=3D NULL); + + memset(debugtrace_buf, '\0', bytes); + + debugtrace_bytes =3D bytes; + + register_keyhandler('T', debugtrace_key, + "toggle debugtrace to console/buffer", 0); + + return 0; +} +__initcall(debugtrace_init); + diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index f49c6f29a8..7f29190eaf 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -1160,183 +1160,7 @@ int printk_ratelimit(void) =20 /* * ************************************************************** - * *************** Serial console ring buffer ******************* - * ************************************************************** - */ - -#ifdef CONFIG_DEBUG_TRACE - -/* Send output direct to console, or buffer it? */ -static volatile int debugtrace_send_to_console; - -static char *debugtrace_buf; /* Debug-trace buffer */ -static unsigned int debugtrace_prd; /* Producer index */ -static unsigned int debugtrace_kilobytes =3D 128, debugtrace_bytes; -static unsigned int debugtrace_used; -static DEFINE_SPINLOCK(debugtrace_lock); -integer_param("debugtrace", debugtrace_kilobytes); - -static void debugtrace_dump_worker(void) -{ - if ( (debugtrace_bytes =3D=3D 0) || !debugtrace_used ) - return; - - printk("debugtrace_dump() starting\n"); - - /* Print oldest portion of the ring. */ - ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); - if ( debugtrace_buf[debugtrace_prd] !=3D '\0' ) - console_serial_puts(&debugtrace_buf[debugtrace_prd], - debugtrace_bytes - debugtrace_prd - 1); - - /* Print youngest portion of the ring. */ - debugtrace_buf[debugtrace_prd] =3D '\0'; - console_serial_puts(&debugtrace_buf[0], debugtrace_prd); - - memset(debugtrace_buf, '\0', debugtrace_bytes); - - printk("debugtrace_dump() finished\n"); -} - -static void debugtrace_toggle(void) -{ - unsigned long flags; - - watchdog_disable(); - spin_lock_irqsave(&debugtrace_lock, flags); - - /* - * Dump the buffer *before* toggling, in case the act of dumping the - * buffer itself causes more printk() invocations. - */ - printk("debugtrace_printk now writing to %s.\n", - !debugtrace_send_to_console ? "console": "buffer"); - if ( !debugtrace_send_to_console ) - debugtrace_dump_worker(); - - debugtrace_send_to_console =3D !debugtrace_send_to_console; - - spin_unlock_irqrestore(&debugtrace_lock, flags); - watchdog_enable(); - -} - -void debugtrace_dump(void) -{ - unsigned long flags; - - watchdog_disable(); - spin_lock_irqsave(&debugtrace_lock, flags); - - debugtrace_dump_worker(); - - spin_unlock_irqrestore(&debugtrace_lock, flags); - watchdog_enable(); -} - -static void debugtrace_add_to_buf(char *buf) -{ - char *p; - - for ( p =3D buf; *p !=3D '\0'; p++ ) - { - debugtrace_buf[debugtrace_prd++] =3D *p; - /* Always leave a nul byte at the end of the buffer. */ - if ( debugtrace_prd =3D=3D (debugtrace_bytes - 1) ) - debugtrace_prd =3D 0; - } -} - -void debugtrace_printk(const char *fmt, ...) -{ - static char buf[1024], last_buf[1024]; - static unsigned int count, last_count, last_prd; - - char cntbuf[24]; - va_list args; - unsigned long flags; - unsigned int nr; - - if ( debugtrace_bytes =3D=3D 0 ) - return; - - debugtrace_used =3D 1; - - spin_lock_irqsave(&debugtrace_lock, flags); - - ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); - - va_start(args, fmt); - nr =3D vscnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - - if ( debugtrace_send_to_console ) - { - unsigned int n =3D scnprintf(cntbuf, sizeof(cntbuf), "%u ", ++coun= t); - - console_serial_puts(cntbuf, n); - console_serial_puts(buf, nr); - } - else - { - if ( strcmp(buf, last_buf) ) - { - last_prd =3D debugtrace_prd; - last_count =3D ++count; - safe_strcpy(last_buf, buf); - snprintf(cntbuf, sizeof(cntbuf), "%u ", count); - } - else - { - debugtrace_prd =3D last_prd; - snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count= ); - } - debugtrace_add_to_buf(cntbuf); - debugtrace_add_to_buf(buf); - } - - spin_unlock_irqrestore(&debugtrace_lock, flags); -} - -static void debugtrace_key(unsigned char key) -{ - debugtrace_toggle(); -} - -static int __init debugtrace_init(void) -{ - int order; - unsigned int kbytes, bytes; - - /* Round size down to next power of two. */ - while ( (kbytes =3D (debugtrace_kilobytes & (debugtrace_kilobytes-1)))= !=3D 0 ) - debugtrace_kilobytes =3D kbytes; - - bytes =3D debugtrace_kilobytes << 10; - if ( bytes =3D=3D 0 ) - return 0; - - order =3D get_order_from_bytes(bytes); - debugtrace_buf =3D alloc_xenheap_pages(order, 0); - ASSERT(debugtrace_buf !=3D NULL); - - memset(debugtrace_buf, '\0', bytes); - - debugtrace_bytes =3D bytes; - - register_keyhandler('T', debugtrace_key, - "toggle debugtrace to console/buffer", 0); - - return 0; -} -__initcall(debugtrace_init); - -#endif /* !CONFIG_DEBUG_TRACE */ - - -/* - * ************************************************************** - * *************** Debugging/tracing/error-report *************** + * ********************** Error-report ************************** * ************************************************************** */ =20 --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Sat Apr 27 16:23:31 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1566979309; cv=none; d=zoho.com; s=zohoarc; b=HW1Ging6xM6LZbOc/mcLZISMZQPn2Bxptwi8oMchdqsDAlZaaJ158U4vIKeKHn/YRcLbnydxTii6m0nuk9eT5jvIJTgjCNJZTyxm0OvMaViK0KacKDvXIazeS5gVLixxD8cxc/wgd9cD4DQIOqoMZJCirdMalD744q2rV663ojQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1566979309; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=4cmuwisD4fg3arz95/5OInqdgmRyLy/s3gQj8Om2HVM=; b=ZG6EkRbAkcqsSK7SODLWSk6bUl7be8v+Qe8JeYZaSZrdkQ6e6tSC86bucfunfUZHivlfW9M9yhNsRmxzs3y5HyUAWRE4U7+50WqLMKCrsAeLhXoJT8sysurVjwV5ipmzQuly2xhLxsg8hJYViH7nvDbCDnDV9YE1EvzV1HWZTSM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1566979309184990.0310146190038; Wed, 28 Aug 2019 01:01:49 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssi-0001iH-Ma; Wed, 28 Aug 2019 08:00:40 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssg-0001i6-QQ for xen-devel@lists.xenproject.org; Wed, 28 Aug 2019 08:00:38 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id eb240b01-c969-11e9-ae43-12813bfff9fa; Wed, 28 Aug 2019 08:00:37 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 6D3D9AE6D; Wed, 28 Aug 2019 08:00:36 +0000 (UTC) X-Inumbo-ID: eb240b01-c969-11e9-ae43-12813bfff9fa X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Wed, 28 Aug 2019 10:00:27 +0200 Message-Id: <20190828080028.18205-4-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190828080028.18205-1-jgross@suse.com> References: <20190828080028.18205-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v3 3/4] xen: refactor debugtrace data X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" 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 --- xen/common/debugtrace.c | 62 ++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/xen/common/debugtrace.c b/xen/common/debugtrace.c index a2fab0d72c..7a9e4fb99f 100644 --- a/xen/common/debugtrace.c +++ b/xen/common/debugtrace.c @@ -15,33 +15,39 @@ #include =20 /* Send output direct to console, or buffer it? */ -static volatile int debugtrace_send_to_console; +static volatile bool debugtrace_send_to_console; =20 -static char *debugtrace_buf; /* Debug-trace buffer */ -static unsigned int debugtrace_prd; /* Producer index */ -static unsigned int debugtrace_kilobytes =3D 128, debugtrace_bytes; -static unsigned int debugtrace_used; +struct debugtrace_data_s { + unsigned long bytes; /* Size of buffer. */ + unsigned long prd; /* Producer index. */ + char buf[]; +}; + +static struct debugtrace_data_s *debtr_data; + +static unsigned int debugtrace_kilobytes =3D 128; +static bool debugtrace_used; static DEFINE_SPINLOCK(debugtrace_lock); integer_param("debugtrace", debugtrace_kilobytes); =20 static void debugtrace_dump_worker(void) { - if ( (debugtrace_bytes =3D=3D 0) || !debugtrace_used ) + if ( !debtr_data || !debugtrace_used ) return; =20 printk("debugtrace_dump() starting\n"); =20 /* Print oldest portion of the ring. */ - ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); - if ( debugtrace_buf[debugtrace_prd] !=3D '\0' ) - console_serial_puts(&debugtrace_buf[debugtrace_prd], - debugtrace_bytes - debugtrace_prd - 1); + ASSERT(debtr_data->buf[debtr_data->bytes - 1] =3D=3D 0); + if ( debtr_data->buf[debtr_data->prd] !=3D '\0' ) + console_serial_puts(&debtr_data->buf[debtr_data->prd], + debtr_data->bytes - debtr_data->prd - 1); =20 /* Print youngest portion of the ring. */ - debugtrace_buf[debugtrace_prd] =3D '\0'; - console_serial_puts(&debugtrace_buf[0], debugtrace_prd); + debtr_data->buf[debtr_data->prd] =3D '\0'; + console_serial_puts(&debtr_data->buf[0], debtr_data->prd); =20 - memset(debugtrace_buf, '\0', debugtrace_bytes); + memset(debtr_data->buf, '\0', debtr_data->bytes); =20 printk("debugtrace_dump() finished\n"); } @@ -66,7 +72,6 @@ static void debugtrace_toggle(void) =20 spin_unlock_irqrestore(&debugtrace_lock, flags); watchdog_enable(); - } =20 void debugtrace_dump(void) @@ -88,10 +93,10 @@ static void debugtrace_add_to_buf(char *buf) =20 for ( p =3D buf; *p !=3D '\0'; p++ ) { - debugtrace_buf[debugtrace_prd++] =3D *p; + debtr_data->buf[debtr_data->prd++] =3D *p; /* Always leave a nul byte at the end of the buffer. */ - if ( debugtrace_prd =3D=3D (debugtrace_bytes - 1) ) - debugtrace_prd =3D 0; + if ( debtr_data->prd =3D=3D (debtr_data->bytes - 1) ) + debtr_data->prd =3D 0; } } =20 @@ -105,14 +110,14 @@ void debugtrace_printk(const char *fmt, ...) unsigned long flags; unsigned int nr; =20 - if ( debugtrace_bytes =3D=3D 0 ) + if ( !debtr_data ) return; =20 - debugtrace_used =3D 1; + debugtrace_used =3D true; =20 spin_lock_irqsave(&debugtrace_lock, flags); =20 - ASSERT(debugtrace_buf[debugtrace_bytes - 1] =3D=3D 0); + ASSERT(debtr_data->buf[debtr_data->bytes - 1] =3D=3D 0); =20 va_start(args, fmt); nr =3D vsnprintf(buf, sizeof(buf), fmt, args); @@ -129,14 +134,14 @@ void debugtrace_printk(const char *fmt, ...) { if ( strcmp(buf, last_buf) ) { - last_prd =3D debugtrace_prd; + last_prd =3D debtr_data->prd; last_count =3D ++count; safe_strcpy(last_buf, buf); snprintf(cntbuf, sizeof(cntbuf), "%u ", count); } else { - debugtrace_prd =3D last_prd; + debtr_data->prd =3D last_prd; snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count= ); } debugtrace_add_to_buf(cntbuf); @@ -154,7 +159,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_s *data; =20 /* Round size down to next power of two. */ while ( (kbytes =3D (debugtrace_kilobytes & (debugtrace_kilobytes-1)))= !=3D 0 ) @@ -165,12 +171,14 @@ static int __init debugtrace_init(void) return 0; =20 order =3D get_order_from_bytes(bytes); - debugtrace_buf =3D alloc_xenheap_pages(order, 0); - ASSERT(debugtrace_buf !=3D NULL); + data =3D alloc_xenheap_pages(order, 0); + if ( !data ) + return -ENOMEM; =20 - memset(debugtrace_buf, '\0', bytes); + memset(data, '\0', bytes); =20 - debugtrace_bytes =3D bytes; + data->bytes =3D bytes - sizeof(*data); + debtr_data =3D data; =20 register_keyhandler('T', debugtrace_key, "toggle debugtrace to console/buffer", 0); --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Sat Apr 27 16:23:31 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1566979313; cv=none; d=zoho.com; s=zohoarc; b=Ki3O6BXpwVQrRDsiuREpDcSmg12pqe9V5GwH9qiMTeDj7T/zfyPsxhLQYOk08qlHSAuwn5ZmyrDNioO3o7GthD1ACVWuCY6CTbJCimeoAonNgrD5gi8fwsCjOHRrGDuNeq8y0f6+MdQC3UaRZ+yop4EWia2zN7ocJkFCNXQlAGg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1566979313; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=msL0fe3EI/sEbXSS0yuV1Cl3IWhA5EYyfrrOJ+gWfvI=; b=O1x/o+ysYcA9RaihrQ5e2g+Js38vg3GYDgzMiUV0ROMPQiB1qlW45Wsm5FEnYU4BEc7AzRELQLC8V/HNEfR8d14Xx6dz1bQRkgOG9brKu9JEwp3KLl9GlhDOEUlAjqLyWiDUTP34vWt+RpRM28p1M55h9eNaU/BQIiyZLgYRlg4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1566979313076306.81910920905636; Wed, 28 Aug 2019 01:01:53 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssw-0001mQ-Ug; Wed, 28 Aug 2019 08:00:54 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i2ssv-0001m3-Qh for xen-devel@lists.xenproject.org; Wed, 28 Aug 2019 08:00:53 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id eb25f2c5-c969-11e9-ae43-12813bfff9fa; Wed, 28 Aug 2019 08:00:37 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id B74B1AEED; Wed, 28 Aug 2019 08:00:36 +0000 (UTC) X-Inumbo-ID: eb25f2c5-c969-11e9-ae43-12813bfff9fa X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Wed, 28 Aug 2019 10:00:28 +0200 Message-Id: <20190828080028.18205-5-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190828080028.18205-1-jgross@suse.com> References: <20190828080028.18205-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v3 4/4] xen: add per-cpu buffer option to debugtrace X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" debugtrace is normally writing trace entries into a single trace buffer. There are cases where this is not optimal, e.g. when hunting a bug which requires writing lots of trace entries and one cpu is stuck. This will result in other cpus filling the trace buffer and finally overwriting the interesting trace entries of the hanging cpu. In order to be able to debug such situations add the capability to use per-cpu trace buffers. This can be selected by specifying the debugtrace boot parameter with the modifier "cpu:", like: debugtrace=3Dcpu:16 At the same time switch the parsing function to accept size modifiers (e.g. 4M or 1G). Printing out the trace entries is done for each buffer in order to minimize the effort needed during printing. As each entry is prefixed with its sequence number sorting the entries can easily be done when analyzing them. Signed-off-by: Juergen Gross --- V2: only allocate buffer if not already done so --- docs/misc/xen-command-line.pandoc | 7 +- xen/common/debugtrace.c | 148 ++++++++++++++++++++++++++++------= ---- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line= .pandoc index 7c72e31032..832797e2e2 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -644,12 +644,13 @@ over the PCI busses sequentially) or by PCI device (m= ust be on segment 0). Limits the number lines printed in Xen stack traces. =20 ### debugtrace -> `=3D ` +> `=3D [cpu:]` =20 > Default: `128` =20 -Specify the size of the console debug trace buffer in KiB. The debug -trace feature is only enabled in debugging builds of Xen. +Specify the size of the console debug trace buffer. By specifying `cpu:` +additionally a trace buffer of the specified size is allocated per cpu. +The debug trace feature is only enabled in debugging builds of Xen. =20 ### dma_bits > `=3D ` diff --git a/xen/common/debugtrace.c b/xen/common/debugtrace.c index 7a9e4fb99f..a54888cea9 100644 --- a/xen/common/debugtrace.c +++ b/xen/common/debugtrace.c @@ -6,6 +6,7 @@ =20 =20 #include +#include #include #include #include @@ -24,32 +25,62 @@ struct debugtrace_data_s { }; =20 static struct debugtrace_data_s *debtr_data; +static DEFINE_PER_CPU(struct debugtrace_data_s *, debtr_cpu_data); =20 -static unsigned int debugtrace_kilobytes =3D 128; +static unsigned int debugtrace_bytes =3D 128 << 10; +static bool debugtrace_per_cpu; static bool debugtrace_used; static DEFINE_SPINLOCK(debugtrace_lock); -integer_param("debugtrace", debugtrace_kilobytes); =20 -static void debugtrace_dump_worker(void) +static int __init debugtrace_parse_param(const char *s) +{ + if ( !strncmp(s, "cpu:", 4) ) + { + debugtrace_per_cpu =3D true; + s +=3D 4; + } + debugtrace_bytes =3D parse_size_and_unit(s, NULL); + return 0; +} +custom_param("debugtrace", debugtrace_parse_param); + +static void debugtrace_dump_buffer(struct debugtrace_data_s *data, + const char *which) { - if ( !debtr_data || !debugtrace_used ) + if ( !data ) return; =20 - printk("debugtrace_dump() starting\n"); + printk("debugtrace_dump() %s buffer starting\n", which); =20 /* Print oldest portion of the ring. */ - ASSERT(debtr_data->buf[debtr_data->bytes - 1] =3D=3D 0); - if ( debtr_data->buf[debtr_data->prd] !=3D '\0' ) - console_serial_puts(&debtr_data->buf[debtr_data->prd], - debtr_data->bytes - debtr_data->prd - 1); + ASSERT(data->buf[data->bytes - 1] =3D=3D 0); + if ( data->buf[data->prd] !=3D '\0' ) + console_serial_puts(&data->buf[data->prd], data->bytes - data->prd= - 1); =20 /* Print youngest portion of the ring. */ - debtr_data->buf[debtr_data->prd] =3D '\0'; - console_serial_puts(&debtr_data->buf[0], debtr_data->prd); + data->buf[data->prd] =3D '\0'; + console_serial_puts(&data->buf[0], data->prd); + + memset(data->buf, '\0', data->bytes); + + printk("debugtrace_dump() %s buffer finished\n", which); +} + +static void debugtrace_dump_worker(void) +{ + unsigned int cpu; + char buf[16]; + + if ( !debugtrace_used ) + return; =20 - memset(debtr_data->buf, '\0', debtr_data->bytes); + debugtrace_dump_buffer(debtr_data, "global"); =20 - printk("debugtrace_dump() finished\n"); + for ( cpu =3D 0; cpu < nr_cpu_ids; cpu++ ) + { + snprintf(buf, sizeof(buf), "cpu %u", cpu); + debugtrace_dump_buffer(per_cpu(debtr_cpu_data, cpu), buf); + } } =20 static void debugtrace_toggle(void) @@ -89,35 +120,42 @@ void debugtrace_dump(void) =20 static void debugtrace_add_to_buf(char *buf) { + struct debugtrace_data_s *data; char *p; =20 + data =3D debugtrace_per_cpu ? this_cpu(debtr_cpu_data) : debtr_data; + for ( p =3D buf; *p !=3D '\0'; p++ ) { - debtr_data->buf[debtr_data->prd++] =3D *p; + data->buf[data->prd++] =3D *p; /* Always leave a nul byte at the end of the buffer. */ - if ( debtr_data->prd =3D=3D (debtr_data->bytes - 1) ) - debtr_data->prd =3D 0; + if ( data->prd =3D=3D (data->bytes - 1) ) + data->prd =3D 0; } } =20 void debugtrace_printk(const char *fmt, ...) { static char buf[1024], last_buf[1024]; - static unsigned int count, last_count, last_prd; + static unsigned int count, last_count, last_prd, last_cpu; =20 char cntbuf[24]; va_list args; unsigned long flags; unsigned int nr; + struct debugtrace_data_s *data; + unsigned int cpu; =20 - if ( !debtr_data ) + data =3D debugtrace_per_cpu ? this_cpu(debtr_cpu_data) : debtr_data; + cpu =3D debugtrace_per_cpu ? smp_processor_id() : 0; + if ( !data ) return; =20 debugtrace_used =3D true; =20 spin_lock_irqsave(&debugtrace_lock, flags); =20 - ASSERT(debtr_data->buf[debtr_data->bytes - 1] =3D=3D 0); + ASSERT(data->buf[data->bytes - 1] =3D=3D 0); =20 va_start(args, fmt); nr =3D vsnprintf(buf, sizeof(buf), fmt, args); @@ -132,16 +170,17 @@ void debugtrace_printk(const char *fmt, ...) } else { - if ( strcmp(buf, last_buf) ) + if ( strcmp(buf, last_buf) || cpu !=3D last_cpu ) { - last_prd =3D debtr_data->prd; + last_prd =3D data->prd; last_count =3D ++count; + last_cpu =3D cpu; safe_strcpy(last_buf, buf); snprintf(cntbuf, sizeof(cntbuf), "%u ", count); } else { - debtr_data->prd =3D last_prd; + data->prd =3D last_prd; snprintf(cntbuf, sizeof(cntbuf), "%u-%u ", last_count, ++count= ); } debugtrace_add_to_buf(cntbuf); @@ -156,33 +195,70 @@ static void debugtrace_key(unsigned char key) debugtrace_toggle(); } =20 -static int __init debugtrace_init(void) +static void debugtrace_alloc_buffer(struct debugtrace_data_s **ptr) { int order; - unsigned long kbytes, bytes; struct debugtrace_data_s *data; =20 - /* Round size down to next power of two. */ - while ( (kbytes =3D (debugtrace_kilobytes & (debugtrace_kilobytes-1)))= !=3D 0 ) - debugtrace_kilobytes =3D kbytes; - - bytes =3D debugtrace_kilobytes << 10; - if ( bytes =3D=3D 0 ) - return 0; + if ( debugtrace_bytes < PAGE_SIZE || *ptr ) + return; =20 - order =3D get_order_from_bytes(bytes); + order =3D get_order_from_bytes(debugtrace_bytes); data =3D alloc_xenheap_pages(order, 0); if ( !data ) - return -ENOMEM; + { + printk("failed to allocate debugtrace buffer\n"); + return; + } + + memset(data, '\0', debugtrace_bytes); + data->bytes =3D debugtrace_bytes - sizeof(*data); + + *ptr =3D data; +} + +static int debugtrace_cpu_callback(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + unsigned int cpu =3D (unsigned long)hcpu; + + /* Buffers are only ever allocated, never freed. */ + switch ( action ) + { + case CPU_UP_PREPARE: + debugtrace_alloc_buffer(&per_cpu(debtr_cpu_data, cpu)); + break; + default: + break; + } + return 0; +} =20 - memset(data, '\0', bytes); +static struct notifier_block debugtrace_nfb =3D { + .notifier_call =3D debugtrace_cpu_callback +}; + +static int __init debugtrace_init(void) +{ + unsigned long bytes; + unsigned int cpu; =20 - data->bytes =3D bytes - sizeof(*data); - debtr_data =3D data; + /* Round size down to next power of two. */ + while ( (bytes =3D (debugtrace_bytes & (debugtrace_bytes - 1))) !=3D 0= ) + debugtrace_bytes =3D bytes; =20 register_keyhandler('T', debugtrace_key, "toggle debugtrace to console/buffer", 0); =20 + if ( debugtrace_per_cpu ) + { + for_each_online_cpu ( cpu ) + debugtrace_alloc_buffer(&per_cpu(debtr_cpu_data, cpu)); + register_cpu_notifier(&debugtrace_nfb); + } + else + debugtrace_alloc_buffer(&debtr_data); + return 0; } __initcall(debugtrace_init); --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel