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