Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] sysrq cleanup

sysrq.c is fairly revolting. Fix.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Andrew Morton and committed by
Linus Torvalds
bf36b901 21e4f952

+115 -135
+115 -135
drivers/char/sysrq.c
··· 42 42 /* Whether we react on sysrq keys or just ignore them */ 43 43 int sysrq_enabled = 1; 44 44 45 - /* Loglevel sysrq handler */ 46 45 static void sysrq_handle_loglevel(int key, struct pt_regs *pt_regs, 47 - struct tty_struct *tty) 46 + struct tty_struct *tty) 48 47 { 49 48 int i; 50 49 i = key - '0'; 51 50 console_loglevel = 7; 52 51 printk("Loglevel set to %d\n", i); 53 52 console_loglevel = i; 54 - } 53 + } 55 54 static struct sysrq_key_op sysrq_loglevel_op = { 56 55 .handler = sysrq_handle_loglevel, 57 56 .help_msg = "loglevel0-8", ··· 58 59 .enable_mask = SYSRQ_ENABLE_LOG, 59 60 }; 60 61 61 - 62 - /* SAK sysrq handler */ 63 62 #ifdef CONFIG_VT 64 63 static void sysrq_handle_SAK(int key, struct pt_regs *pt_regs, 65 - struct tty_struct *tty) 64 + struct tty_struct *tty) 66 65 { 67 66 if (tty) 68 67 do_SAK(tty); ··· 72 75 .action_msg = "SAK", 73 76 .enable_mask = SYSRQ_ENABLE_KEYBOARD, 74 77 }; 78 + #else 79 + #define sysrq_SAK_op (*(struct sysrq_key_op *)0) 75 80 #endif 76 81 77 82 #ifdef CONFIG_VT 78 - /* unraw sysrq handler */ 79 83 static void sysrq_handle_unraw(int key, struct pt_regs *pt_regs, 80 - struct tty_struct *tty) 84 + struct tty_struct *tty) 81 85 { 82 86 struct kbd_struct *kbd = &kbd_table[fg_console]; 83 87 ··· 91 93 .action_msg = "Keyboard mode set to XLATE", 92 94 .enable_mask = SYSRQ_ENABLE_KEYBOARD, 93 95 }; 96 + #else 97 + #define sysrq_unraw_op (*(struct sysrq_key_op *)0) 94 98 #endif /* CONFIG_VT */ 95 99 96 100 #ifdef CONFIG_KEXEC 97 - /* crashdump sysrq handler */ 98 101 static void sysrq_handle_crashdump(int key, struct pt_regs *pt_regs, 99 102 struct tty_struct *tty) 100 103 { ··· 107 108 .action_msg = "Trigger a crashdump", 108 109 .enable_mask = SYSRQ_ENABLE_DUMP, 109 110 }; 111 + #else 112 + #define sysrq_crashdump_op (*(struct sysrq_key_op *)0) 110 113 #endif 111 114 112 - /* reboot sysrq handler */ 113 115 static void sysrq_handle_reboot(int key, struct pt_regs *pt_regs, 114 - struct tty_struct *tty) 116 + struct tty_struct *tty) 115 117 { 116 118 local_irq_enable(); 117 119 emergency_restart(); 118 120 } 119 - 120 121 static struct sysrq_key_op sysrq_reboot_op = { 121 122 .handler = sysrq_handle_reboot, 122 123 .help_msg = "reBoot", ··· 125 126 }; 126 127 127 128 static void sysrq_handle_sync(int key, struct pt_regs *pt_regs, 128 - struct tty_struct *tty) 129 + struct tty_struct *tty) 129 130 { 130 131 emergency_sync(); 131 132 } 132 - 133 133 static struct sysrq_key_op sysrq_sync_op = { 134 134 .handler = sysrq_handle_sync, 135 135 .help_msg = "Sync", ··· 137 139 }; 138 140 139 141 static void sysrq_handle_mountro(int key, struct pt_regs *pt_regs, 140 - struct tty_struct *tty) 142 + struct tty_struct *tty) 141 143 { 142 144 emergency_remount(); 143 145 } 144 - 145 146 static struct sysrq_key_op sysrq_mountro_op = { 146 147 .handler = sysrq_handle_mountro, 147 148 .help_msg = "Unmount", ··· 148 151 .enable_mask = SYSRQ_ENABLE_REMOUNT, 149 152 }; 150 153 151 - /* END SYNC SYSRQ HANDLERS BLOCK */ 152 - 153 154 #ifdef CONFIG_DEBUG_MUTEXES 154 - 155 - static void 156 - sysrq_handle_showlocks(int key, struct pt_regs *pt_regs, struct tty_struct *tty) 155 + static void sysrq_handle_showlocks(int key, struct pt_regs *pt_regs, 156 + struct tty_struct *tty) 157 157 { 158 158 mutex_debug_show_all_locks(); 159 159 } 160 - 161 160 static struct sysrq_key_op sysrq_showlocks_op = { 162 161 .handler = sysrq_handle_showlocks, 163 162 .help_msg = "show-all-locks(D)", 164 163 .action_msg = "Show Locks Held", 165 164 }; 166 - 165 + #else 166 + #define sysrq_showlocks_op (*(struct sysrq_key_op *)0) 167 167 #endif 168 168 169 - /* SHOW SYSRQ HANDLERS BLOCK */ 170 - 171 169 static void sysrq_handle_showregs(int key, struct pt_regs *pt_regs, 172 - struct tty_struct *tty) 170 + struct tty_struct *tty) 173 171 { 174 172 if (pt_regs) 175 173 show_regs(pt_regs); ··· 176 184 .enable_mask = SYSRQ_ENABLE_DUMP, 177 185 }; 178 186 179 - 180 187 static void sysrq_handle_showstate(int key, struct pt_regs *pt_regs, 181 - struct tty_struct *tty) 188 + struct tty_struct *tty) 182 189 { 183 190 show_state(); 184 191 } ··· 188 197 .enable_mask = SYSRQ_ENABLE_DUMP, 189 198 }; 190 199 191 - 192 200 static void sysrq_handle_showmem(int key, struct pt_regs *pt_regs, 193 - struct tty_struct *tty) 201 + struct tty_struct *tty) 194 202 { 195 203 show_mem(); 196 204 } ··· 200 210 .enable_mask = SYSRQ_ENABLE_DUMP, 201 211 }; 202 212 203 - /* SHOW SYSRQ HANDLERS BLOCK */ 204 - 205 - 206 - /* SIGNAL SYSRQ HANDLERS BLOCK */ 207 - 208 - /* signal sysrq helper function 209 - * Sends a signal to all user processes */ 213 + /* 214 + * Signal sysrq helper function. Sends a signal to all user processes. 215 + */ 210 216 static void send_sig_all(int sig) 211 217 { 212 218 struct task_struct *p; ··· 215 229 } 216 230 217 231 static void sysrq_handle_term(int key, struct pt_regs *pt_regs, 218 - struct tty_struct *tty) 232 + struct tty_struct *tty) 219 233 { 220 234 send_sig_all(SIGTERM); 221 235 console_loglevel = 8; ··· 229 243 230 244 static void moom_callback(void *ignored) 231 245 { 232 - out_of_memory(&NODE_DATA(0)->node_zonelists[ZONE_NORMAL], GFP_KERNEL, 0); 246 + out_of_memory(&NODE_DATA(0)->node_zonelists[ZONE_NORMAL], 247 + GFP_KERNEL, 0); 233 248 } 234 249 235 250 static DECLARE_WORK(moom_work, moom_callback, NULL); ··· 247 260 }; 248 261 249 262 static void sysrq_handle_kill(int key, struct pt_regs *pt_regs, 250 - struct tty_struct *tty) 263 + struct tty_struct *tty) 251 264 { 252 265 send_sig_all(SIGKILL); 253 266 console_loglevel = 8; ··· 258 271 .action_msg = "Kill All Tasks", 259 272 .enable_mask = SYSRQ_ENABLE_SIGNAL, 260 273 }; 261 - 262 - /* END SIGNAL SYSRQ HANDLERS BLOCK */ 263 274 264 275 static void sysrq_handle_unrt(int key, struct pt_regs *pt_regs, 265 276 struct tty_struct *tty) ··· 273 288 274 289 /* Key Operations table and lock */ 275 290 static DEFINE_SPINLOCK(sysrq_key_table_lock); 276 - #define SYSRQ_KEY_TABLE_LENGTH 36 277 - static struct sysrq_key_op *sysrq_key_table[SYSRQ_KEY_TABLE_LENGTH] = { 278 - /* 0 */ &sysrq_loglevel_op, 279 - /* 1 */ &sysrq_loglevel_op, 280 - /* 2 */ &sysrq_loglevel_op, 281 - /* 3 */ &sysrq_loglevel_op, 282 - /* 4 */ &sysrq_loglevel_op, 283 - /* 5 */ &sysrq_loglevel_op, 284 - /* 6 */ &sysrq_loglevel_op, 285 - /* 7 */ &sysrq_loglevel_op, 286 - /* 8 */ &sysrq_loglevel_op, 287 - /* 9 */ &sysrq_loglevel_op, 288 - /* a */ NULL, /* Don't use for system provided sysrqs, 289 - it is handled specially on the sparc 290 - and will never arrive */ 291 - /* b */ &sysrq_reboot_op, 292 - #ifdef CONFIG_KEXEC 293 - /* c */ &sysrq_crashdump_op, 294 - #else 295 - /* c */ NULL, 296 - #endif 297 - #ifdef CONFIG_DEBUG_MUTEXES 298 - /* d */ &sysrq_showlocks_op, 299 - #else 300 - /* d */ NULL, 301 - #endif 302 - /* e */ &sysrq_term_op, 303 - /* f */ &sysrq_moom_op, 304 - /* g */ NULL, 305 - /* h */ NULL, 306 - /* i */ &sysrq_kill_op, 307 - /* j */ NULL, 308 - #ifdef CONFIG_VT 309 - /* k */ &sysrq_SAK_op, 310 - #else 311 - /* k */ NULL, 312 - #endif 313 - /* l */ NULL, 314 - /* m */ &sysrq_showmem_op, 315 - /* n */ &sysrq_unrt_op, 316 - /* o */ NULL, /* This will often be registered 317 - as 'Off' at init time */ 318 - /* p */ &sysrq_showregs_op, 319 - /* q */ NULL, 320 - #ifdef CONFIG_VT 321 - /* r */ &sysrq_unraw_op, 322 - #else 323 - /* r */ NULL, 324 - #endif 325 - /* s */ &sysrq_sync_op, 326 - /* t */ &sysrq_showstate_op, 327 - /* u */ &sysrq_mountro_op, 328 - /* v */ NULL, /* May be assigned at init time by SMP VOYAGER */ 329 - /* w */ NULL, 330 - /* x */ NULL, 331 - /* y */ NULL, 332 - /* z */ NULL 291 + 292 + static struct sysrq_key_op *sysrq_key_table[36] = { 293 + &sysrq_loglevel_op, /* 0 */ 294 + &sysrq_loglevel_op, /* 1 */ 295 + &sysrq_loglevel_op, /* 2 */ 296 + &sysrq_loglevel_op, /* 3 */ 297 + &sysrq_loglevel_op, /* 4 */ 298 + &sysrq_loglevel_op, /* 5 */ 299 + &sysrq_loglevel_op, /* 6 */ 300 + &sysrq_loglevel_op, /* 7 */ 301 + &sysrq_loglevel_op, /* 8 */ 302 + &sysrq_loglevel_op, /* 9 */ 303 + 304 + /* 305 + * Don't use for system provided sysrqs, it is handled specially on 306 + * sparc and will never arrive 307 + */ 308 + NULL, /* a */ 309 + &sysrq_reboot_op, /* b */ 310 + &sysrq_crashdump_op, /* c */ 311 + &sysrq_showlocks_op, /* d */ 312 + &sysrq_term_op, /* e */ 313 + &sysrq_moom_op, /* f */ 314 + NULL, /* g */ 315 + NULL, /* h */ 316 + &sysrq_kill_op, /* i */ 317 + NULL, /* j */ 318 + &sysrq_SAK_op, /* k */ 319 + NULL, /* l */ 320 + &sysrq_showmem_op, /* m */ 321 + &sysrq_unrt_op, /* n */ 322 + /* This will often be registered as 'Off' at init time */ 323 + NULL, /* o */ 324 + &sysrq_showregs_op, /* p */ 325 + NULL, /* q */ 326 + &sysrq_unraw_op, /* r */ 327 + &sysrq_sync_op, /* s */ 328 + &sysrq_showstate_op, /* t */ 329 + &sysrq_mountro_op, /* u */ 330 + /* May be assigned at init time by SMP VOYAGER */ 331 + NULL, /* v */ 332 + NULL, /* w */ 333 + NULL, /* x */ 334 + NULL, /* y */ 335 + NULL /* z */ 333 336 }; 334 337 335 338 /* key2index calculation, -1 on invalid index */ 336 - static int sysrq_key_table_key2index(int key) { 339 + static int sysrq_key_table_key2index(int key) 340 + { 337 341 int retval; 338 - if ((key >= '0') && (key <= '9')) { 342 + 343 + if ((key >= '0') && (key <= '9')) 339 344 retval = key - '0'; 340 - } else if ((key >= 'a') && (key <= 'z')) { 345 + else if ((key >= 'a') && (key <= 'z')) 341 346 retval = key + 10 - 'a'; 342 - } else { 347 + else 343 348 retval = -1; 344 - } 345 349 return retval; 346 350 } 347 351 348 352 /* 349 353 * get and put functions for the table, exposed to modules. 350 354 */ 351 - 352 - struct sysrq_key_op *__sysrq_get_key_op (int key) { 353 - struct sysrq_key_op *op_p; 355 + struct sysrq_key_op *__sysrq_get_key_op(int key) 356 + { 357 + struct sysrq_key_op *op_p = NULL; 354 358 int i; 355 - 359 + 356 360 i = sysrq_key_table_key2index(key); 357 - op_p = (i == -1) ? NULL : sysrq_key_table[i]; 361 + if (i != -1) 362 + op_p = sysrq_key_table[i]; 358 363 return op_p; 359 364 } 360 365 361 - static void __sysrq_put_key_op (int key, struct sysrq_key_op *op_p) { 362 - int i; 366 + static void __sysrq_put_key_op(int key, struct sysrq_key_op *op_p) 367 + { 368 + int i = sysrq_key_table_key2index(key); 363 369 364 - i = sysrq_key_table_key2index(key); 365 370 if (i != -1) 366 371 sysrq_key_table[i] = op_p; 367 372 } 368 373 369 374 /* 370 - * This is the non-locking version of handle_sysrq 371 - * It must/can only be called by sysrq key handlers, 372 - * as they are inside of the lock 375 + * This is the non-locking version of handle_sysrq. It must/can only be called 376 + * by sysrq key handlers, as they are inside of the lock 373 377 */ 374 - 375 - void __handle_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty, int check_mask) 378 + void __handle_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty, 379 + int check_mask) 376 380 { 377 381 struct sysrq_key_op *op_p; 378 382 int orig_log_level; 379 - int i, j; 383 + int i; 380 384 unsigned long flags; 381 385 382 386 spin_lock_irqsave(&sysrq_key_table_lock, flags); ··· 375 401 376 402 op_p = __sysrq_get_key_op(key); 377 403 if (op_p) { 378 - /* Should we check for enabled operations (/proc/sysrq-trigger should not) 379 - * and is the invoked operation enabled? */ 404 + /* 405 + * Should we check for enabled operations (/proc/sysrq-trigger 406 + * should not) and is the invoked operation enabled? 407 + */ 380 408 if (!check_mask || sysrq_enabled == 1 || 381 409 (sysrq_enabled & op_p->enable_mask)) { 382 - printk ("%s\n", op_p->action_msg); 410 + printk("%s\n", op_p->action_msg); 383 411 console_loglevel = orig_log_level; 384 412 op_p->handler(key, pt_regs, tty); 385 - } 386 - else 413 + } else { 387 414 printk("This sysrq operation is disabled.\n"); 415 + } 388 416 } else { 389 417 printk("HELP : "); 390 418 /* Only print the help msg once per handler */ 391 - for (i=0; i<SYSRQ_KEY_TABLE_LENGTH; i++) 392 - if (sysrq_key_table[i]) { 393 - for (j=0; sysrq_key_table[i] != sysrq_key_table[j]; j++); 394 - if (j == i) 395 - printk ("%s ", sysrq_key_table[i]->help_msg); 419 + for (i = 0; i < ARRAY_SIZE(sysrq_key_table); i++) { 420 + if (sysrq_key_table[i]) { 421 + int j; 422 + 423 + for (j = 0; sysrq_key_table[i] != 424 + sysrq_key_table[j]; j++) 425 + ; 426 + if (j != i) 427 + continue; 428 + printk("%s ", sysrq_key_table[i]->help_msg); 429 + } 396 430 } 397 - printk ("\n"); 431 + printk("\n"); 398 432 console_loglevel = orig_log_level; 399 433 } 400 434 spin_unlock_irqrestore(&sysrq_key_table_lock, flags); ··· 412 430 * This function is called by the keyboard handler when SysRq is pressed 413 431 * and any other keycode arrives. 414 432 */ 415 - 416 433 void handle_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty) 417 434 { 418 435 if (!sysrq_enabled) 419 436 return; 420 437 __handle_sysrq(key, pt_regs, tty, 1); 421 438 } 439 + EXPORT_SYMBOL(handle_sysrq); 422 440 423 441 static int __sysrq_swap_key_ops(int key, struct sysrq_key_op *insert_op_p, 424 - struct sysrq_key_op *remove_op_p) { 442 + struct sysrq_key_op *remove_op_p) 443 + { 425 444 426 445 int retval; 427 446 unsigned long flags; ··· 435 452 retval = -1; 436 453 } 437 454 spin_unlock_irqrestore(&sysrq_key_table_lock, flags); 438 - 439 455 return retval; 440 456 } 441 457 ··· 442 460 { 443 461 return __sysrq_swap_key_ops(key, op_p, NULL); 444 462 } 463 + EXPORT_SYMBOL(register_sysrq_key); 445 464 446 465 int unregister_sysrq_key(int key, struct sysrq_key_op *op_p) 447 466 { 448 467 return __sysrq_swap_key_ops(key, NULL, op_p); 449 468 } 450 - 451 - EXPORT_SYMBOL(handle_sysrq); 452 - EXPORT_SYMBOL(register_sysrq_key); 453 469 EXPORT_SYMBOL(unregister_sysrq_key);