Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/kern/kern_ktrace.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/kern/kern_ktrace.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.142.2.5 retrieving revision 1.143 diff -u -p -r1.142.2.5 -r1.143 --- src/sys/kern/kern_ktrace.c 2010/08/11 22:54:39 1.142.2.5 +++ src/sys/kern/kern_ktrace.c 2008/04/28 20:24:03 1.143 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ktrace.c,v 1.142.2.5 2010/08/11 22:54:39 yamt Exp $ */ +/* $NetBSD: kern_ktrace.c,v 1.143 2008/04/28 20:24:03 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.142.2.5 2010/08/11 22:54:39 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.143 2008/04/28 20:24:03 martin Exp $"); #include #include @@ -80,7 +80,6 @@ __KERNEL_RCSID(0, "$NetBSD: kern_ktrace. #include #include -#include #include /* @@ -177,9 +176,10 @@ int ktd_intrwakdl = KTD_INTRWAKDL; /* di kmutex_t ktrace_lock; int ktrace_on; static TAILQ_HEAD(, ktr_desc) ktdq = TAILQ_HEAD_INITIALIZER(ktdq); -static pool_cache_t kte_cache; -static kauth_listener_t ktrace_listener; +MALLOC_DEFINE(M_KTRACE, "ktrace", "ktrace data buffer"); +POOL_INIT(kte_pool, sizeof(struct ktrace_entry), 0, 0, 0, + "ktepl", &pool_allocator_nointr, IPL_NONE); static void ktd_wakeup(struct ktr_desc *ktd) @@ -239,39 +239,6 @@ ktrexit(lwp_t *l) l->l_pflag &= ~LP_KTRACTIVE; } -static int -ktrace_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie, - void *arg0, void *arg1, void *arg2, void *arg3) -{ - struct proc *p; - int result; - enum kauth_process_req req; - - result = KAUTH_RESULT_DEFER; - p = arg0; - - if (action != KAUTH_PROCESS_KTRACE) - return result; - - req = (enum kauth_process_req)(unsigned long)arg1; - - /* Privileged; secmodel should handle these. */ - if (req == KAUTH_REQ_PROCESS_KTRACE_PERSISTENT) - return result; - - if ((p->p_traceflag & KTRFAC_PERSISTENT) || - (p->p_flag & PK_SUGID)) - return result; - - if (kauth_cred_geteuid(cred) == kauth_cred_getuid(p->p_cred) && - kauth_cred_getuid(cred) == kauth_cred_getsvuid(p->p_cred) && - kauth_cred_getgid(cred) == kauth_cred_getgid(p->p_cred) && - kauth_cred_getgid(cred) == kauth_cred_getsvgid(p->p_cred)) - result = KAUTH_RESULT_ALLOW; - - return result; -} - /* * Initialise the ktrace system. */ @@ -280,11 +247,6 @@ ktrinit(void) { mutex_init(&ktrace_lock, MUTEX_DEFAULT, IPL_NONE); - kte_cache = pool_cache_init(sizeof(struct ktrace_entry), 0, 0, 0, - "ktrace", &pool_allocator_nointr, IPL_NONE, NULL, NULL, NULL); - - ktrace_listener = kauth_listen_scope(KAUTH_SCOPE_PROCESS, - ktrace_listener_cb, NULL); } /* @@ -408,8 +370,8 @@ ktraddentry(lwp_t *l, struct ktrace_entr timersub(&t2, &t1, &t2); if (t2.tv_sec > 0) log(LOG_NOTICE, - "ktrace long wait: %lld.%06ld\n", - (long long)t2.tv_sec, (long)t2.tv_usec); + "ktrace long wait: %ld.%06ld\n", + t2.tv_sec, t2.tv_usec); #endif } while (p->p_tracep == ktd && (ktd->ktd_flags & (KTDF_WAIT | KTDF_DONE)) == KTDF_WAIT); @@ -445,7 +407,7 @@ ktefree(struct ktrace_entry *kte) if (kte->kte_buf != kte->kte_space) kmem_free(kte->kte_buf, kte->kte_bufsz); - pool_cache_put(kte_cache, kte); + pool_put(&kte_pool, kte); } /* @@ -524,16 +486,15 @@ ktealloc(struct ktrace_entry **ktep, voi struct proc *p = l->l_proc; struct ktrace_entry *kte; struct ktr_header *kth; - struct timespec ts; void *buf; if (ktrenter(l)) return EAGAIN; - kte = pool_cache_get(kte_cache, PR_WAITOK); + kte = pool_get(&kte_pool, PR_WAITOK); if (sz > sizeof(kte->kte_space)) { if ((buf = kmem_alloc(sz, KM_SLEEP)) == NULL) { - pool_cache_put(kte_cache, kte); + pool_put(&kte_pool, kte); ktrexit(l); return ENOMEM; } @@ -551,26 +512,18 @@ ktealloc(struct ktrace_entry **ktep, voi memcpy(kth->ktr_comm, p->p_comm, MAXCOMLEN); kth->ktr_version = KTRFAC_VERSION(p->p_traceflag); - nanotime(&ts); - switch (KTRFAC_VERSION(p->p_traceflag)) { - case 0: - /* This is the original format */ - kth->ktr_otv.tv_sec = ts.tv_sec; - kth->ktr_otv.tv_usec = ts.tv_nsec / 1000; - break; - case 1: - kth->ktr_olid = l->l_lid; - kth->ktr_ots.tv_sec = ts.tv_sec; - kth->ktr_ots.tv_nsec = ts.tv_nsec; - break; - case 2: + switch (KTRFAC_VERSION(p->p_traceflag)) { + case 0: + /* This is the original format */ + microtime(&kth->ktr_tv); + break; + case 1: kth->ktr_lid = l->l_lid; - kth->ktr_ts.tv_sec = ts.tv_sec; - kth->ktr_ts.tv_nsec = ts.tv_nsec; - break; - default: - break; - } + nanotime(&kth->ktr_time); + break; + default: + break; + } *ktep = kte; *bufp = buf; @@ -711,7 +664,7 @@ ktr_io(lwp_t *l, int fd, enum uio_rw rw, struct ktrace_entry *kte; struct ktr_genio *ktp; size_t resid = len, cnt, buflen; - char *cp; + void *cp; next: buflen = min(PAGE_SIZE, resid + sizeof(struct ktr_genio)); @@ -731,7 +684,6 @@ ktr_io(lwp_t *l, int fd, enum uio_rw rw, if (copyin(iov->iov_base, cp, cnt) != 0) goto out; kte->kte_kth.ktr_len += cnt; - cp += cnt; buflen -= cnt; resid -= cnt; iov->iov_len -= cnt; @@ -861,13 +813,23 @@ ktr_csw(int out, int user) * from that is difficult to do. */ if (out) { - struct timespec ts; if (ktrenter(l)) return; - nanotime(&l->l_ktrcsw); - l->l_pflag |= LP_KTRCSW; - nanotime(&ts); + switch (KTRFAC_VERSION(p->p_traceflag)) { + case 0: + /* This is the original format */ + microtime(&l->l_ktrcsw.tv); + l->l_pflag |= LP_KTRCSW; + break; + case 1: + nanotime(&l->l_ktrcsw.ts); + l->l_pflag |= LP_KTRCSW; + break; + default: + break; + } + if (user) l->l_pflag |= LP_KTRCSWUSER; else @@ -882,7 +844,6 @@ ktr_csw(int out, int user) * once for exit. */ if ((l->l_pflag & LP_KTRCSW) != 0) { - struct timespec *ts; l->l_pflag &= ~LP_KTRCSW; if (ktealloc(&kte, (void *)&kc, l, KTR_CSW, sizeof(*kc))) @@ -891,22 +852,18 @@ ktr_csw(int out, int user) kc->out = 1; kc->user = ((l->l_pflag & LP_KTRCSWUSER) != 0); - ts = &l->l_ktrcsw; switch (KTRFAC_VERSION(p->p_traceflag)) { case 0: - kte->kte_kth.ktr_otv.tv_sec = ts->tv_sec; - kte->kte_kth.ktr_otv.tv_usec = ts->tv_nsec / 1000; + /* This is the original format */ + memcpy(&kte->kte_kth.ktr_tv, &l->l_ktrcsw.tv, + sizeof(kte->kte_kth.ktr_tv)); + break; + case 1: + memcpy(&kte->kte_kth.ktr_time, &l->l_ktrcsw.ts, + sizeof(kte->kte_kth.ktr_time)); break; - case 1: - kte->kte_kth.ktr_ots.tv_sec = ts->tv_sec; - kte->kte_kth.ktr_ots.tv_nsec = ts->tv_nsec; - break; - case 2: - kte->kte_kth.ktr_ts.tv_sec = ts->tv_sec; - kte->kte_kth.ktr_ts.tv_nsec = ts->tv_nsec; - break; default: - break; + break; } ktraddentry(l, kte, KTA_WAITOK); @@ -1020,44 +977,6 @@ ktr_mool(const void *kaddr, size_t size, } void -ktr_saupcall(struct lwp *l, int type, int nevent, int nint, void *sas, - void *ap, void *ksas) -{ - struct ktrace_entry *kte; - struct ktr_saupcall *ktp; - size_t len, sz; - struct sa_t **sapp; - int i; - - if (!KTRPOINT(l->l_proc, KTR_SAUPCALL)) - return; - - len = sizeof(struct ktr_saupcall); - sz = len + sizeof(struct sa_t) * (nevent + nint + 1); - - if (ktealloc(&kte, (void *)&ktp, l, KTR_SAUPCALL, sz)) - return; - - ktp->ktr_type = type; - ktp->ktr_nevent = nevent; - ktp->ktr_nint = nint; - ktp->ktr_sas = sas; - ktp->ktr_ap = ap; - - /* Copy the sa_t's */ - sapp = (struct sa_t **) ksas; - - for (i = nevent + nint; i >= 0; i--) { - memcpy((char *)ktp + len, *sapp, sizeof(struct sa_t)); - len += sizeof(struct sa_t); - sapp++; - } - - kte->kte_kth.ktr_len = len; - ktraddentry(l, kte, KTA_WAITOK); -} - -void ktr_mib(const int *name, u_int namelen) { struct ktrace_entry *kte; @@ -1188,7 +1107,7 @@ ktrace_common(lwp_t *curl, int ops, int /* * by process group */ - pg = pgrp_find(-pid); + pg = pg_find(-pid, PFIND_LOCKED); if (pg == NULL) error = ESRCH; else { @@ -1206,7 +1125,7 @@ ktrace_common(lwp_t *curl, int ops, int /* * by pid */ - p = proc_find(pid); + p = p_find(pid, PFIND_LOCKED); if (p == NULL) error = ESRCH; else if (descend) @@ -1295,7 +1214,7 @@ sys_ktrace(struct lwp *l, const struct s return (error); } vp = nd.ni_vp; - VOP_UNLOCK(vp); + VOP_UNLOCK(vp, 0); if (vp->v_type != VREG) { vn_close(vp, FREAD|FWRITE, l->l_cred); ktrexit(l); @@ -1347,7 +1266,6 @@ ktrops(lwp_t *curl, struct proc *p, int switch (vers) { case KTRFACv0: case KTRFACv1: - case KTRFACv2: break; default: error = EINVAL; @@ -1434,7 +1352,6 @@ ktrsetchildren(lwp_t *curl, struct proc void ktrwrite(struct ktr_desc *ktd, struct ktrace_entry *kte) { - size_t hlen; struct uio auio; struct iovec aiov[64], *iov; struct ktrace_entry *top = kte; @@ -1449,35 +1366,18 @@ next: auio.uio_iovcnt = 0; UIO_SETUP_SYSSPACE(&auio); do { - struct timespec ts; - lwpid_t lid; kth = &kte->kte_kth; - hlen = sizeof(struct ktr_header); - switch (kth->ktr_version) { - case 0: - ts = kth->ktr_time; - - kth->ktr_otv.tv_sec = ts.tv_sec; - kth->ktr_otv.tv_usec = ts.tv_nsec / 1000; + if (kth->ktr_version == 0) { + /* + * Convert back to the old format fields + */ + TIMESPEC_TO_TIMEVAL(&kth->ktr_tv, &kth->ktr_time); kth->ktr_unused = NULL; - hlen -= sizeof(kth->_v) - - MAX(sizeof(kth->_v._v0), sizeof(kth->_v._v1)); - break; - case 1: - ts = kth->ktr_time; - lid = kth->ktr_lid; - - kth->ktr_ots.tv_sec = ts.tv_sec; - kth->ktr_ots.tv_nsec = ts.tv_nsec; - kth->ktr_olid = lid; - hlen -= sizeof(kth->_v) - - MAX(sizeof(kth->_v._v0), sizeof(kth->_v._v1)); - break; } iov->iov_base = (void *)kth; - iov++->iov_len = hlen; - auio.uio_resid += hlen; + iov++->iov_len = sizeof(struct ktr_header); + auio.uio_resid += sizeof(struct ktr_header); auio.uio_iovcnt++; if (kth->ktr_len > 0) { iov->iov_base = kte->kte_buf; @@ -1573,9 +1473,6 @@ ktrace_thread(void *arg) */ closef(fp); - cv_destroy(&ktd->ktd_sync_cv); - cv_destroy(&ktd->ktd_cv); - callout_stop(&ktd->ktd_wakch); callout_destroy(&ktd->ktd_wakch); kmem_free(ktd, sizeof(*ktd));