Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F146405297
D54816.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D54816.diff
View Options
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -869,8 +869,8 @@
ktrace_exit(td);
}
-void
-ktrcsw(int out, int user, const char *wmesg)
+static void
+ktrcsw_impl(int out, int user, const char *wmesg, const struct timespec *tv)
{
struct thread *td = curthread;
struct ktr_request *req;
@@ -885,6 +885,8 @@
kc = &req->ktr_data.ktr_csw;
kc->out = out;
kc->user = user;
+ if (tv != NULL)
+ req->ktr_header.ktr_time = *tv;
if (wmesg != NULL)
strlcpy(kc->wmesg, wmesg, sizeof(kc->wmesg));
else
@@ -893,6 +895,18 @@
ktrace_exit(td);
}
+void
+ktrcsw(int out, int user, const char *wmesg)
+{
+ ktrcsw_impl(out, user, wmesg, NULL);
+}
+
+void
+ktrcsw_out(const struct timespec *tv, const char *wmesg)
+{
+ ktrcsw_impl(1, 0, wmesg, tv);
+}
+
void
ktrstruct(const char *name, const void *data, size_t datalen)
{
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -133,6 +133,7 @@
{
struct thread *td __ktrace_used;
struct lock_class *class;
+ struct timespec sw_out_tv __ktrace_used;
uintptr_t lock_state;
int catch, pri, rval, sleepq_flags;
WITNESS_SAVE_DECL(lock_witness);
@@ -141,7 +142,7 @@
td = curthread;
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
- ktrcsw(1, 0, wmesg);
+ nanotime(&sw_out_tv);
#endif
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Sleeping on \"%s\"", wmesg);
@@ -222,8 +223,10 @@
rval = 0;
}
#ifdef KTRACE
- if (KTRPOINT(td, KTR_CSW))
+ if (KTRPOINT(td, KTR_CSW)) {
+ ktrcsw_out(&sw_out_tv, wmesg);
ktrcsw(0, 0, wmesg);
+ }
#endif
PICKUP_GIANT();
if (lock != NULL && lock != &Giant.lock_object && !(priority & PDROP)) {
@@ -239,6 +242,7 @@
sbintime_t sbt, sbintime_t pr, int flags)
{
struct thread *td __ktrace_used;
+ struct timespec sw_out_tv __ktrace_used;
int rval;
WITNESS_SAVE_DECL(mtx);
@@ -266,19 +270,9 @@
if (sbt != 0)
sleepq_set_timeout_sbt(ident, sbt, pr, flags);
- /*
- * Can't call ktrace with any spin locks held so it can lock the
- * ktrace_mtx lock, and WITNESS_WARN considers it an error to hold
- * any spin lock. Thus, we have to drop the sleepq spin lock while
- * we handle those requests. This is safe since we have placed our
- * thread on the sleep queue already.
- */
#ifdef KTRACE
- if (KTRPOINT(td, KTR_CSW)) {
- sleepq_release(ident);
- ktrcsw(1, 0, wmesg);
- sleepq_lock(ident);
- }
+ if (KTRPOINT(td, KTR_CSW))
+ nanotime(&sw_out_tv);
#endif
#ifdef WITNESS
sleepq_release(ident);
@@ -293,8 +287,10 @@
rval = 0;
}
#ifdef KTRACE
- if (KTRPOINT(td, KTR_CSW))
+ if (KTRPOINT(td, KTR_CSW)) {
+ ktrcsw_out(&sw_out_tv, wmesg);
ktrcsw(0, 0, wmesg);
+ }
#endif
PICKUP_GIANT();
mtx_lock_spin(mtx);
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -340,6 +340,7 @@
void ktr_io_params_free(struct ktr_io_params *);
void ktrnamei(const char *);
void ktrcsw(int, int, const char *);
+void ktrcsw_out(const struct timespec *, const char *);
void ktrpsig(int, sig_t, sigset_t *, int);
void ktrfault(vm_offset_t, int);
void ktrfaultend(int);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 3, 10:49 AM (13 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29195399
Default Alt Text
D54816.diff (3 KB)
Attached To
Mode
D54816: ktrcsw(): should not be called when the thread is owning interlock or on sleepq
Attached
Detach File
Event Timeline
Log In to Comment