diff options
-rw-r--r-- | sys/kern/kern_ktrace.c | 7 | ||||
-rw-r--r-- | sys/sys/ktrace.h | 7 |
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; |