summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-11-14 19:30:09 +0000
committerrwatson <rwatson@FreeBSD.org>2005-11-14 19:30:09 +0000
commit2fab30d9d42916e9deff21a0dea1aed5d93a686a (patch)
treef16aea17c9b8f1f3155322f0f45a5b0bfef66da5 /sys
parent44bf2fbfc7e01cbf02afac7f627c3cd5a932a19e (diff)
downloadFreeBSD-src-2fab30d9d42916e9deff21a0dea1aed5d93a686a.zip
FreeBSD-src-2fab30d9d42916e9deff21a0dea1aed5d93a686a.tar.gz
In ktr_getrequest(), acquire ktrace_mtx earlier -- while the race
currently present is minor and offers no real semantic issues, it also doesn't make sense since an earlier lockless check has already occurred. Also hold the mutex longer, over a manipulation of per-process ktrace state, which requires synchronization. MFC after: 1 month Pointed out by: jhb
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_ktrace.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 73a2439..aadd611 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -261,20 +261,21 @@ ktr_getrequest(int type)
int pm;
ktrace_enter(td); /* XXX: In caller instead? */
+ mtx_lock(&ktrace_mtx);
if (!KTRCHECK(td, type)) {
+ mtx_unlock(&ktrace_mtx);
ktrace_exit(td);
return (NULL);
}
- mtx_lock(&ktrace_mtx);
req = STAILQ_FIRST(&ktr_free);
if (req != NULL) {
STAILQ_REMOVE_HEAD(&ktr_free, ktr_list);
- mtx_unlock(&ktrace_mtx);
req->ktr_header.ktr_type = type;
if (p->p_traceflag & KTRFAC_DROP) {
req->ktr_header.ktr_type |= KTR_DROP;
p->p_traceflag &= ~KTRFAC_DROP;
}
+ mtx_unlock(&ktrace_mtx);
microtime(&req->ktr_header.ktr_time);
req->ktr_header.ktr_pid = p->p_pid;
req->ktr_header.ktr_tid = td->td_tid;
OpenPOWER on IntegriCloud