svn commit: r318243 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Fri May 12 15:35:01 UTC 2017
Author: kib
Date: Fri May 12 15:34:59 2017
New Revision: 318243
URL: https://svnweb.freebsd.org/changeset/base/318243
Log:
Do not wake up sleeping thread in reschedule_signals() if the signal
is blocked. The spurious wakeup might result in spurious EINTR.
The reschedule_signals() function is called when the calling thread
has the signal mask changed. For each newly blocked signal, we try to
find a thread which might have the signal not blocked. If no such
thread exists, sigtd() returns random thread, which must not be waken
up. I decided that re-checking, as suggested by PR submitter, is more
reasonable change than to change sigtd() interface, due to other uses
of sigtd(). signotify() already performs this check.
Submitted by: Duane <parakleta at darkreality.org>
PR: 219228
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/sys/kern/kern_sig.c
Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c Fri May 12 15:20:12 2017 (r318242)
+++ head/sys/kern/kern_sig.c Fri May 12 15:34:59 2017 (r318243)
@@ -2646,7 +2646,9 @@ reschedule_signals(struct proc *p, sigse
signotify(td);
if (!(flags & SIGPROCMASK_PS_LOCKED))
mtx_lock(&ps->ps_mtx);
- if (p->p_flag & P_TRACED || SIGISMEMBER(ps->ps_sigcatch, sig))
+ if (p->p_flag & P_TRACED ||
+ (SIGISMEMBER(ps->ps_sigcatch, sig) &&
+ !SIGISMEMBER(td->td_sigmask, sig)))
tdsigwakeup(td, sig, SIG_CATCH,
(SIGISMEMBER(ps->ps_sigintr, sig) ? EINTR :
ERESTART));
More information about the svn-src-head
mailing list