Date: Fri, 1 Jan 2021 00:03:59 GMT From: John Baldwin <jhb@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 9acce1c99299 - main - Enumerate processes via the pid hash table in kdb_thr_*(). Message-ID: <202101010003.10103xBn093764@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=9acce1c99299b5b59998e2d0c461bcf01d959374 commit 9acce1c99299b5b59998e2d0c461bcf01d959374 Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2021-01-01 00:00:54 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2021-01-01 00:00:54 +0000 Enumerate processes via the pid hash table in kdb_thr_*(). Processes part way through exit1() are not included in allproc. Using allproc to enumerate processes prevented getting the stack trace of a thread in this part of exit1() via ddb. Reviewed by: kib Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D27826 --- sys/kern/subr_kdb.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c index 4fa35064cb54..04b9b5a838df 100644 --- a/sys/kern/subr_kdb.c +++ b/sys/kern/subr_kdb.c @@ -586,12 +586,15 @@ kdb_thr_first(void) { struct proc *p; struct thread *thr; - - FOREACH_PROC_IN_SYSTEM(p) { - if (p->p_flag & P_INMEM) { - thr = FIRST_THREAD_IN_PROC(p); - if (thr != NULL) - return (thr); + u_int i; + + 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); + } } } return (NULL); @@ -602,7 +605,7 @@ kdb_thr_from_pid(pid_t pid) { struct proc *p; - FOREACH_PROC_IN_SYSTEM(p) { + LIST_FOREACH(p, PIDHASH(pid), p_hash) { if (p->p_flag & P_INMEM && p->p_pid == pid) return (FIRST_THREAD_IN_PROC(p)); } @@ -624,17 +627,23 @@ struct thread * kdb_thr_next(struct thread *thr) { struct proc *p; + u_int hash; p = thr->td_proc; thr = TAILQ_NEXT(thr, td_plist); - do { - if (thr != NULL) - return (thr); - p = LIST_NEXT(p, p_list); - if (p != NULL && (p->p_flag & P_INMEM)) - thr = FIRST_THREAD_IN_PROC(p); - } while (p != NULL); - return (NULL); + if (thr != NULL) + return (thr); + hash = p->p_pid & pidhash; + for (;;) { + p = LIST_NEXT(p, p_hash); + while (p == NULL) { + if (++hash > pidhash) + return (NULL); + p = LIST_FIRST(&pidhashtbl[hash]); + } + if (p->p_flag & P_INMEM) + return (FIRST_THREAD_IN_PROC(p)); + } } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101010003.10103xBn093764>