summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_ktrace.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2012-04-05 17:13:14 +0000
committerjhb <jhb@FreeBSD.org>2012-04-05 17:13:14 +0000
commit5829de48d948e74cb77c117659140afff0ee33b3 (patch)
treec9ac7a271fa3242d8c2cd110bfe596a577e6f5f0 /sys/kern/kern_ktrace.c
parent1bdacb70cf554a29338ec17d997277abfc6f57e1 (diff)
downloadFreeBSD-src-5829de48d948e74cb77c117659140afff0ee33b3.zip
FreeBSD-src-5829de48d948e74cb77c117659140afff0ee33b3.tar.gz
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
Diffstat (limited to 'sys/kern/kern_ktrace.c')
-rw-r--r--sys/kern/kern_ktrace.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 2c6e36c..363b8b8 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -101,6 +101,8 @@ struct ktr_request {
struct ktr_genio ktr_genio;
struct ktr_psig ktr_psig;
struct ktr_csw ktr_csw;
+ struct ktr_fault ktr_fault;
+ struct ktr_faultend ktr_faultend;
} ktr_data;
STAILQ_ENTRY(ktr_request) ktr_list;
};
@@ -119,6 +121,8 @@ static int data_lengths[] = {
sizeof(struct ktr_proc_ctor), /* KTR_PROCCTOR */
0, /* KTR_PROCDTOR */
sizeof(struct ktr_cap_fail), /* KTR_CAPFAIL */
+ sizeof(struct ktr_fault), /* KTR_FAULT */
+ sizeof(struct ktr_faultend), /* KTR_FAULTEND */
};
static STAILQ_HEAD(, ktr_request) ktr_free;
@@ -791,6 +795,42 @@ ktrcapfail(type, needed, held)
ktr_enqueuerequest(td, req);
ktrace_exit(td);
}
+
+void
+ktrfault(vaddr, type)
+ vm_offset_t vaddr;
+ int type;
+{
+ struct thread *td = curthread;
+ struct ktr_request *req;
+ struct ktr_fault *kf;
+
+ req = ktr_getrequest(KTR_FAULT);
+ if (req == NULL)
+ return;
+ kf = &req->ktr_data.ktr_fault;
+ kf->vaddr = vaddr;
+ kf->type = type;
+ ktr_enqueuerequest(td, req);
+ ktrace_exit(td);
+}
+
+void
+ktrfaultend(result)
+ int result;
+{
+ struct thread *td = curthread;
+ struct ktr_request *req;
+ struct ktr_faultend *kf;
+
+ req = ktr_getrequest(KTR_FAULTEND);
+ if (req == NULL)
+ return;
+ kf = &req->ktr_data.ktr_faultend;
+ kf->result = result;
+ ktr_enqueuerequest(td, req);
+ ktrace_exit(td);
+}
#endif /* KTRACE */
/* Interface and common routines */
OpenPOWER on IntegriCloud