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
This commit is contained in:
Konstantin Belousov 2014-11-10 14:11:17 +00:00
parent 45d1880a36
commit 0436fcb809
2 changed files with 4 additions and 3 deletions

View File

@ -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;

View File

@ -533,6 +533,7 @@ addupc_task(struct thread *td, uintfptr_t pc, u_int ticks)
if (--p->p_profthreads == 0) {
if (p->p_flag & P_STOPPROF) {
wakeup(&p->p_profthreads);
p->p_flag &= ~P_STOPPROF;
stop = 0;
}
}