git: 825d234144c5 - main - Don't check P_INMEM in kdb_thr_*().

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


The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=825d234144c5006e81c752bda7b9bcc2f822707e

commit 825d234144c5006e81c752bda7b9bcc2f822707e
Author:     John Baldwin <jhb at FreeBSD.org>
AuthorDate: 2021-01-01 00:01:12 +0000
Commit:     John Baldwin <jhb at FreeBSD.org>
CommitDate: 2021-01-01 00:01:12 +0000

    Don't check P_INMEM in kdb_thr_*().
    
    Not all debugger operations that enumerate threads require thread
    stacks to be resident in memory to be useful.  Instead, push P_INMEM
    checks (if needed) into callers.
    
    Reviewed by:    kib
    Sponsored by:   Netflix
    Differential Revision:  https://reviews.freebsd.org/D27827
---
 sys/ddb/db_command.c |  5 ++++-
 sys/ddb/db_thread.c  |  7 +++++--
 sys/kern/subr_kdb.c  | 15 +++++++--------
 3 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index 1a836be335bf..1fa1cd1b7bb9 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -838,7 +838,10 @@ db_stack_trace(db_expr_t tid, bool hastid, db_expr_t count, char *modif)
 	else
 		pid = -1;
 	db_printf("Tracing pid %d tid %ld td %p\n", pid, (long)td->td_tid, td);
-	db_trace_thread(td, count);
+	if (td->td_proc != NULL && (td->td_proc->p_flag & P_INMEM) == 0)
+		db_printf("--- swapped out\n");
+	else
+		db_trace_thread(td, count);
 }
 
 static void
diff --git a/sys/ddb/db_thread.c b/sys/ddb/db_thread.c
index 780301a22106..e7619dc368fe 100644
--- a/sys/ddb/db_thread.c
+++ b/sys/ddb/db_thread.c
@@ -90,8 +90,11 @@ db_show_threads(db_expr_t addr, bool hasaddr, db_expr_t cnt, char *mod)
 		    (void *)thr->td_kstack);
 		prev_jb = kdb_jmpbuf(jb);
 		if (setjmp(jb) == 0) {
-			if (db_trace_thread(thr, 1) != 0)
-				db_printf("***\n");
+			if (thr->td_proc->p_flag & P_INMEM) {
+				if (db_trace_thread(thr, 1) != 0)
+					db_printf("***\n");
+			} else
+				db_printf("*** swapped out\n");
 		}
 		kdb_jmpbuf(prev_jb);
 		thr = kdb_thr_next(thr);
diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c
index 04b9b5a838df..576635e4a8dc 100644
--- a/sys/kern/subr_kdb.c
+++ b/sys/kern/subr_kdb.c
@@ -590,11 +590,9 @@ kdb_thr_first(void)
 
 	for (i = 0; i <= pidhash; i++) {
 		LIST_FOREACH(p, &pidhashtbl[i], p_hash) {
-			if (p->p_flag & P_INMEM) {
-				thr = FIRST_THREAD_IN_PROC(p);
-				if (thr != NULL)
-					return (thr);
-			}
+			thr = FIRST_THREAD_IN_PROC(p);
+			if (thr != NULL)
+				return (thr);
 		}
 	}
 	return (NULL);
@@ -606,7 +604,7 @@ kdb_thr_from_pid(pid_t pid)
 	struct proc *p;
 
 	LIST_FOREACH(p, PIDHASH(pid), p_hash) {
-		if (p->p_flag & P_INMEM && p->p_pid == pid)
+		if (p->p_pid == pid)
 			return (FIRST_THREAD_IN_PROC(p));
 	}
 	return (NULL);
@@ -641,8 +639,9 @@ kdb_thr_next(struct thread *thr)
 				return (NULL);
 			p = LIST_FIRST(&pidhashtbl[hash]);
 		}
-		if (p->p_flag & P_INMEM)
-			return (FIRST_THREAD_IN_PROC(p));
+		thr = FIRST_THREAD_IN_PROC(p);
+		if (thr != NULL)
+			return (thr);
 	}
 }
 


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