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

new helper: signal_delivered()

Does block_sigmask() + tracehook_signal_handler(); called when
sigframe has been successfully built. All architectures converted
to it; block_sigmask() itself is gone now (merged into this one).

I'm still not too happy with the signature, but that's a separate
story (IMO we need a structure that would contain signal number +
siginfo + k_sigaction, so that get_signal_to_deliver() would fill one,
signal_delivered(), handle_signal() and probably setup...frame() -
take one).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro efee984c 17440f17

+47 -83
+1 -1
arch/alpha/kernel/signal.c
··· 478 478 force_sigsegv(sig, current); 479 479 return; 480 480 } 481 - block_sigmask(ka, sig); 481 + signal_delivered(sig, info, ka, regs, 0); 482 482 } 483 483 484 484 static inline void
+1 -6
arch/arm/kernel/signal.c
··· 557 557 force_sigsegv(sig, tsk); 558 558 return; 559 559 } 560 - 561 - /* 562 - * Block the signal if we were successful. 563 - */ 564 - block_sigmask(ka, sig); 565 - tracehook_signal_handler(sig, info, ka, regs, 0); 560 + signal_delivered(sig, info, ka, regs, 0); 566 561 } 567 562 568 563 /*
+1 -1
arch/avr32/kernel/signal.c
··· 241 241 if (ret != 0) 242 242 force_sigsegv(sig, current); 243 243 else 244 - block_sigmask(ka, sig); 244 + signal_delivered(sig, info, ka, regs, 0); 245 245 } 246 246 247 247 /*
+1 -2
arch/blackfin/kernel/signal.c
··· 260 260 if (ret) 261 261 return; 262 262 263 - block_sigmask(ka, sig); 264 - tracehook_signal_handler(sig, info, ka, regs, 263 + signal_delivered(sig, info, ka, regs, 265 264 test_thread_flag(TIF_SINGLESTEP)); 266 265 } 267 266
+1 -2
arch/c6x/kernel/signal.c
··· 276 276 /* Set up the stack frame */ 277 277 if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0) 278 278 return; 279 - block_sigmask(ka, sig); 280 - tracehook_signal_handler(sig, info, ka, regs, 0); 279 + signal_delivered(sig, info, ka, regs, 0); 281 280 } 282 281 283 282 /*
+1 -1
arch/cris/arch-v10/kernel/signal.c
··· 453 453 ret = setup_frame(sig, ka, oldset, regs); 454 454 455 455 if (ret == 0) 456 - block_sigmask(ka, sig); 456 + signal_delivered(sig, info, ka, regs, 0); 457 457 } 458 458 459 459 /*
+1 -1
arch/cris/arch-v32/kernel/signal.c
··· 485 485 ret = setup_frame(sig, ka, oldset, regs); 486 486 487 487 if (ret == 0) 488 - block_sigmask(ka, sig); 488 + signal_delivered(sig, info, ka, regs, 0); 489 489 } 490 490 491 491 /*
+1 -2
arch/frv/kernel/signal.c
··· 460 460 if (ret) 461 461 return; 462 462 463 - block_sigmask(ka, sig); 464 - tracehook_signal_handler(sig, info, ka, __frame, 463 + signal_delivered(sig, info, ka, __frame, 465 464 test_thread_flag(TIF_SINGLESTEP)); 466 465 } /* end handle_signal() */ 467 466
+1 -1
arch/h8300/kernel/signal.c
··· 439 439 ret = setup_frame(sig, ka, oldset, regs); 440 440 441 441 if (!ret) 442 - block_sigmask(ka, sig); 442 + signal_delivered(sig, info, ka, regs, 0); 443 443 } 444 444 445 445 /*
+1 -2
arch/hexagon/kernel/signal.c
··· 186 186 if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0) 187 187 return; 188 188 189 - block_sigmask(ka, sig); 190 - tracehook_signal_handler(sig, info, ka, regs, 189 + signal_delivered(sig, info, ka, regs, 191 190 test_thread_flag(TIF_SINGLESTEP)); 192 191 } 193 192
+1 -6
arch/ia64/kernel/signal.c
··· 419 419 if (!setup_frame(sig, ka, info, sigmask_to_save(), scr)) 420 420 return 0; 421 421 422 - block_sigmask(ka, sig); 423 - 424 - /* 425 - * Let tracing know that we've done the handler setup. 426 - */ 427 - tracehook_signal_handler(sig, info, ka, &scr->pt, 422 + signal_delivered(sig, info, ka, &scr->pt, 428 423 test_thread_flag(TIF_SINGLESTEP)); 429 424 430 425 return 1;
+1 -1
arch/m32r/kernel/signal.c
··· 294 294 if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs)) 295 295 return; 296 296 297 - block_sigmask(ka, sig); 297 + signal_delivered(sig, info, ka, regs, 0); 298 298 } 299 299 300 300 /*
+1 -1
arch/m68k/kernel/signal.c
··· 1137 1137 if (err) 1138 1138 return; 1139 1139 1140 - block_sigmask(ka, sig); 1140 + signal_delivered(sig, info, ka, regs, 0); 1141 1141 1142 1142 if (test_thread_flag(TIF_DELAYED_TRACE)) { 1143 1143 regs->sr &= ~0x8000;
+1 -1
arch/microblaze/kernel/signal.c
··· 323 323 if (ret) 324 324 return; 325 325 326 - block_sigmask(ka, sig); 326 + signal_delivered(sig, info, ka, regs, 0); 327 327 } 328 328 329 329 /*
+1 -1
arch/mips/kernel/signal.c
··· 551 551 if (ret) 552 552 return; 553 553 554 - block_sigmask(ka, sig); 554 + signal_delivered(sig, info, ka, regs, 0); 555 555 } 556 556 557 557 static void do_signal(struct pt_regs *regs)
+1 -2
arch/mn10300/kernel/signal.c
··· 461 461 if (ret) 462 462 return; 463 463 464 - block_sigmask(ka, sig); 465 - tracehook_signal_handler(sig, info, ka, regs, 464 + signal_delivered(sig, info, ka, regs, 466 465 test_thread_flag(TIF_SINGLESTEP)); 467 466 } 468 467
+1 -2
arch/openrisc/kernel/signal.c
··· 259 259 if (ret) 260 260 return; 261 261 262 - block_sigmask(ka, sig); 263 - tracehook_signal_handler(sig, info, ka, regs, 262 + signal_delivered(sig, info, ka, regs, 264 263 test_thread_flag(TIF_SINGLESTEP)); 265 264 } 266 265
+1 -3
arch/parisc/kernel/signal.c
··· 449 449 if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall)) 450 450 return 0; 451 451 452 - block_sigmask(ka, sig); 453 - 454 - tracehook_signal_handler(sig, info, ka, regs, 452 + signal_delivered(sig, info, ka, regs, 455 453 test_thread_flag(TIF_SINGLESTEP) || 456 454 test_thread_flag(TIF_BLOCKSTEP)); 457 455
+1 -5
arch/powerpc/kernel/signal.c
··· 148 148 149 149 regs->trap = 0; 150 150 if (ret) { 151 - block_sigmask(&ka, signr); 152 - /* 153 - * Let tracing know that we've done the handler setup. 154 - */ 155 - tracehook_signal_handler(signr, &info, &ka, regs, 151 + signal_delivered(signr, &info, &ka, regs, 156 152 test_thread_flag(TIF_SINGLESTEP)); 157 153 } 158 154
+1 -5
arch/s390/kernel/compat_signal.c
··· 580 580 ret = setup_frame32(sig, ka, oldset, regs); 581 581 if (ret) 582 582 return; 583 - block_sigmask(ka, sig); 584 - /* 585 - * Let tracing know that we've done the handler setup. 586 - */ 587 - tracehook_signal_handler(sig, info, ka, regs, 583 + signal_delivered(sig, info, ka, regs, 588 584 test_thread_flag(TIF_SINGLE_STEP)); 589 585 } 590 586
+1 -5
arch/s390/kernel/signal.c
··· 375 375 ret = setup_frame(sig, ka, oldset, regs); 376 376 if (ret) 377 377 return; 378 - block_sigmask(ka, sig); 379 - /* 380 - * Let tracing know that we've done the handler setup. 381 - */ 382 - tracehook_signal_handler(sig, info, ka, regs, 378 + signal_delivered(sig, info, ka, regs, 383 379 test_thread_flag(TIF_SINGLE_STEP)); 384 380 } 385 381
+1 -1
arch/score/kernel/signal.c
··· 267 267 if (setup_rt_frame(ka, regs, sig, sigmask_to_save(), info) < 0) 268 268 return; 269 269 270 - block_sigmask(ka, sig); 270 + signal_delivered(sig, info, ka, regs, 0); 271 271 } 272 272 273 273 static void do_signal(struct pt_regs *regs)
+1 -2
arch/sh/kernel/signal_32.c
··· 533 533 534 534 if (ret) 535 535 return; 536 - block_sigmask(ka, sig); 537 - tracehook_signal_handler(sig, info, ka, regs, 536 + signal_delivered(sig, info, ka, regs, 538 537 test_thread_flag(TIF_SINGLESTEP)); 539 538 } 540 539
+1 -2
arch/sh/kernel/signal_64.c
··· 650 650 if (ret) 651 651 return; 652 652 653 - block_sigmask(ka, sig); 654 - tracehook_signal_handler(sig, info, ka, regs, 653 + signal_delivered(sig, info, ka, regs, 655 654 test_thread_flag(TIF_SINGLESTEP)); 656 655 } 657 656
+1 -2
arch/sparc/kernel/signal32.c
··· 785 785 if (err) 786 786 return; 787 787 788 - block_sigmask(ka, signr); 789 - tracehook_signal_handler(signr, info, ka, regs, 0); 788 + signal_delivered(signr, info, ka, regs, 0); 790 789 } 791 790 792 791 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
+1 -2
arch/sparc/kernel/signal_32.c
··· 460 460 if (err) 461 461 return; 462 462 463 - block_sigmask(ka, signr); 464 - tracehook_signal_handler(signr, info, ka, regs, 0); 463 + signal_delivered(signr, info, ka, regs, 0); 465 464 } 466 465 467 466 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
+1 -2
arch/sparc/kernel/signal_64.c
··· 473 473 if (err) 474 474 return; 475 475 476 - block_sigmask(ka, signr); 477 - tracehook_signal_handler(signr, info, ka, regs, 0); 476 + signal_delivered(signr, info, ka, regs, 0); 478 477 } 479 478 480 479 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
+1 -1
arch/tile/kernel/signal.c
··· 278 278 ret = setup_rt_frame(sig, ka, info, oldset, regs); 279 279 if (ret) 280 280 return; 281 - block_sigmask(ka, sig); 281 + signal_delivered(sig, info, ka, regs, 0); 282 282 } 283 283 284 284 /*
+1 -1
arch/um/kernel/signal.c
··· 61 61 if (err) 62 62 force_sigsegv(signr, current); 63 63 else 64 - block_sigmask(ka, signr); 64 + signal_delivered(signr, info, ka, regs, 0); 65 65 } 66 66 67 67 static int kern_do_signal(struct pt_regs *regs)
+1 -4
arch/unicore32/kernel/signal.c
··· 362 362 return; 363 363 } 364 364 365 - /* 366 - * Block the signal if we were successful. 367 - */ 368 - block_sigmask(ka, sig); 365 + signal_delivered(sig, info, ka, regs, 0); 369 366 } 370 367 371 368 /*
+2 -4
arch/x86/kernel/signal.c
··· 715 715 */ 716 716 regs->flags &= ~X86_EFLAGS_TF; 717 717 718 - block_sigmask(ka, sig); 719 - 720 - tracehook_signal_handler(sig, info, ka, regs, 721 - test_thread_flag(TIF_SINGLESTEP)); 718 + signal_delivered(sig, info, ka, regs, 719 + test_thread_flag(TIF_SINGLESTEP)); 722 720 } 723 721 724 722 #ifdef CONFIG_X86_32
+1 -1
arch/xtensa/kernel/signal.c
··· 493 493 if (ret) 494 494 return; 495 495 496 - block_sigmask(&ka, signr); 496 + signal_delivered(signr, info, ka, regs, 0); 497 497 if (current->ptrace & PT_SINGLESTEP) 498 498 task_pt_regs(current)->icountlevel = 1; 499 499
+1 -1
include/linux/signal.h
··· 256 256 extern int sigsuspend(sigset_t *); 257 257 258 258 extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); 259 - extern void block_sigmask(struct k_sigaction *ka, int signr); 259 + extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping); 260 260 extern void exit_signals(struct task_struct *tsk); 261 261 262 262 extern struct kmem_cache *sighand_cachep;
+13 -9
kernel/signal.c
··· 2368 2368 } 2369 2369 2370 2370 /** 2371 - * block_sigmask - add @ka's signal mask to current->blocked 2372 - * @ka: action for @signr 2373 - * @signr: signal that has been successfully delivered 2371 + * signal_delivered - 2372 + * @sig: number of signal being delivered 2373 + * @info: siginfo_t of signal being delivered 2374 + * @ka: sigaction setting that chose the handler 2375 + * @regs: user register state 2376 + * @stepping: nonzero if debugger single-step or block-step in use 2374 2377 * 2375 2378 * This function should be called when a signal has succesfully been 2376 - * delivered. It adds the mask of signals for @ka to current->blocked 2377 - * so that they are blocked during the execution of the signal 2378 - * handler. In addition, @signr will be blocked unless %SA_NODEFER is 2379 - * set in @ka->sa.sa_flags. 2379 + * delivered. It updates the blocked signals accordingly (@ka->sa.sa_mask 2380 + * is always blocked, and the signal itself is blocked unless %SA_NODEFER 2381 + * is set in @ka->sa.sa_flags. Tracing is notified. 2380 2382 */ 2381 - void block_sigmask(struct k_sigaction *ka, int signr) 2383 + void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, 2384 + struct pt_regs *regs, int stepping) 2382 2385 { 2383 2386 sigset_t blocked; 2384 2387 ··· 2393 2390 2394 2391 sigorsets(&blocked, &current->blocked, &ka->sa.sa_mask); 2395 2392 if (!(ka->sa.sa_flags & SA_NODEFER)) 2396 - sigaddset(&blocked, signr); 2393 + sigaddset(&blocked, sig); 2397 2394 set_current_blocked(&blocked); 2395 + tracehook_signal_handler(sig, info, ka, regs, stepping); 2398 2396 } 2399 2397 2400 2398 /*