summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_trap.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-04-17 22:33:04 +0000
committerjhb <jhb@FreeBSD.org>2003-04-17 22:33:04 +0000
commitbffa90cc0a4dd341d11ac29d08b1909b885acd56 (patch)
tree2e5d14014c4aa8eef3df5828a70b42a93177662f /sys/kern/subr_trap.c
parent5023bfe74ab0f1c4a8184590599c771de3606663 (diff)
downloadFreeBSD-src-bffa90cc0a4dd341d11ac29d08b1909b885acd56.zip
FreeBSD-src-bffa90cc0a4dd341d11ac29d08b1909b885acd56.tar.gz
Tweak locking in the PS_XCPU handler to hold the sched_lock while reading
p_runtime.
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r--sys/kern/subr_trap.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index 9cc7dbe..74d8fd6 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -222,14 +222,15 @@ ast(struct trapframe *framep)
if (sflag & PS_XCPU) {
PROC_LOCK(p);
rlim = &p->p_rlimit[RLIMIT_CPU];
- if (p->p_runtime.sec >= rlim->rlim_max)
+ mtx_lock_spin(&sched_lock);
+ if (p->p_runtime.sec >= rlim->rlim_max) {
+ mtx_unlock_spin(&sched_lock);
killproc(p, "exceeded maximum CPU limit");
- else {
- psignal(p, SIGXCPU);
- mtx_lock_spin(&sched_lock);
+ } else {
if (p->p_cpulimit < rlim->rlim_max)
p->p_cpulimit += 5;
mtx_unlock_spin(&sched_lock);
+ psignal(p, SIGXCPU);
}
PROC_UNLOCK(p);
}
OpenPOWER on IntegriCloud