Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 May 2017 15:35:00 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r318243 - head/sys/kern
Message-ID:  <201705121535.v4CFZ0eL094172@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201705121535.v4CFZ0eL094172>