svn commit: r367543 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Tue Nov 10 01:57:20 UTC 2020
Author: mjg
Date: Tue Nov 10 01:57:19 2020
New Revision: 367543
URL: https://svnweb.freebsd.org/changeset/base/367543
Log:
thread: use tdfind in sysctl_kern_proc_kstack
This treads linear scans for locked lookup, but more importantly removes
the only consumer of thread_find.
Modified:
head/sys/kern/kern_proc.c
Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c Tue Nov 10 01:31:06 2020 (r367542)
+++ head/sys/kern/kern_proc.c Tue Nov 10 01:57:19 2020 (r367543)
@@ -2748,6 +2748,7 @@ sysctl_kern_proc_kstack(SYSCTL_HANDLER_ARGS)
struct stack *st;
struct sbuf sb;
struct proc *p;
+ bool locked;
name = (int *)arg1;
error = pget((pid_t)name[0], PGET_NOTINEXEC | PGET_WANTREAD, &p);
@@ -2787,12 +2788,15 @@ sysctl_kern_proc_kstack(SYSCTL_HANDLER_ARGS)
lwpidarray[i] = td->td_tid;
i++;
}
+ PROC_UNLOCK(p);
+ locked = false;
numthreads = i;
for (i = 0; i < numthreads; i++) {
- td = thread_find(p, lwpidarray[i]);
+ td = tdfind(lwpidarray[i], p->p_pid);
if (td == NULL) {
continue;
}
+ locked = true;
bzero(kkstp, sizeof(*kkstp));
(void)sbuf_new(&sb, kkstp->kkst_trace,
sizeof(kkstp->kkst_trace), SBUF_FIXEDLEN);
@@ -2806,14 +2810,16 @@ sysctl_kern_proc_kstack(SYSCTL_HANDLER_ARGS)
kkstp->kkst_state = KKST_STATE_RUNNING;
thread_unlock(td);
PROC_UNLOCK(p);
+ locked = false;
stack_sbuf_print(&sb, st);
sbuf_finish(&sb);
sbuf_delete(&sb);
error = SYSCTL_OUT(req, kkstp, sizeof(*kkstp));
- PROC_LOCK(p);
if (error)
break;
}
+ if (!locked)
+ PROC_LOCK(p);
_PRELE(p);
PROC_UNLOCK(p);
if (lwpidarray != NULL)
More information about the svn-src-head
mailing list