diff options
| -rw-r--r-- | sys/kern/subr_prof.c | 3 | ||||
| -rw-r--r-- | sys/kern/subr_trap.c | 19 |
2 files changed, 13 insertions, 9 deletions
diff --git a/sys/kern/subr_prof.c b/sys/kern/subr_prof.c index 88086515762b..a5dc71b9f789 100644 --- a/sys/kern/subr_prof.c +++ b/sys/kern/subr_prof.c @@ -513,8 +513,7 @@ addupc_task(ke, pc, ticks) register u_int i; u_short v; - /* Testing PS_PROFIL may be unnecessary, but is certainly safe. */ - if ((p->p_sflag & PS_PROFIL) == 0 || ticks == 0) + if (ticks == 0) return; prof = &p->p_stats->p_prof; diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index 6f17f8fcee3c..b74ac04571e2 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -102,16 +102,20 @@ userret(td, frame, oticks) postsig(sig); mtx_unlock(&Giant); PROC_UNLOCK(p); - } else - mtx_unlock_spin(&sched_lock); + mtx_lock_spin(&sched_lock); + } /* * Charge system time if profiling. */ if (p->p_sflag & PS_PROFIL) { - addupc_task(ke, TRAPF_PC(frame), - (u_int)(ke->ke_sticks - oticks) * psratio); - } + quad_t ticks; + + ticks = ke->ke_sticks - oticks; + mtx_unlock_spin(&sched_lock); + addupc_task(ke, TRAPF_PC(frame), (u_int)ticks * psratio); + } else + mtx_unlock_spin(&sched_lock); } /* @@ -141,6 +145,7 @@ ast(framep) panic("Returning to user mode with mutex(s) held"); #endif mtx_assert(&Giant, MA_NOTOWNED); + prticks = 0; /* XXX: Quiet warning. */ s = cpu_critical_enter(); while ((ke->ke_flags & (KEF_ASTPENDING | KEF_NEEDRESCHED)) != 0) { cpu_critical_exit(s); @@ -159,7 +164,7 @@ ast(framep) p->p_sflag &= ~(PS_PROFPEND | PS_ALRMPEND); ke->ke_flags &= ~(KEF_OWEUPC | KEF_ASTPENDING); cnt.v_soft++; - if (flags & KEF_OWEUPC) { + if (flags & KEF_OWEUPC && sflag & PS_PROFIL) { prticks = p->p_stats->p_prof.pr_ticks; p->p_stats->p_prof.pr_ticks = 0; } @@ -167,7 +172,7 @@ ast(framep) PROC_LOCK(p); td->td_ucred = crhold(p->p_ucred); PROC_UNLOCK(p); - if (flags & KEF_OWEUPC) + if (flags & KEF_OWEUPC && sflag & PS_PROFIL) addupc_task(ke, p->p_stats->p_prof.pr_addr, prticks); if (sflag & PS_ALRMPEND) { PROC_LOCK(p); |
