If thread requested to not stop on non-boundary, then not only

stopping signals should obey, but also all forms of single-threading.
Otherwise, thread might sleep interruptible while owning some
resources, and single-threading thread could try to access them.
An example is owning vnode lock while dumping core.

Submitted by:	Conrad Meyer
Review:	https://reviews.freebsd.org/D2612
Tested by:	pho
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2015-05-23 19:09:04 +00:00
parent 940be86497
commit 3077f938b4

View File

@ -868,12 +868,9 @@ thread_suspend_check(int return_instead)
return (ERESTART);
/*
* Ignore suspend requests for stop signals if they
* are deferred.
* Ignore suspend requests if they are deferred.
*/
if ((P_SHOULDSTOP(p) == P_STOPPED_SIG ||
(p->p_flag & P_TOTAL_STOP) != 0) &&
(td->td_flags & TDF_SBDRY) != 0) {
if ((td->td_flags & TDF_SBDRY) != 0) {
KASSERT(return_instead,
("TDF_SBDRY set for unsafe thread_suspend_check"));
return (0);