git: 3e06c7da020f - main - Use kdb_thr_* to iterate over threads consistently in DDB.

John Baldwin jhb at FreeBSD.org
Fri Jan 1 00:03:59 UTC 2021


The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=3e06c7da020fadb8ffbfc26d634ccb321e7e22f7

commit 3e06c7da020fadb8ffbfc26d634ccb321e7e22f7
Author:     John Baldwin <jhb at FreeBSD.org>
AuthorDate: 2021-01-01 00:01:35 +0000
Commit:     John Baldwin <jhb at FreeBSD.org>
CommitDate: 2021-01-01 00:01:35 +0000

    Use kdb_thr_* to iterate over threads consistently in DDB.
    
    The "findstack", "show all trace", and "show active trace" commands
    were iterating over allproc to enumerate threads.  This missed threads
    executing in exit1() after being removed from allproc.
    
    Reviewed by:    kib
    Sponsored by:   Netflix
    Differential Revision:  https://reviews.freebsd.org/D27829
---
 sys/ddb/db_command.c | 37 ++++++++++++++++++-------------------
 sys/ddb/db_ps.c      | 11 ++++-------
 2 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index 1fa1cd1b7bb9..21ff75f78e6a 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -847,32 +847,31 @@ db_stack_trace(db_expr_t tid, bool hastid, db_expr_t count, char *modif)
 static void
 _db_stack_trace_all(bool active_only)
 {
-	struct proc *p;
 	struct thread *td;
 	jmp_buf jb;
 	void *prev_jb;
 
-	FOREACH_PROC_IN_SYSTEM(p) {
+	for (td = kdb_thr_first(); td != NULL; td = kdb_thr_next(td)) {
 		prev_jb = kdb_jmpbuf(jb);
 		if (setjmp(jb) == 0) {
-			FOREACH_THREAD_IN_PROC(p, td) {
-				if (td->td_state == TDS_RUNNING)
-					db_printf("\nTracing command %s pid %d"
-					    " tid %ld td %p (CPU %d)\n",
-					    p->p_comm, p->p_pid,
-					    (long)td->td_tid, td,
-					    td->td_oncpu);
-				else if (active_only)
-					continue;
-				else
-					db_printf("\nTracing command %s pid %d"
-					    " tid %ld td %p\n", p->p_comm,
-					    p->p_pid, (long)td->td_tid, td);
+			if (td->td_state == TDS_RUNNING)
+				db_printf("\nTracing command %s pid %d"
+				    " tid %ld td %p (CPU %d)\n",
+				    td->td_proc->p_comm, td->td_proc->p_pid,
+				    (long)td->td_tid, td, td->td_oncpu);
+			else if (active_only)
+				continue;
+			else
+				db_printf("\nTracing command %s pid %d"
+				    " tid %ld td %p\n", td->td_proc->p_comm,
+				    td->td_proc->p_pid, (long)td->td_tid, td);
+			if (td->td_proc->p_flag & P_INMEM)
 				db_trace_thread(td, -1);
-				if (db_pager_quit) {
-					kdb_jmpbuf(prev_jb);
-					return;
-				}
+			else
+				db_printf("--- swapped out\n");
+			if (db_pager_quit) {
+				kdb_jmpbuf(prev_jb);
+				return;
 			}
 		}
 		kdb_jmpbuf(prev_jb);
diff --git a/sys/ddb/db_ps.c b/sys/ddb/db_ps.c
index da655d11da02..2e5e6332d6e8 100644
--- a/sys/ddb/db_ps.c
+++ b/sys/ddb/db_ps.c
@@ -512,7 +512,6 @@ void
 db_findstack_cmd(db_expr_t addr, bool have_addr, db_expr_t dummy3 __unused,
     char *dummy4 __unused)
 {
-	struct proc *p;
 	struct thread *td;
 	vm_offset_t saddr;
 
@@ -523,12 +522,10 @@ db_findstack_cmd(db_expr_t addr, bool have_addr, db_expr_t dummy3 __unused,
 		return;
 	}
 
-	FOREACH_PROC_IN_SYSTEM(p) {
-		FOREACH_THREAD_IN_PROC(p, td) {
-			if (kstack_contains(td, saddr, 1)) {
-				db_printf("Thread %p\n", td);
-				return;
-			}
+	for (td = kdb_thr_first(); td != NULL; td = kdb_thr_next(td)) {
+		if (kstack_contains(td, saddr, 1)) {
+			db_printf("Thread %p\n", td);
+			return;
 		}
 	}
 }


More information about the dev-commits-src-all mailing list