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:
John Baldwin 2012-04-20 15:32:36 +00:00
parent e7babf043f
commit 88bf5036fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=234494
7 changed files with 44 additions and 22 deletions

View File

@ -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) {

View File

@ -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);
}

View File

@ -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);

View File

@ -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
}

View File

@ -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);

View File

@ -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

View File

@ -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,7 +299,10 @@ main(int argc, char *argv[])
ktrpsig((struct ktr_psig *)m);
break;
case KTR_CSW:
ktrcsw((struct ktr_csw *)m);
if (ktrlen == sizeof(struct ktr_csw_old))
ktrcsw_old((struct ktr_csw_old *)m);
else
ktrcsw((struct ktr_csw *)m);
break;
case KTR_USER:
ktruser(ktrlen, m);
@ -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