svn commit: r274343 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Mon Nov 10 14:11:18 UTC 2014
Author: kib
Date: Mon Nov 10 14:11:17 2014
New Revision: 274343
URL: https://svnweb.freebsd.org/changeset/base/274343
Log:
When sleeping waiting for the profiling stop, always set P_STOPPROF
before dropping process lock. Clear P_STOPPROF when doing wakeup.
Both issues caused thread to hang in stopprofclock() "stopprof" sleep.
Reported and tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/sys/kern/kern_clock.c
head/sys/kern/subr_prof.c
Modified: head/sys/kern/kern_clock.c
==============================================================================
--- head/sys/kern/kern_clock.c Mon Nov 10 10:59:08 2014 (r274342)
+++ head/sys/kern/kern_clock.c Mon Nov 10 14:11:17 2014 (r274343)
@@ -668,11 +668,11 @@ stopprofclock(p)
PROC_LOCK_ASSERT(p, MA_OWNED);
if (p->p_flag & P_PROFIL) {
if (p->p_profthreads != 0) {
- p->p_flag |= P_STOPPROF;
- while (p->p_profthreads != 0)
+ while (p->p_profthreads != 0) {
+ p->p_flag |= P_STOPPROF;
msleep(&p->p_profthreads, &p->p_mtx, PPAUSE,
"stopprof", 0);
- p->p_flag &= ~P_STOPPROF;
+ }
}
if ((p->p_flag & P_PROFIL) == 0)
return;
Modified: head/sys/kern/subr_prof.c
==============================================================================
--- head/sys/kern/subr_prof.c Mon Nov 10 10:59:08 2014 (r274342)
+++ head/sys/kern/subr_prof.c Mon Nov 10 14:11:17 2014 (r274343)
@@ -533,6 +533,7 @@ out:
if (--p->p_profthreads == 0) {
if (p->p_flag & P_STOPPROF) {
wakeup(&p->p_profthreads);
+ p->p_flag &= ~P_STOPPROF;
stop = 0;
}
}
More information about the svn-src-all
mailing list