From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] reduce '0' debug key's global impact Date: Tue, 04 May 2010 16:48:14 +0100 Message-ID: <4BE05DDE0200007800001317@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__Part2C068AAE.0__=" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__Part2C068AAE.0__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On large systems, dumping state may cause time management to get stalled for so long a period that it wouldn't recover. Therefore add a tasklet based alternative mechanism to handle Dom0 state dumps. Signed-off-by: Jan Beulich --- 2010-05-04.orig/xen/common/keyhandler.c 2010-04-22 14:43:25.0000000= 00 +0200 +++ 2010-05-04/xen/common/keyhandler.c 2010-05-04 13:21:53.000000000 = +0200 @@ -19,6 +19,7 @@ =20 static struct keyhandler *key_table[256]; static unsigned char keypress_key; +static bool_t alt_key_handling; =20 char keyhandler_scratch[1024]; =20 @@ -115,6 +116,26 @@ static struct keyhandler dump_registers_ .desc =3D "dump registers" }; =20 +static DECLARE_TASKLET(dump_dom0_tasklet, NULL, 0); + +static void dump_dom0_action(unsigned long arg) +{ + struct vcpu *v =3D (void *)arg; + + for ( ; ; ) { + vcpu_show_execution_state(v); + v =3D v->next_in_list; + if ( !v ) + break; + if ( softirq_pending(smp_processor_id()) ) + { + dump_dom0_tasklet.data =3D (unsigned long)v; + tasklet_schedule_on_cpu(&dump_dom0_tasklet, v->processor); + break; + } + } +} + static void dump_dom0_registers(unsigned char key) { struct vcpu *v; @@ -125,7 +146,17 @@ static void dump_dom0_registers(unsigned printk("'%c' pressed -> dumping Dom0's registers\n", key); =20 for_each_vcpu ( dom0, v ) + { + if ( alt_key_handling && softirq_pending(smp_processor_id()) ) + { + tasklet_kill(&dump_dom0_tasklet); + tasklet_init(&dump_dom0_tasklet, dump_dom0_action, + (unsigned long)v); + tasklet_schedule_on_cpu(&dump_dom0_tasklet, v->processor); + return; + } vcpu_show_execution_state(v); + } } =20 static struct keyhandler dump_dom0_registers_keyhandler =3D { @@ -425,8 +456,28 @@ static struct keyhandler do_debug_key_ke .desc =3D "trap to xendbg" }; =20 +static void do_toggle_alt_key(unsigned char key, struct cpu_user_regs = *regs) +{ + alt_key_handling =3D !alt_key_handling; + printk("'%c' pressed -> using %s key handling\n", key, + alt_key_handling ? "alternative" : "normal"); +} + +static struct keyhandler toggle_alt_keyhandler =3D { + .irq_callback =3D 1, + .u.irq_fn =3D do_toggle_alt_key, + .desc =3D "toggle alternative key handling" +}; + void __init initialize_keytable(void) { + if ( num_present_cpus() > 16 ) + { + alt_key_handling =3D 1; + printk(XENLOG_INFO "Defaulting to alternative key handling; " + "send 'A' to switch to normal mode.\n"); + } + register_keyhandler('A', &toggle_alt_keyhandler); register_keyhandler('d', &dump_registers_keyhandler); register_keyhandler('h', &show_handlers_keyhandler); register_keyhandler('q', &dump_domains_keyhandler); --=__Part2C068AAE.0__= Content-Type: text/plain; name="keyhandler-alternative.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="keyhandler-alternative.patch" On large systems, dumping state may cause time management to get=0Astalled = for so long a period that it wouldn't recover. Therefore add=0Aa tasklet = based alternative mechanism to handle Dom0 state dumps.=0A=0ASigned-off-by:= Jan Beulich =0A=0A--- 2010-05-04.orig/xen/common/keyh= andler.c 2010-04-22 14:43:25.000000000 +0200=0A+++ 2010-05-04/xen/co= mmon/keyhandler.c 2010-05-04 13:21:53.000000000 +0200=0A@@ -19,6 = +19,7 @@=0A =0A static struct keyhandler *key_table[256];=0A static = unsigned char keypress_key;=0A+static bool_t alt_key_handling;=0A =0A char = keyhandler_scratch[1024];=0A =0A@@ -115,6 +116,26 @@ static struct = keyhandler dump_registers_=0A .desc =3D "dump registers"=0A };=0A = =0A+static DECLARE_TASKLET(dump_dom0_tasklet, NULL, 0);=0A+=0A+static void = dump_dom0_action(unsigned long arg)=0A+{=0A+ struct vcpu *v =3D (void = *)arg;=0A+=0A+ for ( ; ; ) {=0A+ vcpu_show_execution_state(v);=0A= + v =3D v->next_in_list;=0A+ if ( !v )=0A+ = break;=0A+ if ( softirq_pending(smp_processor_id()) )=0A+ = {=0A+ dump_dom0_tasklet.data =3D (unsigned long)v;=0A+ = tasklet_schedule_on_cpu(&dump_dom0_tasklet, v->processor);=0A+ = break;=0A+ }=0A+ }=0A+}=0A+=0A static void dump_dom0_registers(u= nsigned char key)=0A {=0A struct vcpu *v;=0A@@ -125,7 +146,17 @@ = static void dump_dom0_registers(unsigned=0A printk("'%c' pressed -> = dumping Dom0's registers\n", key);=0A =0A for_each_vcpu ( dom0, v = )=0A+ {=0A+ if ( alt_key_handling && softirq_pending(smp_processo= r_id()) )=0A+ {=0A+ tasklet_kill(&dump_dom0_tasklet);=0A+= tasklet_init(&dump_dom0_tasklet, dump_dom0_action,=0A+ = (unsigned long)v);=0A+ tasklet_schedule_on_cpu(&= dump_dom0_tasklet, v->processor);=0A+ return;=0A+ }=0A = vcpu_show_execution_state(v);=0A+ }=0A }=0A =0A static struct = keyhandler dump_dom0_registers_keyhandler =3D {=0A@@ -425,8 +456,28 @@ = static struct keyhandler do_debug_key_ke=0A .desc =3D "trap to = xendbg"=0A };=0A =0A+static void do_toggle_alt_key(unsigned char key, = struct cpu_user_regs *regs)=0A+{=0A+ alt_key_handling =3D !alt_key_handl= ing;=0A+ printk("'%c' pressed -> using %s key handling\n", key,=0A+ = alt_key_handling ? "alternative" : "normal");=0A+}=0A+=0A+static = struct keyhandler toggle_alt_keyhandler =3D {=0A+ .irq_callback =3D = 1,=0A+ .u.irq_fn =3D do_toggle_alt_key,=0A+ .desc =3D "toggle = alternative key handling"=0A+};=0A+=0A void __init initialize_keytable(void= )=0A {=0A+ if ( num_present_cpus() > 16 )=0A+ {=0A+ alt_key_ha= ndling =3D 1;=0A+ printk(XENLOG_INFO "Defaulting to alternative key = handling; "=0A+ "send 'A' to switch to normal mode.\n");=0A+ = }=0A+ register_keyhandler('A', &toggle_alt_keyhandler);=0A = register_keyhandler('d', &dump_registers_keyhandler);=0A register_keyha= ndler('h', &show_handlers_keyhandler);=0A register_keyhandler('q', = &dump_domains_keyhandler);=0A --=__Part2C068AAE.0__= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --=__Part2C068AAE.0__=--