diff options
author | rwatson <rwatson@FreeBSD.org> | 2005-11-14 19:30:09 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2005-11-14 19:30:09 +0000 |
commit | 2fab30d9d42916e9deff21a0dea1aed5d93a686a (patch) | |
tree | f16aea17c9b8f1f3155322f0f45a5b0bfef66da5 | |
parent | 44bf2fbfc7e01cbf02afac7f627c3cd5a932a19e (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/kern/kern_ktrace.c | 5 |
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; |