The patch titled signal: sigprocmask() should do retarget_shared_pending() has been removed from the -mm tree. Its filename was signal-sigprocmask-should-do-retarget_shared_pending.patch This patch was dropped because an updated version will be merged The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: signal: sigprocmask() should do retarget_shared_pending() From: Oleg Nesterov <oleg@xxxxxxxxxx> In short, almost every changing of current->blocked is wrong, or at least can lead to the unexpected results. For example. Two threads T1 and T2, T1 sleeps in sigtimedwait/pause/etc. kill(tgid, SIG) can pick T2 for TIF_SIGPENDING. If T2 calls sigprocmask() and blocks SIG before it notices the pending signal, nobody else can handle this pending shared signal. I am not sure this is bug, but at least this looks strange imho. T1 should not sleep forever, there is a signal which should wake it up. This patch changes sigprocmask() to call retarget_shared_pending() as exit_signals() does. To calculate the "blocked" argument we add the new helper, signorsets(), although we could do ~(newset & ~current->blocked) instead. According to grep, nobody in arch/ defines __HAVE_ARCH_SIG_SETOPS, we only need to change linux/signal.h. Note: for this particular case we could simply change sigprocmask() to return -EINTR if signal_pending(), but then we should change other callers and, more importantly, if we need this fix then sigprocmask() will have more callers and some of them can't restart. See the next patch as a random example. Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: Tejun Heo <tj@xxxxxxxxxx> Cc: "Nikita V. Youshchenko" <nyoushchenko@xxxxxxxxxx> Cc: Matt Fleming <matt@xxxxxxxxxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/signal.h | 4 ++++ kernel/signal.c | 5 +++++ 2 files changed, 9 insertions(+) diff -puN include/linux/signal.h~signal-sigprocmask-should-do-retarget_shared_pending include/linux/signal.h --- a/include/linux/signal.h~signal-sigprocmask-should-do-retarget_shared_pending +++ a/include/linux/signal.h @@ -126,10 +126,14 @@ _SIG_SET_BINOP(sigandsets, _sig_and) #define _sig_nand(x,y) ((x) & ~(y)) _SIG_SET_BINOP(signandsets, _sig_nand) +#define _sig_nor(x,y) ((x) | ~(y)) +_SIG_SET_BINOP(signorsets, _sig_nor) + #undef _SIG_SET_BINOP #undef _sig_or #undef _sig_and #undef _sig_nand +#undef _sig_nor #define _SIG_SET_OP(name, op) \ static inline void name(sigset_t *set) \ diff -puN kernel/signal.c~signal-sigprocmask-should-do-retarget_shared_pending kernel/signal.c --- a/kernel/signal.c~signal-sigprocmask-should-do-retarget_shared_pending +++ a/kernel/signal.c @@ -2314,6 +2314,11 @@ int sigprocmask(int how, sigset_t *set, } spin_lock_irq(&tsk->sighand->siglock); + if (signal_pending(tsk) && !thread_group_empty(tsk)) { + sigset_t not_newblocked; + signorsets(¬_newblocked, ¤t->blocked, &newset); + retarget_shared_pending(tsk, ¬_newblocked); + } tsk->blocked = newset; recalc_sigpending(); spin_unlock_irq(&tsk->sighand->siglock); _ Patches currently in -mm which might be from oleg@xxxxxxxxxx are linux-next.patch cgroups-read-write-lock-clone_thread-forking-per-threadgroup.patch cgroups-add-per-thread-subsystem-callbacks.patch cgroups-make-procs-file-writable.patch cgroups-use-flex_array-in-attach_proc.patch asm-generic-ptraceh-start-a-common-low-level-ptrace-helper.patch blackfin-convert-to-asm-generic-ptraceh.patch x86-convert-to-asm-generic-ptraceh.patch sh-convert-to-asm-generic-ptraceh.patch kgdbts-unify-generalize-gdb-breakpoint-adjustment.patch x86-signal-handle_signal-should-use-sigprocmask.patch x86-signal-sys_rt_sigreturn-should-use-sigprocmask.patch fs-execc-provide-the-correct-process-pid-to-the-pipe-helper.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html