git: fb886a18a0eb - stable/13 - kdb: Handle process enumeration before procinit()

Mitchell Horne mhorne at FreeBSD.org
Mon Aug 30 16:00:56 UTC 2021


The branch stable/13 has been updated by mhorne:

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

commit fb886a18a0ebfc12d1efa7ba3f89c14d3bdf21ae
Author:     Mitchell Horne <mhorne at FreeBSD.org>
AuthorDate: 2021-08-11 17:40:01 +0000
Commit:     Mitchell Horne <mhorne at FreeBSD.org>
CommitDate: 2021-08-30 15:55:40 +0000

    kdb: Handle process enumeration before procinit()
    
    Make kdb_thr_first() and kdb_thr_next() return sane values if the
    allproc list and pidhashtbl haven't been initialized yet. This can
    happen if the debugger is entered very early on, for example with the
    '-d' boot flag.
    
    This allows remote gdb to attach at such a time, and fixes some ddb
    commands like 'show threads'.
    
    Be explicit about the static initialization of these variables. This
    part has no functional change.
    
    Reviewed by:    markj, imp (previous version)
    MFC after:      3 days
    Differential Revision:  https://reviews.freebsd.org/D31495
    
    (cherry picked from commit 4ccaa87f695c8b9eb31f2ba9ce4913a045755fe0)
---
 sys/kern/kern_proc.c | 5 ++---
 sys/kern/subr_kdb.c  | 6 ++++++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 2017f824f6ad..2649d1d3a58f 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -122,13 +122,13 @@ static void pargs_free(struct pargs *pa);
 /*
  * Other process lists
  */
-struct pidhashhead *pidhashtbl;
+struct pidhashhead *pidhashtbl = NULL;
 struct sx *pidhashtbl_lock;
 u_long pidhash;
 u_long pidhashlock;
 struct pgrphashhead *pgrphashtbl;
 u_long pgrphash;
-struct proclist allproc;
+struct proclist allproc = LIST_HEAD_INITIALIZER(allproc);
 struct sx __exclusive_cache_line allproc_lock;
 struct sx __exclusive_cache_line proctree_lock;
 struct mtx __exclusive_cache_line ppeers_lock;
@@ -185,7 +185,6 @@ procinit(void)
 	sx_init(&proctree_lock, "proctree");
 	mtx_init(&ppeers_lock, "p_peers", NULL, MTX_DEF);
 	mtx_init(&procid_lock, "procid", NULL, MTX_DEF);
-	LIST_INIT(&allproc);
 	pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash);
 	pidhashlock = (pidhash + 1) / 64;
 	if (pidhashlock > 0)
diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c
index 1fabb4044eb1..4f439ff103d7 100644
--- a/sys/kern/subr_kdb.c
+++ b/sys/kern/subr_kdb.c
@@ -608,6 +608,10 @@ kdb_thr_first(void)
 	struct thread *thr;
 	u_int i;
 
+	/* This function may be called early. */
+	if (pidhashtbl == NULL)
+		return (&thread0);
+
 	for (i = 0; i <= pidhash; i++) {
 		LIST_FOREACH(p, &pidhashtbl[i], p_hash) {
 			thr = FIRST_THREAD_IN_PROC(p);
@@ -651,6 +655,8 @@ kdb_thr_next(struct thread *thr)
 	thr = TAILQ_NEXT(thr, td_plist);
 	if (thr != NULL)
 		return (thr);
+	if (pidhashtbl == NULL)
+		return (NULL);
 	hash = p->p_pid & pidhash;
 	for (;;) {
 		p = LIST_NEXT(p, p_hash);


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