From 4dacd5c073150cd78dfb6004cbfa71986f0258a4 Mon Sep 17 00:00:00 2001 From: Dongdong Deng Date: Mon, 30 Aug 2010 21:06:00 -0500 Subject: [PATCH] kgdbts: prevent re-entry to kgdbts before it unregisters The "kgdb_connected" variable of debug_core just indicates whether or not kgdbts is connected to the debug_core. It does not completely prevent a script from trying invoke kgdbts again and possibly crashing the system (see Call Trace below). The configured variable in kgtbts can be used instead of kgdb_connected instead of kgdb_connected. The cleanup_kgdbts() can also be removed because there is no possible way to build kgdbts as a kernel module that you could unload with rmmod. Call Trace: ----------------------------------------------------------------- root:/$ echo kgdbts=V1S1000 > /sys/module/kgdbts/parameters/kgdbts kgdb: Unregistered I/O driver kgdbts, debugger disabled. ------------[ cut here ]------------ WARNING: at kernel/debug/debug_core.c:1002 kgdb_unregister_io_module+0xec/0x100() Hardware name: Moon Creek platform Modules linked in: Pid: 664, comm: sh Not tainted 2.6.34.1-WR4.0.0.0_standard #58 Call Trace: [] warn_slowpath_common+0x6d/0xa0 [] ? kgdb_unregister_io_module+0xec/0x100 [] ? kgdb_unregister_io_module+0xec/0x100 [] ? param_attr_store+0x0/0x20 [] warn_slowpath_null+0x15/0x20 [] kgdb_unregister_io_module+0xec/0x100 [] cleanup_kgdbts+0x1a/0x20 [] param_set_kgdbts_var+0x6d/0xb0 [] ? param_set_kgdbts_var+0x0/0xb0 [] param_attr_store+0x17/0x20 [] module_attr_store+0x2c/0x40 [] sysfs_write_file+0x94/0xf0 [] vfs_write+0x96/0x130 [] ? sysfs_write_file+0x0/0xf0 [] sys_write+0x46/0xd0 [] system_call_done+0x0/0x4 ---[ end trace 4eb028c6ee43154c ]--- kgdb: Unregistered I/O driver kgdbts, debugger disabled. ----------------------------------------------------------------- [jason.wessel@windriver.com: remove cleanup_kgdbts() ] Signed-off-by: Dongdong Deng Signed-off-by: Jason Wessel --- drivers/misc/kgdbts.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index 72450237a0f..59c118c19a9 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c @@ -1044,12 +1044,6 @@ static int __init init_kgdbts(void) return configure_kgdbts(); } -static void cleanup_kgdbts(void) -{ - if (configured == 1) - kgdb_unregister_io_module(&kgdbts_io_ops); -} - static int kgdbts_get_char(void) { int val = 0; @@ -1081,10 +1075,8 @@ static int param_set_kgdbts_var(const char *kmessage, struct kernel_param *kp) return 0; } - if (kgdb_connected) { - printk(KERN_ERR - "kgdbts: Cannot reconfigure while KGDB is connected.\n"); - + if (configured == 1) { + printk(KERN_ERR "kgdbts: ERROR: Already configured and running.\n"); return -EBUSY; } @@ -1093,9 +1085,6 @@ static int param_set_kgdbts_var(const char *kmessage, struct kernel_param *kp) if (config[len - 1] == '\n') config[len - 1] = '\0'; - if (configured == 1) - cleanup_kgdbts(); - /* Go and configure with the new params. */ return configure_kgdbts(); } @@ -1123,7 +1112,6 @@ static struct kgdb_io kgdbts_io_ops = { }; module_init(init_kgdbts); -module_exit(cleanup_kgdbts); module_param_call(kgdbts, param_set_kgdbts_var, param_get_string, &kps, 0644); MODULE_PARM_DESC(kgdbts, "[F#|S#][N#]"); MODULE_DESCRIPTION("KGDB Test Suite"); -- 2.39.3