34 #include <sys/cdefs.h>
37 #include "opt_ktrace.h"
39 #include <sys/param.h>
40 #include <sys/systm.h>
41 #include <sys/fcntl.h>
42 #include <sys/kernel.h>
43 #include <sys/kthread.h>
45 #include <sys/mutex.h>
46 #include <sys/malloc.h>
47 #include <sys/mount.h>
48 #include <sys/namei.h>
51 #include <sys/unistd.h>
52 #include <sys/vnode.h>
53 #include <sys/socket.h>
55 #include <sys/ktrace.h>
57 #include <sys/sysctl.h>
58 #include <sys/sysent.h>
59 #include <sys/syslog.h>
60 #include <sys/sysproto.h>
62 #include <security/mac/mac_framework.h>
87 FEATURE(ktrace,
"Kernel support for system-call tracing");
89 #ifndef KTRACE_REQUEST_POOL
90 #define KTRACE_REQUEST_POOL 100
94 struct ktr_header ktr_header;
97 struct ktr_proc_ctor ktr_proc_ctor;
98 struct ktr_syscall ktr_syscall;
99 struct ktr_sysret ktr_sysret;
100 struct ktr_genio ktr_genio;
101 struct ktr_psig ktr_psig;
102 struct ktr_csw ktr_csw;
103 struct ktr_fault ktr_fault;
104 struct ktr_faultend ktr_faultend;
106 STAILQ_ENTRY(ktr_request) ktr_list;
109 static
int data_lengths[] = {
111 offsetof(
struct ktr_syscall, ktr_args),
112 sizeof(
struct ktr_sysret),
114 sizeof(struct ktr_genio),
115 sizeof(struct ktr_psig),
116 sizeof(struct ktr_csw),
120 sizeof(struct ktr_proc_ctor),
123 sizeof(struct ktr_fault),
124 sizeof(struct ktr_faultend),
129 static
SYSCTL_NODE(_kern, OID_AUTO, ktrace, CTLFLAG_RD, 0, "KTRACE options");
131 static u_int ktr_requestpool = KTRACE_REQUEST_POOL;
132 TUNABLE_INT("kern.ktrace.request_pool", &ktr_requestpool);
134 static u_int ktr_geniosize = PAGE_SIZE;
135 TUNABLE_INT("kern.ktrace.genio_size", &ktr_geniosize);
136 SYSCTL_UINT(_kern_ktrace, OID_AUTO, genio_size, CTLFLAG_RW, &ktr_geniosize,
137 0, "Maximum size of genio event payload");
139 static
int print_message = 1;
140 static struct mtx ktrace_mtx;
141 static struct sx ktrace_sx;
143 static
void ktrace_init(
void *
dummy);
144 static
int sysctl_kern_ktrace_request_pool(SYSCTL_HANDLER_ARGS);
145 static u_int ktrace_resize_pool(u_int oldsize, u_int newsize);
146 static struct ktr_request *ktr_getrequest_entered(struct thread *td,
int type);
147 static struct ktr_request *ktr_getrequest(
int type);
148 static
void ktr_submitrequest(struct thread *td, struct ktr_request *req);
149 static
void ktr_freeproc(struct proc *p, struct ucred **uc,
151 static
void ktr_freerequest(struct ktr_request *req);
152 static
void ktr_freerequest_locked(struct ktr_request *req);
153 static
void ktr_writerequest(struct thread *td, struct ktr_request *req);
154 static
int ktrcanset(struct thread *,struct proc *);
155 static
int ktrsetchildren(struct thread *,struct proc *,
int,
int,struct vnode *);
156 static
int ktrops(struct thread *,struct proc *,
int,
int,struct vnode *);
157 static
void ktrprocctor_entered(struct thread *, struct proc *);
166 ktrace_enter(struct thread *td)
169 KASSERT(!(td->td_pflags & TDP_INKTRACE), (
"ktrace_enter: flag set"));
170 td->td_pflags |= TDP_INKTRACE;
174 ktrace_exit(
struct thread *td)
177 KASSERT(td->td_pflags & TDP_INKTRACE, (
"ktrace_exit: flag not set"));
178 td->td_pflags &= ~TDP_INKTRACE;
182 ktrace_assert(
struct thread *td)
185 KASSERT(td->td_pflags & TDP_INKTRACE, (
"ktrace_assert: flag not set"));
189 ktrace_init(
void *dummy)
191 struct ktr_request *req;
194 mtx_init(&ktrace_mtx,
"ktrace", NULL, MTX_DEF | MTX_QUIET);
195 sx_init(&ktrace_sx,
"ktrace_sx");
196 STAILQ_INIT(&ktr_free);
197 for (i = 0; i < ktr_requestpool; i++) {
198 req =
malloc(
sizeof(
struct ktr_request), M_KTRACE, M_WAITOK);
199 STAILQ_INSERT_HEAD(&ktr_free, req, ktr_list);
202 SYSINIT(ktrace_init, SI_SUB_KTRACE, SI_ORDER_ANY, ktrace_init, NULL);
205 sysctl_kern_ktrace_request_pool(SYSCTL_HANDLER_ARGS)
208 u_int newsize, oldsize, wantsize;
213 oldsize = ktr_requestpool;
214 return (SYSCTL_OUT(req, &oldsize,
sizeof(u_int)));
217 error = SYSCTL_IN(req, &wantsize,
sizeof(u_int));
222 oldsize = ktr_requestpool;
223 newsize = ktrace_resize_pool(oldsize, wantsize);
225 error = SYSCTL_OUT(req, &oldsize,
sizeof(u_int));
228 if (wantsize > oldsize && newsize < wantsize)
232 SYSCTL_PROC(_kern_ktrace, OID_AUTO, request_pool, CTLTYPE_UINT|CTLFLAG_RW,
233 &ktr_requestpool, 0, sysctl_kern_ktrace_request_pool,
"IU",
234 "Pool buffer size for ktrace(1)");
237 ktrace_resize_pool(u_int oldsize, u_int newsize)
240 struct ktr_request *req;
244 bound = newsize - oldsize;
246 return (ktr_requestpool);
248 mtx_lock(&ktrace_mtx);
250 while (bound++ < 0) {
251 req = STAILQ_FIRST(&ktr_free);
254 STAILQ_REMOVE_HEAD(&ktr_free, ktr_list);
260 STAILQ_INIT(&ktr_new);
261 while (bound-- > 0) {
262 req =
malloc(
sizeof(
struct ktr_request), M_KTRACE,
264 STAILQ_INSERT_HEAD(&ktr_new, req, ktr_list);
266 mtx_lock(&ktrace_mtx);
267 STAILQ_CONCAT(&ktr_free, &ktr_new);
268 ktr_requestpool += (newsize - oldsize);
270 mtx_unlock(&ktrace_mtx);
271 return (ktr_requestpool);
275 CTASSERT(
sizeof(((
struct ktr_header *)NULL)->ktr_comm) ==
276 (
sizeof((
struct thread *)NULL)->td_name));
278 static struct ktr_request *
279 ktr_getrequest_entered(
struct thread *td,
int type)
281 struct ktr_request *req;
282 struct proc *p = td->td_proc;
285 mtx_lock(&ktrace_mtx);
286 if (!KTRCHECK(td, type)) {
287 mtx_unlock(&ktrace_mtx);
290 req = STAILQ_FIRST(&ktr_free);
292 STAILQ_REMOVE_HEAD(&ktr_free, ktr_list);
293 req->ktr_header.ktr_type =
type;
294 if (p->p_traceflag & KTRFAC_DROP) {
295 req->ktr_header.ktr_type |= KTR_DROP;
296 p->p_traceflag &= ~KTRFAC_DROP;
298 mtx_unlock(&ktrace_mtx);
300 req->ktr_header.ktr_pid = p->p_pid;
301 req->ktr_header.ktr_tid = td->td_tid;
302 bcopy(td->td_name, req->ktr_header.ktr_comm,
303 sizeof(req->ktr_header.ktr_comm));
304 req->ktr_buffer = NULL;
305 req->ktr_header.ktr_len = 0;
307 p->p_traceflag |= KTRFAC_DROP;
310 mtx_unlock(&ktrace_mtx);
312 printf(
"Out of ktrace request objects.\n");
317 static struct ktr_request *
318 ktr_getrequest(
int type)
320 struct thread *td = curthread;
321 struct ktr_request *req;
324 req = ktr_getrequest_entered(td, type);
338 ktr_enqueuerequest(
struct thread *td,
struct ktr_request *req)
341 mtx_lock(&ktrace_mtx);
342 STAILQ_INSERT_TAIL(&td->td_proc->p_ktr, req, ktr_list);
343 mtx_unlock(&ktrace_mtx);
354 ktr_drain(
struct thread *td)
356 struct ktr_request *queued_req;
360 sx_assert(&ktrace_sx, SX_XLOCKED);
362 STAILQ_INIT(&local_queue);
364 if (!STAILQ_EMPTY(&td->td_proc->p_ktr)) {
365 mtx_lock(&ktrace_mtx);
366 STAILQ_CONCAT(&local_queue, &td->td_proc->p_ktr);
367 mtx_unlock(&ktrace_mtx);
369 while ((queued_req = STAILQ_FIRST(&local_queue))) {
370 STAILQ_REMOVE_HEAD(&local_queue, ktr_list);
371 ktr_writerequest(td, queued_req);
372 ktr_freerequest(queued_req);
383 ktr_submitrequest(
struct thread *td,
struct ktr_request *req)
388 sx_xlock(&ktrace_sx);
390 ktr_writerequest(td, req);
391 ktr_freerequest(req);
392 sx_xunlock(&ktrace_sx);
397 ktr_freerequest(
struct ktr_request *req)
400 mtx_lock(&ktrace_mtx);
401 ktr_freerequest_locked(req);
402 mtx_unlock(&ktrace_mtx);
406 ktr_freerequest_locked(
struct ktr_request *req)
409 mtx_assert(&ktrace_mtx, MA_OWNED);
410 if (req->ktr_buffer != NULL)
411 free(req->ktr_buffer, M_KTRACE);
412 STAILQ_INSERT_HEAD(&ktr_free, req, ktr_list);
421 ktr_freeproc(
struct proc *p,
struct ucred **uc,
struct vnode **vp)
423 struct ktr_request *req;
425 PROC_LOCK_ASSERT(p, MA_OWNED);
426 mtx_assert(&ktrace_mtx, MA_OWNED);
427 *uc = p->p_tracecred;
428 p->p_tracecred = NULL;
433 while ((req = STAILQ_FIRST(&p->p_ktr)) != NULL) {
434 STAILQ_REMOVE_HEAD(&p->p_ktr, ktr_list);
435 ktr_freerequest_locked(req);
440 ktrsyscall(code, narg, args)
444 struct ktr_request *req;
445 struct ktr_syscall *ktp;
449 buflen =
sizeof(register_t) * narg;
451 buf =
malloc(buflen, M_KTRACE, M_WAITOK);
452 bcopy(args, buf, buflen);
454 req = ktr_getrequest(KTR_SYSCALL);
460 ktp = &req->ktr_data.ktr_syscall;
461 ktp->ktr_code = code;
462 ktp->ktr_narg = narg;
464 req->ktr_header.ktr_len = buflen;
465 req->ktr_buffer =
buf;
467 ktr_submitrequest(curthread, req);
471 ktrsysret(code, error, retval)
475 struct ktr_request *req;
476 struct ktr_sysret *ktp;
478 req = ktr_getrequest(KTR_SYSRET);
481 ktp = &req->ktr_data.ktr_sysret;
482 ktp->ktr_code = code;
483 ktp->ktr_error = error;
484 ktp->ktr_retval = ((error == 0) ? retval: 0);
485 ktr_submitrequest(curthread, req);
494 ktrprocexec(
struct proc *p,
struct ucred **uc,
struct vnode **vp)
497 PROC_LOCK_ASSERT(p, MA_OWNED);
498 mtx_lock(&ktrace_mtx);
499 ktr_freeproc(p, uc, vp);
500 mtx_unlock(&ktrace_mtx);
508 ktrprocexit(
struct thread *td)
510 struct ktr_request *req;
517 if (p->p_traceflag == 0)
521 req = ktr_getrequest_entered(td, KTR_PROCDTOR);
523 ktr_enqueuerequest(td, req);
524 sx_xlock(&ktrace_sx);
526 sx_xunlock(&ktrace_sx);
528 mtx_lock(&ktrace_mtx);
529 ktr_freeproc(p, &cred, &vp);
530 mtx_unlock(&ktrace_mtx);
533 vfslocked = VFS_LOCK_GIANT(vp->v_mount);
535 VFS_UNLOCK_GIANT(vfslocked);
543 ktrprocctor_entered(
struct thread *td,
struct proc *p)
545 struct ktr_proc_ctor *ktp;
546 struct ktr_request *req;
550 td2 = FIRST_THREAD_IN_PROC(p);
551 req = ktr_getrequest_entered(td2, KTR_PROCCTOR);
554 ktp = &req->ktr_data.ktr_proc_ctor;
555 ktp->sv_flags = p->p_sysent->sv_flags;
556 ktr_enqueuerequest(td2, req);
560 ktrprocctor(
struct proc *p)
562 struct thread *td = curthread;
564 if ((p->p_traceflag & KTRFAC_MASK) == 0)
568 ktrprocctor_entered(td, p);
576 ktrprocfork(
struct proc *p1,
struct proc *p2)
580 mtx_lock(&ktrace_mtx);
581 KASSERT(p2->p_tracevp == NULL, (
"new process has a ktrace vnode"));
582 if (p1->p_traceflag & KTRFAC_INHERIT) {
583 p2->p_traceflag = p1->p_traceflag;
584 if ((p2->p_tracevp = p1->p_tracevp) != NULL) {
586 KASSERT(p1->p_tracecred != NULL,
587 (
"ktrace vnode with no cred"));
588 p2->p_tracecred =
crhold(p1->p_tracecred);
591 mtx_unlock(&ktrace_mtx);
602 ktruserret(
struct thread *td)
606 sx_xlock(&ktrace_sx);
608 sx_xunlock(&ktrace_sx);
616 struct ktr_request *req;
620 namelen = strlen(path);
622 buf =
malloc(namelen, M_KTRACE, M_WAITOK);
623 bcopy(path, buf, namelen);
625 req = ktr_getrequest(KTR_NAMEI);
632 req->ktr_header.ktr_len = namelen;
633 req->ktr_buffer =
buf;
635 ktr_submitrequest(curthread, req);
639 ktrsysctl(
name, namelen)
643 struct ktr_request *req;
644 u_int mib[CTL_MAXNAME + 2];
650 KASSERT(namelen <= CTL_MAXNAME, (
"sysctl MIB too long"));
653 bcopy(name, mib + 2, namelen *
sizeof(*name));
655 mibname =
malloc(mibnamelen, M_KTRACE, M_WAITOK);
656 error =
kernel_sysctl(curthread, mib, namelen + 2, mibname, &mibnamelen,
657 NULL, 0, &mibnamelen, 0);
659 free(mibname, M_KTRACE);
662 req = ktr_getrequest(KTR_SYSCTL);
664 free(mibname, M_KTRACE);
667 req->ktr_header.ktr_len = mibnamelen;
668 req->ktr_buffer = mibname;
669 ktr_submitrequest(curthread, req);
673 ktrgenio(
fd, rw, uio, error)
679 struct ktr_request *req;
680 struct ktr_genio *ktg;
689 uio->uio_rw = UIO_WRITE;
690 datalen = MIN(uio->uio_resid, ktr_geniosize);
691 buf =
malloc(datalen, M_KTRACE, M_WAITOK);
692 error =
uiomove(buf, datalen, uio);
698 req = ktr_getrequest(KTR_GENIO);
703 ktg = &req->ktr_data.ktr_genio;
706 req->ktr_header.ktr_len = datalen;
707 req->ktr_buffer =
buf;
708 ktr_submitrequest(curthread, req);
712 ktrpsig(sig, action,
mask, code)
718 struct thread *td = curthread;
719 struct ktr_request *req;
722 req = ktr_getrequest(KTR_PSIG);
725 kp = &req->ktr_data.ktr_psig;
726 kp->signo = (char)sig;
730 ktr_enqueuerequest(td, req);
735 ktrcsw(out, user, wmesg)
739 struct thread *td = curthread;
740 struct ktr_request *req;
743 req = ktr_getrequest(KTR_CSW);
746 kc = &req->ktr_data.ktr_csw;
750 strlcpy(kc->wmesg, wmesg,
sizeof(kc->wmesg));
752 bzero(kc->wmesg,
sizeof(kc->wmesg));
753 ktr_enqueuerequest(td, req);
758 ktrstruct(name, data, datalen)
763 struct ktr_request *req;
769 buflen = strlen(name) + 1 + datalen;
770 buf =
malloc(buflen, M_KTRACE, M_WAITOK);
772 bcopy(data, buf + strlen(name) + 1, datalen);
773 if ((req = ktr_getrequest(KTR_STRUCT)) == NULL) {
777 req->ktr_buffer =
buf;
778 req->ktr_header.ktr_len = buflen;
779 ktr_submitrequest(curthread, req);
783 ktrfault(vaddr, type)
787 struct thread *td = curthread;
788 struct ktr_request *req;
789 struct ktr_fault *kf;
791 req = ktr_getrequest(KTR_FAULT);
794 kf = &req->ktr_data.ktr_fault;
797 ktr_enqueuerequest(td, req);
805 struct thread *td = curthread;
806 struct ktr_request *req;
807 struct ktr_faultend *kf;
809 req = ktr_getrequest(KTR_FAULTEND);
812 kf = &req->ktr_data.ktr_faultend;
814 ktr_enqueuerequest(td, req);
821 #ifndef _SYS_SYSPROTO_H_
836 register struct vnode *vp = NULL;
837 register struct proc *p;
839 int facs = uap->
facs & ~KTRFAC_ROOT;
840 int ops = KTROP(uap->ops);
841 int descend = uap->ops & KTRFLAG_DESCEND;
843 int flags, error = 0, vfslocked;
850 if (ops != KTROP_CLEARFILE && facs == 0)
854 if (ops != KTROP_CLEAR) {
858 NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_USERSPACE,
860 flags = FREAD | FWRITE | O_NOFOLLOW;
861 error =
vn_open(&nd, &flags, 0, NULL);
866 vfslocked = NDHASGIANT(&nd);
867 NDFREE(&nd, NDF_ONLY_PNBUF);
870 if (vp->v_type != VREG) {
871 (void)
vn_close(vp, FREAD|FWRITE, td->td_ucred, td);
872 VFS_UNLOCK_GIANT(vfslocked);
876 VFS_UNLOCK_GIANT(vfslocked);
881 if (ops == KTROP_CLEARFILE) {
886 FOREACH_PROC_IN_SYSTEM(p) {
888 if (p->p_tracevp == vp) {
889 if (ktrcanset(td, p)) {
890 mtx_lock(&ktrace_mtx);
891 ktr_freeproc(p, &cred, NULL);
892 mtx_unlock(&ktrace_mtx);
901 if (vrele_count > 0) {
902 vfslocked = VFS_LOCK_GIANT(vp->v_mount);
903 while (vrele_count-- > 0)
905 VFS_UNLOCK_GIANT(vfslocked);
929 LIST_FOREACH(p, &pg->pg_members, p_pglist) {
931 if (p->p_state == PRS_NEW ||
938 ret |= ktrsetchildren(td, p, ops, facs, vp);
940 ret |= ktrops(td, p, ops, facs, vp);
963 ret |= ktrsetchildren(td, p, ops, facs, vp);
965 ret |= ktrops(td, p, ops, facs, vp);
972 vfslocked = VFS_LOCK_GIANT(vp->v_mount);
973 (void)
vn_close(vp, FWRITE, td->td_ucred, td);
974 VFS_UNLOCK_GIANT(vfslocked);
987 register struct utrace_args *uap;
991 struct ktr_request *req;
995 if (!KTRPOINT(td, KTR_USER))
997 if (uap->len > KTR_USER_MAXLEN)
999 cp =
malloc(uap->len, M_KTRACE, M_WAITOK);
1000 error = copyin(uap->addr, cp, uap->len);
1005 req = ktr_getrequest(KTR_USER);
1010 req->ktr_buffer = cp;
1011 req->ktr_header.ktr_len = uap->len;
1012 ktr_submitrequest(td, req);
1021 ktrops(td, p, ops, facs, vp)
1027 struct vnode *tracevp = NULL;
1028 struct ucred *tracecred = NULL;
1030 PROC_LOCK_ASSERT(p, MA_OWNED);
1031 if (!ktrcanset(td, p)) {
1035 if (p->p_flag & P_WEXIT) {
1040 mtx_lock(&ktrace_mtx);
1041 if (ops == KTROP_SET) {
1042 if (p->p_tracevp != vp) {
1046 tracevp = p->p_tracevp;
1050 if (p->p_tracecred != td->td_ucred) {
1051 tracecred = p->p_tracecred;
1052 p->p_tracecred =
crhold(td->td_ucred);
1054 p->p_traceflag |= facs;
1056 p->p_traceflag |= KTRFAC_ROOT;
1059 if (((p->p_traceflag &= ~facs) & KTRFAC_MASK) == 0)
1061 ktr_freeproc(p, &tracecred, &tracevp);
1063 mtx_unlock(&ktrace_mtx);
1064 if ((p->p_traceflag & KTRFAC_MASK) != 0)
1065 ktrprocctor_entered(td, p);
1067 if (tracevp != NULL) {
1070 vfslocked = VFS_LOCK_GIANT(tracevp->v_mount);
1072 VFS_UNLOCK_GIANT(vfslocked);
1074 if (tracecred != NULL)
1081 ktrsetchildren(td, top, ops, facs, vp)
1087 register struct proc *p;
1088 register int ret = 0;
1091 PROC_LOCK_ASSERT(p, MA_OWNED);
1094 ret |= ktrops(td, p, ops, facs, vp);
1100 if (!LIST_EMPTY(&p->p_children))
1101 p = LIST_FIRST(&p->p_children);
1105 if (LIST_NEXT(p, p_sibling)) {
1106 p = LIST_NEXT(p, p_sibling);
1117 ktr_writerequest(
struct thread *td,
struct ktr_request *req)
1119 struct ktr_header *kth;
1124 struct iovec aiov[3];
1126 int datalen, buflen, vrele_count;
1127 int error, vfslocked;
1136 mtx_lock(&ktrace_mtx);
1137 vp = td->td_proc->p_tracevp;
1138 cred = td->td_proc->p_tracecred;
1146 KASSERT(cred == NULL, (
"ktr_writerequest: cred != NULL"));
1147 mtx_unlock(&ktrace_mtx);
1151 KASSERT(cred != NULL, (
"ktr_writerequest: cred == NULL"));
1153 mtx_unlock(&ktrace_mtx);
1155 kth = &req->ktr_header;
1156 KASSERT(((u_short)kth->ktr_type & ~KTR_DROP) <
1157 sizeof(data_lengths) /
sizeof(data_lengths[0]),
1158 (
"data_lengths array overflow"));
1159 datalen = data_lengths[(u_short)kth->ktr_type & ~KTR_DROP];
1160 buflen = kth->ktr_len;
1161 auio.uio_iov = &aiov[0];
1162 auio.uio_offset = 0;
1163 auio.uio_segflg = UIO_SYSSPACE;
1164 auio.uio_rw = UIO_WRITE;
1165 aiov[0].iov_base = (caddr_t)kth;
1166 aiov[0].iov_len =
sizeof(
struct ktr_header);
1167 auio.uio_resid =
sizeof(
struct ktr_header);
1168 auio.uio_iovcnt = 1;
1171 aiov[1].iov_base = (caddr_t)&req->ktr_data;
1172 aiov[1].iov_len = datalen;
1173 auio.uio_resid += datalen;
1175 kth->ktr_len += datalen;
1178 KASSERT(req->ktr_buffer != NULL, (
"ktrace: nothing to write"));
1179 aiov[auio.uio_iovcnt].iov_base = req->ktr_buffer;
1180 aiov[auio.uio_iovcnt].iov_len = buflen;
1181 auio.uio_resid += buflen;
1185 vfslocked = VFS_LOCK_GIANT(vp->v_mount);
1187 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
1189 error = mac_vnode_check_write(cred, NOCRED, vp);
1192 error = VOP_WRITE(vp, &auio, IO_UNIT | IO_APPEND, cred);
1198 VFS_UNLOCK_GIANT(vfslocked);
1201 VFS_UNLOCK_GIANT(vfslocked);
1212 log(LOG_NOTICE,
"ktrace write failed, errno %d, tracing stopped\n",
1224 FOREACH_PROC_IN_SYSTEM(p) {
1226 if (p->p_tracevp == vp) {
1227 mtx_lock(&ktrace_mtx);
1228 ktr_freeproc(p, &cred, NULL);
1229 mtx_unlock(&ktrace_mtx);
1240 vfslocked = VFS_LOCK_GIANT(vp->v_mount);
1241 while (vrele_count-- > 0)
1243 VFS_UNLOCK_GIANT(vfslocked);
1254 ktrcanset(td, targetp)
1256 struct proc *targetp;
1259 PROC_LOCK_ASSERT(targetp, MA_OWNED);
1260 if (targetp->p_traceflag & KTRFAC_ROOT &&
TUNABLE_INT("kern.eventtimer.singlemul",&singlemul)
void NDFREE(struct nameidata *ndp, const u_int flags)
static SYSCTL_NODE(_debug, OID_AUTO, cpufreq, CTLFLAG_RD, NULL,"cpufreq debugging")
int p_candebug(struct thread *td, struct proc *p)
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
CTASSERT(MAXSHELLCMDLEN >=MAXINTERP+3)
void vn_finished_write(struct mount *mp)
SYSINIT(placeholder, SI_SUB_DUMMY, SI_ORDER_ANY, NULL, NULL)
int sys_utrace(struct thread *td, struct utrace_args *uap)
SYSCTL_UINT(_kern_eventtimer, OID_AUTO, idletick, CTLFLAG_RW,&idletick, 0,"Run periodic events when idle")
int sys_ktrace(struct thread *td, struct ktrace_args *uap)
static STAILQ_HEAD(cn_device)
int priv_check(struct thread *td, int priv)
struct proc * pfind(pid_t pid)
int kernel_sysctl(struct thread *td, int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen, size_t *retval, int flags)
void crfree(struct ucred *cr)
static MALLOC_DEFINE(M_KTRACE,"KTRACE","KTRACE")
void log(int level, const char *fmt,...)
struct pgrp * pgfind(pid_t pgid)
SYSCTL_PROC(_kern, OID_AUTO, acct_chkfreq, CTLTYPE_INT|CTLFLAG_RW,&acctchkfreq, 0, sysctl_acct_chkfreq,"I","frequency for checking the free space")
struct ucred * crhold(struct ucred *cr)
int uiomove(void *cp, int n, struct uio *uio)
void free(void *addr, struct malloc_type *mtp)
int vn_close(struct vnode *vp, int flags, struct ucred *file_cred, struct thread *td)
int printf(const char *fmt,...)
void mtx_init(struct mtx *m, const char *name, const char *type, int opts)
void vrele(struct vnode *vp)
int vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
void microtime(struct timeval *tvp)
int vn_open(struct nameidata *ndp, int *flagp, int cmode, struct file *fp)
FEATURE(kdtrace_hooks,"Kernel DTrace hooks which are required to load DTrace kernel modules")
int p_cansee(struct thread *td, struct proc *p)