diff options
author | jhb <jhb@FreeBSD.org> | 2002-09-11 20:46:50 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-09-11 20:46:50 +0000 |
commit | e8d44769fd7259fbfa7e52d31ffe8c985f23064a (patch) | |
tree | e10878a277f56aeeec378467d87a9712a3c2e5a5 /sys/kern | |
parent | d140d93f989816bc35019c181afe31d4413069f8 (diff) | |
download | FreeBSD-src-e8d44769fd7259fbfa7e52d31ffe8c985f23064a.zip FreeBSD-src-e8d44769fd7259fbfa7e52d31ffe8c985f23064a.tar.gz |
Change namei and syscall ktrace events to malloc work buffers before
obtaining a ktr_request structure from the free pool so we can avoid
starving other threads of ktr_request structures.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_ktrace.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 71bdd24..3cf3db9 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -330,18 +330,22 @@ ktrsyscall(code, narg, args) struct ktr_request *req; struct ktr_syscall *ktp; size_t buflen; + char *buf = NULL; + buflen = sizeof(register_t) * narg; + if (buflen > 0) { + buf = malloc(buflen, M_KTRACE, M_WAITOK); + bcopy(args, buf, buflen); + } req = ktr_getrequest(KTR_SYSCALL); if (req == NULL) return; ktp = &req->ktr_data.ktr_syscall; ktp->ktr_code = code; ktp->ktr_narg = narg; - buflen = sizeof(register_t) * narg; if (buflen > 0) { - req->ktr_header.ktr_buffer = malloc(buflen, M_KTRACE, M_WAITOK); - bcopy(args, req->ktr_header.ktr_buffer, buflen); req->ktr_header.ktr_len = buflen; + req->ktr_header.ktr_buffer = buf; } ktr_submitrequest(req); } @@ -373,16 +377,19 @@ ktrnamei(path) { struct ktr_request *req; int namelen; + char *buf = NULL; + namelen = strlen(path); + if (namelen > 0) { + buf = malloc(namelen, M_KTRACE, M_WAITOK); + bcopy(path, buf, namelen); + } req = ktr_getrequest(KTR_NAMEI); if (req == NULL) return; - namelen = strlen(path); if (namelen > 0) { req->ktr_header.ktr_len = namelen; - req->ktr_header.ktr_buffer = malloc(namelen, M_KTRACE, - M_WAITOK); - bcopy(path, req->ktr_header.ktr_buffer, namelen); + req->ktr_header.ktr_buffer = buf; } ktr_submitrequest(req); } |