summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_ktrace.c7
-rw-r--r--sys/sys/ktrace.h7
2 files changed, 13 insertions, 1 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 8685eb1..a8aa2b9 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -226,6 +226,10 @@ ktr_getrequest(int type)
if (req != NULL) {
STAILQ_REMOVE_HEAD(&ktr_free, ktr_list);
req->ktr_header.ktr_type = type;
+ if (p->p_traceflag & KTRFAC_DROP) {
+ req->ktr_header.ktr_type |= KTR_DROP;
+ p->p_traceflag &= ~KTRFAC_DROP;
+ }
KASSERT(p->p_tracevp != NULL, ("ktrace: no trace vnode"));
KASSERT(p->p_tracecred != NULL, ("ktrace: no trace cred"));
req->ktr_vp = p->p_tracevp;
@@ -238,6 +242,7 @@ ktr_getrequest(int type)
req->ktr_header.ktr_buffer = NULL;
req->ktr_header.ktr_len = 0;
} else {
+ p->p_traceflag |= KTRFAC_DROP;
pm = print_message;
print_message = 0;
mtx_unlock(&ktrace_mtx);
@@ -762,7 +767,7 @@ ktr_writerequest(struct ktr_request *req)
if (vp == NULL)
return;
kth = &req->ktr_header;
- datalen = data_lengths[kth->ktr_type];
+ datalen = data_lengths[(ushort)kth->ktr_type & ~KTR_DROP];
buflen = kth->ktr_len;
cred = req->ktr_cred;
td = curthread;
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index 2970ce0..8fffcaf 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -145,6 +145,12 @@ struct ktr_csw {
#define KTR_USER 7
/*
+ * KTR_DROP - If this bit is set in ktr_type, then at least one event
+ * between the previous record and this record was dropped.
+ */
+#define KTR_DROP 0x8000
+
+/*
* kernel trace points (in p_traceflag)
*/
#define KTRFAC_MASK 0x00ffffff
@@ -160,6 +166,7 @@ struct ktr_csw {
*/
#define KTRFAC_ROOT 0x80000000 /* root set this trace */
#define KTRFAC_INHERIT 0x40000000 /* pass trace flags to children */
+#define KTRFAC_DROP 0x20000000 /* last event was dropped */
#ifdef _KERNEL
extern struct mtx ktrace_mtx;
OpenPOWER on IntegriCloud