Index: sys/kern/kern_ktrace.c =================================================================== --- sys/kern/kern_ktrace.c +++ sys/kern/kern_ktrace.c @@ -321,13 +321,19 @@ req->ktr_header.ktr_type |= KTR_DROP; p->p_traceflag &= ~KTRFAC_DROP; } - mtx_unlock(&ktrace_mtx); - nanotime(&req->ktr_header.ktr_time); - req->ktr_header.ktr_type |= KTR_VERSIONED; + if ((p->p_traceflag & KTRFAC_VERSIONED) != 0) { + mtx_unlock(&ktrace_mtx); + nanotime(&req->ktr_header.ktr_time); + req->ktr_header.ktr_type |= KTR_VERSIONED; + req->ktr_header.ktr_version = KTR_VERSION1; + req->ktr_header.ktr_cpu = PCPU_GET(cpuid); + } else { + mtx_unlock(&ktrace_mtx); + microtime((struct timeval *)&req->ktr_header.ktr_time); + req->ktr_header.ktr_version = KTR_VERSION0; + } req->ktr_header.ktr_pid = p->p_pid; req->ktr_header.ktr_tid = td->td_tid; - req->ktr_header.ktr_cpu = PCPU_GET(cpuid); - req->ktr_header.ktr_version = KTR_VERSION1; bcopy(td->td_name, req->ktr_header.ktr_comm, sizeof(req->ktr_header.ktr_comm)); req->ktr_buffer = NULL; @@ -1214,6 +1220,8 @@ p->p_traceflag |= facs; if (priv_check(td, PRIV_KTRACE) == 0) p->p_traceflag |= KTRFAC_ROOT; + if (p->p_osrel > P_OSREL_KTRACE_VERSIONED) + p->p_traceflag |= KTRFAC_VERSIONED; } else { /* KTROP_CLEAR */ if (((p->p_traceflag &= ~facs) & KTRFAC_MASK) == 0) @@ -1274,6 +1282,7 @@ struct iovec aiov[3]; struct mount *mp; off_t lim; + ssize_t kthsz; int datalen, buflen; int error; @@ -1304,6 +1313,10 @@ mtx_unlock(&ktrace_mtx); kth = &req->ktr_header; + if (kth->ktr_version == KTR_VERSION0) + kthsz = sizeof(struct ktr_header_v0); + else + kthsz = sizeof(struct ktr_header); KASSERT(((u_short)kth->ktr_type & ~KTR_TYPE) < nitems(data_lengths), ("data_lengths array overflow")); datalen = data_lengths[(u_short)kth->ktr_type & ~KTR_TYPE]; @@ -1313,8 +1326,8 @@ auio.uio_segflg = UIO_SYSSPACE; auio.uio_rw = UIO_WRITE; aiov[0].iov_base = (caddr_t)kth; - aiov[0].iov_len = sizeof(struct ktr_header); - auio.uio_resid = sizeof(struct ktr_header); + aiov[0].iov_len = kthsz; + auio.uio_resid = kthsz; auio.uio_iovcnt = 1; auio.uio_td = td; if (datalen != 0) { Index: sys/sys/ktrace.h =================================================================== --- sys/sys/ktrace.h +++ sys/sys/ktrace.h @@ -285,6 +285,10 @@ #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 */ +/* + * Generate versioned trace file, deorbit after stable/13 EOL + */ +#define KTRFAC_VERSIONED 0x10000000 #ifdef _KERNEL struct ktr_io_params; Index: sys/sys/param.h =================================================================== --- sys/sys/param.h +++ sys/sys/param.h @@ -107,6 +107,7 @@ #define P_OSREL_CK_SUPERBLOCK 1300000 #define P_OSREL_CK_INODE 1300005 #define P_OSREL_POWERPC_NEW_AUX_ARGS 1300070 +#define P_OSREL_KTRACE_VERSIONED 1400064 #define P_OSREL_MAJOR(x) ((x) / 100000) #endif