Include the associated wait channel message for context switch ktrace
records. kdump supports both the old and new messages. Submitted by: Andrey Zonov andrey zonov org MFC after: 1 week
This commit is contained in:
parent
e7babf043f
commit
88bf5036fc
@ -103,7 +103,7 @@ _cv_wait(struct cv *cvp, struct lock_object *lock)
|
||||
lock_state = 0;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
CV_ASSERT(cvp, lock, td);
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
@ -140,7 +140,7 @@ _cv_wait(struct cv *cvp, struct lock_object *lock)
|
||||
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
if (lock != &Giant.lock_object) {
|
||||
@ -162,7 +162,7 @@ _cv_wait_unlock(struct cv *cvp, struct lock_object *lock)
|
||||
td = curthread;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
CV_ASSERT(cvp, lock, td);
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
@ -197,7 +197,7 @@ _cv_wait_unlock(struct cv *cvp, struct lock_object *lock)
|
||||
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
}
|
||||
@ -220,7 +220,7 @@ _cv_wait_sig(struct cv *cvp, struct lock_object *lock)
|
||||
lock_state = 0;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
CV_ASSERT(cvp, lock, td);
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
@ -258,7 +258,7 @@ _cv_wait_sig(struct cv *cvp, struct lock_object *lock)
|
||||
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
if (lock != &Giant.lock_object) {
|
||||
@ -286,7 +286,7 @@ _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo)
|
||||
lock_state = 0;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
CV_ASSERT(cvp, lock, td);
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
@ -324,7 +324,7 @@ _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo)
|
||||
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
if (lock != &Giant.lock_object) {
|
||||
@ -353,7 +353,7 @@ _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, int timo)
|
||||
lock_state = 0;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
CV_ASSERT(cvp, lock, td);
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
@ -392,7 +392,7 @@ _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, int timo)
|
||||
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, cv_wmesg(cvp));
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
if (lock != &Giant.lock_object) {
|
||||
|
@ -733,8 +733,9 @@ ktrpsig(sig, action, mask, code)
|
||||
}
|
||||
|
||||
void
|
||||
ktrcsw(out, user)
|
||||
ktrcsw(out, user, wmesg)
|
||||
int out, user;
|
||||
const char *wmesg;
|
||||
{
|
||||
struct thread *td = curthread;
|
||||
struct ktr_request *req;
|
||||
@ -746,6 +747,10 @@ ktrcsw(out, user)
|
||||
kc = &req->ktr_data.ktr_csw;
|
||||
kc->out = out;
|
||||
kc->user = user;
|
||||
if (wmesg != NULL)
|
||||
strlcpy(kc->wmesg, wmesg, sizeof(kc->wmesg));
|
||||
else
|
||||
bzero(kc->wmesg, sizeof(kc->wmesg));
|
||||
ktr_enqueuerequest(td, req);
|
||||
ktrace_exit(td);
|
||||
}
|
||||
|
@ -142,7 +142,7 @@ _sleep(void *ident, struct lock_object *lock, int priority,
|
||||
p = td->td_proc;
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, wmesg);
|
||||
#endif
|
||||
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
|
||||
"Sleeping on \"%s\"", wmesg);
|
||||
@ -236,7 +236,7 @@ _sleep(void *ident, struct lock_object *lock, int priority,
|
||||
}
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, wmesg);
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
if (lock != NULL && lock != &Giant.lock_object && !(priority & PDROP)) {
|
||||
@ -298,7 +298,7 @@ msleep_spin(void *ident, struct mtx *mtx, const char *wmesg, int timo)
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW)) {
|
||||
sleepq_release(ident);
|
||||
ktrcsw(1, 0);
|
||||
ktrcsw(1, 0, wmesg);
|
||||
sleepq_lock(ident);
|
||||
}
|
||||
#endif
|
||||
@ -316,7 +316,7 @@ msleep_spin(void *ident, struct mtx *mtx, const char *wmesg, int timo)
|
||||
}
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 0);
|
||||
ktrcsw(0, 0, wmesg);
|
||||
#endif
|
||||
PICKUP_GIANT();
|
||||
mtx_lock_spin(mtx);
|
||||
|
@ -219,7 +219,7 @@ ast(struct trapframe *framep)
|
||||
if (flags & TDF_NEEDRESCHED) {
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(1, 1);
|
||||
ktrcsw(1, 1, __func__);
|
||||
#endif
|
||||
thread_lock(td);
|
||||
sched_prio(td, td->td_user_pri);
|
||||
@ -227,7 +227,7 @@ ast(struct trapframe *framep)
|
||||
thread_unlock(td);
|
||||
#ifdef KTRACE
|
||||
if (KTRPOINT(td, KTR_CSW))
|
||||
ktrcsw(0, 1);
|
||||
ktrcsw(0, 1, __func__);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -135,9 +135,15 @@ struct ktr_psig {
|
||||
* KTR_CSW - trace context switches
|
||||
*/
|
||||
#define KTR_CSW 6
|
||||
struct ktr_csw_old {
|
||||
int out; /* 1 if switch out, 0 if switch in */
|
||||
int user; /* 1 if usermode (ivcsw), 0 if kernel (vcsw) */
|
||||
};
|
||||
|
||||
struct ktr_csw {
|
||||
int out; /* 1 if switch out, 0 if switch in */
|
||||
int user; /* 1 if usermode (ivcsw), 0 if kernel (vcsw) */
|
||||
char wmesg[8];
|
||||
};
|
||||
|
||||
/*
|
||||
@ -244,7 +250,7 @@ struct ktr_faultend {
|
||||
|
||||
#ifdef _KERNEL
|
||||
void ktrnamei(char *);
|
||||
void ktrcsw(int, int);
|
||||
void ktrcsw(int, int, const char *);
|
||||
void ktrpsig(int, sig_t, sigset_t *, int);
|
||||
void ktrfault(vm_offset_t, int);
|
||||
void ktrfaultend(int);
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)kdump.1 8.1 (Berkeley) 6/6/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd April 5, 2012
|
||||
.Dd April 20, 2012
|
||||
.Dt KDUMP 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -167,7 +167,7 @@ The possible operations are:
|
||||
.It Li NAMI Ta file name lookup Ta path to file
|
||||
.It Li GIO Ta general I/O Ta fd, read/write, number of bytes
|
||||
.It Li PSIG Ta signal Ta signal name, handler, mask, code
|
||||
.It Li CSW Ta context switch Ta stop/resume user/kernel
|
||||
.It Li CSW Ta context switch Ta stop/resume user/kernel wmesg
|
||||
.It Li USER Ta data from user process Ta the data
|
||||
.It Li STRU Ta various syscalls Ta structure
|
||||
.It Li SCTL Ta Xr sysctl 3 requests Ta MIB name
|
||||
|
@ -95,6 +95,7 @@ void visdump(char *, int, int);
|
||||
void ktrgenio(struct ktr_genio *, int);
|
||||
void ktrpsig(struct ktr_psig *);
|
||||
void ktrcsw(struct ktr_csw *);
|
||||
void ktrcsw_old(struct ktr_csw_old *);
|
||||
void ktruser_malloc(unsigned char *);
|
||||
void ktruser_rtld(int, unsigned char *);
|
||||
void ktruser(int, unsigned char *);
|
||||
@ -298,6 +299,9 @@ main(int argc, char *argv[])
|
||||
ktrpsig((struct ktr_psig *)m);
|
||||
break;
|
||||
case KTR_CSW:
|
||||
if (ktrlen == sizeof(struct ktr_csw_old))
|
||||
ktrcsw_old((struct ktr_csw_old *)m);
|
||||
else
|
||||
ktrcsw((struct ktr_csw *)m);
|
||||
break;
|
||||
case KTR_USER:
|
||||
@ -1245,12 +1249,19 @@ ktrpsig(struct ktr_psig *psig)
|
||||
}
|
||||
|
||||
void
|
||||
ktrcsw(struct ktr_csw *cs)
|
||||
ktrcsw_old(struct ktr_csw_old *cs)
|
||||
{
|
||||
printf("%s %s\n", cs->out ? "stop" : "resume",
|
||||
cs->user ? "user" : "kernel");
|
||||
}
|
||||
|
||||
void
|
||||
ktrcsw(struct ktr_csw *cs)
|
||||
{
|
||||
printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
|
||||
cs->user ? "user" : "kernel", cs->wmesg);
|
||||
}
|
||||
|
||||
#define UTRACE_DLOPEN_START 1
|
||||
#define UTRACE_DLOPEN_STOP 2
|
||||
#define UTRACE_DLCLOSE_START 3
|
||||
|
Loading…
x
Reference in New Issue
Block a user