git: 4ccaa87f695c - main - kdb: Handle process enumeration before procinit()
Mitchell Horne
mhorne at FreeBSD.org
Wed Aug 11 17:45:04 UTC 2021
The branch main has been updated by mhorne:
URL: https://cgit.FreeBSD.org/src/commit/?id=4ccaa87f695c8b9eb31f2ba9ce4913a045755fe0
commit 4ccaa87f695c8b9eb31f2ba9ce4913a045755fe0
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-11 17:44:22 +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
---
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