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 <parakl...@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));
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to