summaryrefslogtreecommitdiff
path: root/sys/kern/subr_trap.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2001-12-18 09:06:10 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2001-12-18 09:06:10 +0000
commit48fd1f38eea08a768797b4f60da50acfebe1abe2 (patch)
tree3f813024556280e8358079cdcdd3b633aa6e3e95 /sys/kern/subr_trap.c
parent3f9a462fb91c4f75b6163133abf9f91f75f039d9 (diff)
Notes
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r--sys/kern/subr_trap.c19
1 files changed, 12 insertions, 7 deletions
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);