svn commit: r233925 - in head: sys/kern sys/sys sys/vm usr.bin/kdump usr.bin/ktrace

Andrey Zonov andrey at zonov.org
Thu Apr 12 06:32:46 UTC 2012


On 11.04.2012 20:02, John Baldwin wrote:
> On Tuesday, April 10, 2012 3:47:23 pm Andrey Zonov wrote:
>> On 05.04.2012 21:13, John Baldwin wrote:
>>> Author: jhb
>>> Date: Thu Apr  5 17:13:14 2012
>>> New Revision: 233925
>>> URL: http://svn.freebsd.org/changeset/base/233925
>>>
>>> Log:
>>>     Add new ktrace records for the start and end of VM faults.  This gives
>>>     a pair of records similar to syscall entry and return that a user can
>>>     use to determine how long page faults take.  The new ktrace records are
>>>     enabled via the 'p' trace type, and are enabled in the default set of
>>>     trace points.
>>>
>>>     Reviewed by:	kib
>>>     MFC after:	2 weeks
>>>
>>
>> Hi John,
>>
>> Thanks a lot, this change is very useful!
>>
>> And while you are here I would like to show you a patch which adds a
>> "wmesg" to the context switch tracing.  It is not finished, it's just a
>> concept.  Please review it and if you are interesting in that I'll
>> finish it and will test more widely.
>
> Ah, this looks fairly neat.  However, I think you will need a few changes:
>
> 1) You will want to make kdump handle either the old or new size of struct
> ktr_csw.  (The size of the record is in the header, so as long as you have
> a 'struct ktr_csw_old' you can handle this fairly easily.)
>

It's a good suggestion.  I've implemented that and tested.

> 2) cs->wmesg is never NULL.  Instead, it should probably just always print it
> out.
>

Agree.

> 3) condvar's have a valid wmesg.
>

Yes, I found it in 5 minutes after sending mail.

Please look at updated patch.

-- 
Andrey Zonov
-------------- next part --------------
Index: usr.bin/kdump/kdump.c
===================================================================
--- usr.bin/kdump/kdump.c	(revision 233925)
+++ usr.bin/kdump/kdump.c	(working copy)
@@ -94,7 +94,7 @@
 void visdump(char *, int, int);
 void ktrgenio(struct ktr_genio *, int);
 void ktrpsig(struct ktr_psig *);
-void ktrcsw(struct ktr_csw *);
+void ktrcsw(struct ktr_csw *, int);
 void ktruser_malloc(unsigned char *);
 void ktruser_rtld(int, unsigned char *);
 void ktruser(int, unsigned char *);
@@ -298,7 +298,7 @@
 			ktrpsig((struct ktr_psig *)m);
 			break;
 		case KTR_CSW:
-			ktrcsw((struct ktr_csw *)m);
+			ktrcsw((struct ktr_csw *)m, ktrlen);
 			break;
 		case KTR_USER:
 			ktruser(ktrlen, m);
@@ -1245,10 +1245,16 @@
 }
 
 void
-ktrcsw(struct ktr_csw *cs)
+ktrcsw(struct ktr_csw *cs, int len)
 {
-	printf("%s %s\n", cs->out ? "stop" : "resume",
-		cs->user ? "user" : "kernel");
+	if (len == sizeof(struct ktr_csw_old)) 
+		printf("%s %s\n", cs->out ? "stop" : "resume",
+			cs->user ? "user" : "kernel");
+	else if (len == sizeof(struct ktr_csw))
+		printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
+			cs->user ? "user" : "kernel", cs->wmesg);
+	else
+		errx(1, "Unknown size of ktrace record");
 }
 
 #define	UTRACE_DLOPEN_START		1
Index: sys/sys/ktrace.h
===================================================================
--- sys/sys/ktrace.h	(revision 233925)
+++ sys/sys/ktrace.h	(working copy)
@@ -135,9 +135,15 @@
  * 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 @@
 
 #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);
Index: sys/kern/kern_ktrace.c
===================================================================
--- sys/kern/kern_ktrace.c	(revision 233925)
+++ sys/kern/kern_ktrace.c	(working copy)
@@ -733,8 +733,9 @@
 }
 
 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 @@
 	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);
 }
Index: sys/kern/subr_trap.c
===================================================================
--- sys/kern/subr_trap.c	(revision 233925)
+++ sys/kern/subr_trap.c	(working copy)
@@ -219,7 +219,7 @@
 	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 @@
 		thread_unlock(td);
 #ifdef KTRACE
 		if (KTRPOINT(td, KTR_CSW))
-			ktrcsw(0, 1);
+			ktrcsw(0, 1, __func__);
 #endif
 	}
 
Index: sys/kern/kern_condvar.c
===================================================================
--- sys/kern/kern_condvar.c	(revision 233925)
+++ sys/kern/kern_condvar.c	(working copy)
@@ -103,7 +103,7 @@
 	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 @@
 
 #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 @@
 	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 @@
 
 #ifdef KTRACE
 	if (KTRPOINT(td, KTR_CSW))
-		ktrcsw(0, 0);
+		ktrcsw(0, 0, cv_wmesg(cvp));
 #endif
 	PICKUP_GIANT();
 }
@@ -220,7 +220,7 @@
 	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 @@
 
 #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 @@
 	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 @@
 
 #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 @@
 	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 @@
 
 #ifdef KTRACE
 	if (KTRPOINT(td, KTR_CSW))
-		ktrcsw(0, 0);
+		ktrcsw(0, 0, cv_wmesg(cvp));
 #endif
 	PICKUP_GIANT();
 	if (lock != &Giant.lock_object) {
Index: sys/kern/kern_synch.c
===================================================================
--- sys/kern/kern_synch.c	(revision 233925)
+++ sys/kern/kern_synch.c	(working copy)
@@ -142,7 +142,7 @@
 	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 @@
 	}
 #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 @@
 #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 @@
 	}
 #ifdef KTRACE
 	if (KTRPOINT(td, KTR_CSW))
-		ktrcsw(0, 0);
+		ktrcsw(0, 0, wmesg);
 #endif
 	PICKUP_GIANT();
 	mtx_lock_spin(mtx);


More information about the svn-src-head mailing list